现在,在适当的时候,我已经设法解决了这个问题,因此,我至少可以自己对其进行后续工作。
不幸的是,我在内核升级中失去了最初的问题,但是却换了一个新的内核,性能更差,而且很难追踪。我发现的技术如下:
首先,blktrace
/ blkparse
是我发现非常有用的工具。它允许跟踪具有许多有用细节的单个I / O请求的进度,例如提交请求的过程。将输出放在上是有帮助的tmpfs
,这样就不会开始跟踪自身对跟踪存储的处理。
但是,到目前为止,这只是有帮助,所以我编译了具有更多调试功能的内核。特别是,我发现ftrace
它很有帮助,因为它使我能够跟踪内核空间内性能不佳的进程,以查看其作用以及在何处阻塞。编译调试内核也为它提供了有效的WCHAN
输出ps
,至少在更简单的情况下,它可以作为查看内核内部进程正在执行的一种更简便的方法。
我也希望LatencyTop有用,但是我发现它有很多问题,而且不幸的是,它只显示了太“高级”的延迟原因,以至于无法真正有用。
另外,我发现它比iostat
仅以/sys/block/$DEVICE/stat
非常接近的时间间隔简单地查看内容更有用,就像这样:
while :; do cat /sys/block/sda/stat; sleep .1; done
请参阅Documentation/iostats.txt
内核源代码树中的stat
文件格式。以近乎间隔的时间查看它可以让我看到I / O突发的确切时间和大小以及类似信息。
最后,我发现内核升级后出现的问题是由稳定页面引起的,稳定页面是Linux 3.0中引入的功能,在我的情况下,当Berkeley DB在其mmap'ed中弄脏页面时,它会暂停较长时间。区域文件。虽然似乎可以修补此功能,并且它引起的问题可能已在Linux 3.9中解决,但我通过修补Berkeley DB来解决我目前遇到的最严重的问题,以允许我将其区域文件放在另一个目录中(就我而言/dev/shm
),让我完全避免了这个问题。