我们的服务器开始变慢,所以我运行了 iostat。
iostat -dx 5
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 89.60 108.40 5.60 880.00 763.20 14.41 2.61 22.87 8.70 99.20
sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
因此,我发现一个磁盘 sda 已完全饱和。我如何找到导致此问题的具体进程?(或者是交换到该磁盘?)
答案1
我也喜欢iotop
答案2
收集可能就是你所追求的。按进程统计的 I/O,除其他事项外。
collectl --top io
打印按 IO 使用情况排序的顶级列表,collectl -sZ
用于 collectl 进程子系统的本机输出。添加--procopts t
开关也会显示线程。
正如 Richard Salts 提到的,如果您有窗口管理器和 Python,那么 IOTop 将为您提供具有更详细 I/O 统计数据的 UI。但无论哪种情况,如果您的内核不支持它(2.6.20
或更晚是安全的选择),那么这两个程序都无法运行。
答案3
知道您使用的是哪个发行版会很好,但这里是:
您可以通过检查“fdisk -l /dev/sda”输出中的“Linux swap / Solaris”来查看交换分区在哪个磁盘上。这将显示该分区上是否有交换。
然后,您可以使用 vmstat 观察交换使用情况,看看您的服务器是否正在进行大量交换。
答案4
一个可能对你有用的选项是,如果磁盘只是在突发情况下变得饱和,请使用 collectl 来获取磁盘和进程统计信息。然后查看数据以了解磁盘何时饱和,并使用“collectl -sZ -p filename”来回放你收集的进程数据,并查看在此期间哪些进程处于运行状态。可能会起作用,也可能不起作用......-mark