it-swarm.cn

Linux-如何查看磁盘正在等待什么IO

我有一台服务器,负载非常大。就CPU使用率而言,没有什么让我感到惊讶的,并且没有交换。

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

是否有任何程序可以告诉我哪些进程正在等待IO?我知道iotop,但这显示了当前正在执行的IO。

还是这是一个愚蠢的问题? (如果是,请说明如何:))

42
Rory

您可以使用iotop之类的I/O监视器,但是它将仅显示具有当前I/O操作的进程或线程。

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

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

ps axu并查找处于“ D”状态的进程。基于 ps(1)联机帮助页 ,处于D状态的进程处于不间断的睡眠状态,这几乎总是意味着“等待IO”。不幸的是,通常无法杀死这些进程。

18
Zanchey

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

当您说服务器处于高负载状态时,这是什么意思?特别是有些东西反应迟钝?

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

例:

[[email protected]: ~] 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
16
Kyle Brandt

启用 block_dump 记录正在执行哪些进程的块读/写操作:

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

完成后,请禁用跟踪,以免垃圾邮件记录文件:

echo 0 > /proc/sys/vm/block_dump
0
Aleksandr Levchuk