Linux - 如何查看正在等待磁盘 IO 的内容

Linux - 如何查看正在等待磁盘 IO 的内容

我有一台负载非常高的服务器。CPU 使用率方面没有什么特别突出的地方,也没有交换。

我认为这是因为一些进程正在等待磁盘 IO,我想看看是什么在等待。

有没有程序可以显示哪些进程正在等待 IO?我知道,iotop但是它显示了当前正在进行 IO 的进程。

或者这是一个愚蠢的问题?(如果是的话请解释一下:))

答案1

您可以使用像 iotop 这样的 I/O 监视器,但它只会显示当前具有 I/O 操作的进程或线程。

如果您需要浏览等待 I/O 的进程,请使用 watch 来监视带有 STAT 标志“D”的进程,如下所示:

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"

答案2

Zanchey 的回答是我所知道的最好的,可以找出正在等待 IO 的内容。

你说你的服务器负载过高,这是什么意思?特别是某些东西响应很慢?

如果您想知道您的磁盘 IO 是否是瓶颈,我会使用 iostat 命令(sysstat 包的一部分)来查看磁盘是否确实处于高负载状态。

例子:

[kbrandt@kbrandt-opadmin: ~] iostat -x 1 3                                                                                           

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.38   34.71    2.64    1.18    0.00   59.21 
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.11    17.35    2.21   20.31    46.57   301.40    15.45     2.27  100.66   1.48   3.34
sda1              0.10    17.31    2.21   20.31    46.48   301.10    15.44     2.27  100.66   1.48   3.34
sda2              0.00     0.00    0.00    0.00     0.00     0.00     3.50     0.00   30.00  30.00   0.00
sr0               0.00     0.00    0.00    0.00     0.00     0.00    18.44     0.00  677.67 512.61   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.22    0.00    4.31    0.00    0.00   89.47   
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sr0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

答案3

ps axu并查找处于“D”状态的进程。基于ps(1) 手册页,处于 D 状态的进程处于不可中断的睡眠状态,这几乎总是意味着“等待 IO”。不幸的是,通常无法终止这些进程。

答案4

使能够块转储记录哪些进程正在执行块读/写操作:

echo 1 > /proc/sys/vm/block_dump
tail -f /var/log/syslog

完成后,禁用跟踪,以免向日志文件发送垃圾邮件:

echo 0 > /proc/sys/vm/block_dump

相关内容