用sudo iotop -o可实时查看正在等待磁盘io的进程(含d状态),因其只显示有io活动的进程;ps中stat为d即表示进程处于不可中断睡眠态,正等待磁盘或nfs io;结合/proc/pid/io中read_bytes/write_bytes是否增长,可区分健康等待与底层卡死。

怎么用 iotop 实时看哪些进程在等磁盘IO
iotop 是最直接的工具,它像 top 一样动态刷新,但按 IO 使用量排序。默认只显示有 IO 活动的进程,想看到“正在等待 IO”的(即处于 D 状态),得加 -o 或 -a 参数:
• sudo iotop -o:只显示当前有 IO 的进程(含等待中的)
• sudo iotop -a:累计模式,适合观察长期 IO 倾向
注意:没权限会报 Unable to initialize threads library,必须用 sudo;部分容器环境或老内核可能不支持,此时会提示 Kernel does not support process I/O accounting
为什么 ps 的 STAT 列里出现 D 就代表在等 IO
Linux 进程状态码中,D(Uninterruptible Sleep)特指进程因等待不可中断的内核操作(主要是磁盘或 NFS IO)而挂起,无法被信号唤醒。查这类进程用:
• ps -eo pid,comm,state,pcpu,pmem,wchan --sort=-pcpu | grep ' D '
• ps -eo pid,comm,state,etimes --sort=-etimes | head -20(etimes 是上次调度延迟,高值常伴随 D 状态)
注意:D 状态本身不输出 IO 量,只说明“卡住了”,需结合 iotop 或 /proc/PID/io 确认具体读写行为;某些 RAID 卡驱动 bug 也可能导致假 D 状态,不能直接等同于磁盘慢
从 /proc/PID/io 手动确认某进程是否真在等 IO
每个进程的 /proc/<pid>/io</pid> 文件记录了实际 IO 统计,比状态码更可靠。重点看三行:
• read_bytes: 实际从块设备读取的字节数(不是缓存)
• write_bytes: 实际写入块设备的字节数
• cancelled_write_bytes: 被截断的脏页写入量(高值可能说明频繁刷盘失败)
如果一个进程 state 是 D,但 read_bytes 和 write_bytes 长时间无增长,大概率是卡在驱动层或硬件响应上,而非应用层主动读写
iostat 能帮判断是不是整个系统 IO 瓶颈
iostat -x 1 输出里的关键列:
• %util 接近 100% 表示设备忙饱和,但不等于所有进程都在等 —— 可能只是单个大 IO 占满带宽
• await(平均每次 IO 等待毫秒数)持续 > 50ms 通常有问题
• r_await/w_await 分开看读写延迟,若其中一项异常高,再回溯对应进程
注意:iostat 是设备维度,和进程无关;它只能告诉你“IO 慢”,不能告诉你“谁在等”,必须和 iotop 或 ps 配合使用
D 状态+零增量 read_bytes+高 await,这时候问题往往不在应用代码,而在存储栈底层。











