根据 strace 的说法, getcwd() 有时需要半秒,这怎么可能?

根据 strace 的说法, getcwd() 有时需要半秒,这怎么可能?

据我了解,它甚至不涉及文件系统。那么造成这种情况的原因是什么,使用strace -T

     0.481441 getcwd("/home/user/web/url.com/public_html", 4096) = some number

我使用的是 Linux 4.9.30。

该系统有一些奇怪的滞后,我想识别它。 cpu、iowait、load、内存,一切似乎都很正常它是一个kvm虚拟机,也许这会改变一些东西。

答案1

提示:sudo perf record -ag如果您安装了内核调试符号,这里可能会给您提供有趣的信息,包括在特定内核函数中花费的时间。

无论如何,

据我了解,它甚至不涉及文件系统。

这是不正确的。getcwd正如linux内核所实现的那样,必须检查您的cwd是否仍然存在,其所在的文件系统是否仍然挂载,并迭代到文件系统的根目录以检查该目录是否仍然可访问。

这可能会产生副作用,并且会因文件系统处于被阻止的状态而延迟。

这里最可能的罪魁祸首是内核中非常频繁的内存回收运行所持有的 RCU 锁。这可能是一个危险的驱动程序问题,但也可能是非常频繁的命名空间创建等问题。

答案2

我们发现这是一个有故障的SSD。这些是有助于识别它的命令:

$ ioping -c 20 /home/jsaak/temp/
min/avg/max/mdev = 1.00 ms / 5.71 ms / 29.3 ms / 7.62 ms
$ fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=32M --readwrite=randrw --rwmixread=75
  read : io=24608KB, bw=3136.8KB/s, iops=784, runt=  7845msec
  write: io=8160.0KB, bw=1040.2KB/s, iops=260, runt=  7845msec

相关内容