pidstat -d 1 是最直接的命令,用于查看进程每秒读写多少 kb;它默认只显示有实际磁盘 io 的进程,rkb/s 和 wkb/s 为瞬时速率(单位 kb/s),非累计或平均值。

pidstat -d 1 是最直接的命令
想看某个进程每秒读写多少 KB,pidstat -d 1 就够了。它默认只显示当前有实际磁盘 IO 的进程,rkB/s 和 wkB/s 两列就是你要的实时读写带宽(单位 KB/s),不是累计值,也不是平均值,是最近一秒的瞬时速率。
常见错误:pidstat -d 不加间隔参数会立刻退出;pidstat -d 0 可能卡死终端;别被输出里混着的 %MEM 或 RSS 干扰——那些和 IO 无关。
- 监控指定进程更稳:用
pgrep -f 'python.*api.py'找 PID,再喂给pidstat -d 2 -p "$(pgrep -f 'python.*api.py')" - 多个 PID 自动支持:
pgrep返回空格分隔的 PID 列表,pidstat -p原生能接收,不用额外拆解 - 验证 PID 是否存活:执行前先
kill -0 $PID 2>/dev/null && echo ok,避免静默跳过无效 PID
iotop -o 比 pidstat 更快定位“谁在动磁盘”
iotop -o 不是看单个进程,而是过滤掉 95% 以上无 IO 的内核线程和空闲服务,只留此刻真正在读写的进程。比如 java、mysqld、rsync 会立刻浮出来,DISK READ 和 DISK WRITE 列非零即有效。
不加 -o 你会被 [kthreadd]、[migration/0] 这类内核线程刷屏,根本找不到真实 IO 源。进到界面后按 o 键也能即时切换,不用退出重跑。
- 单位自动缩放(B/s、K/s、M/s),但数值是最近 1 秒采样周期内的平均吞吐量,对毫秒级突发写入不敏感
- 看到
mysqld写高,先查SHOW ENGINE INNODB STATUS里的 Log sequence number 和 Last checkpoint 差值,确认是不是刷脏页正常行为 - 看到
java进程SWAPIN高且 IO 也高,大概率是内存不足触发 swap,该看free -h和vmstat 1,不是磁盘问题
nethogs 查网络带宽,不是磁盘 IO
很多人混淆“IO”和“网络带宽”,nethogs 显示的是每个进程的 SENT 和 RECEIVED 字节数/秒,对应网卡流量,跟磁盘读写完全无关。它适合查 curl、docker、chrome 这类网络密集型程序,但对 mysql 的日志刷盘、rsync 的本地文件拷贝没反应。
运行 sudo nethogs eth0 时,如果输出全是 127.0.0.1,说明你选错了网卡(比如误用了 lo);如果显示 unknown host,大概率是没加 -n 参数导致 DNS 卡顿。
- 按
s键可切换按发送速率排序,r按接收排序 - 容器内不可用:nethogs 无法穿透 cgroups v2 边界,宿主机上看不到容器内部进程的网络 IO
- 多线程程序(如 Chrome)可能只显示主线程名,实际带宽是所有线程之和
真正容易被忽略的点:IO 高 ≠ 进程有问题
即使 iotop -o 或 pidstat -d 显示某进程 IO 高,它也可能只是“替罪羊”。比如 Web 服务把日志全打到慢速云盘,瓶颈其实是磁盘随机写能力弱,不是进程太贪。这时候光 kill 进程没用。
必须结合 iostat -x 1 看 %util(设备忙时百分比)和 await(I/O 平均等待时间):如果 %util 接近 100% 且 await 持续飙升,说明磁盘本身扛不住;如果 %util 很低但 rkB/s 高,那才是进程真在猛读。











