iostat因采样平均和无进程关联无法定位秒级io波峰,iotop -o可实时按进程显示瞬时io速率,配合pidstat可捕获极短脉冲。

直接看 iotop -o 实时波峰最准,iostat -xk 1 只能看设备级趋势,无法定位到秒级尖峰源头。
为什么 iostat 看不出具体波峰
iostat 是采样统计工具,每秒输出的是该秒内平均值。哪怕某秒前半段突发写入 200MB、后半段完全空闲,它也只显示约 100MB/s —— 波峰被抹平了。更关键的是它不关联进程,%util 高只说明设备忙,但不知道谁在“猛踩油门”。
-
iostat -xk 1输出的rKB/s/wKB/s是滚动平均,非瞬时值 - 即使加
-p ALL,也只到分区/逻辑卷层级,看不到文件或进程 -
avgqu-sz和await上升是波峰结果,不是波峰本身
iotop -o 才是抓波峰的正确姿势
它每秒刷新一次实时带宽,且默认按当前 IO 速率降序排列,真正活跃的进程会立刻浮到顶部 —— 这就是你要的“波峰”。
- 必须用
sudo iotop -o:-o过滤掉静默进程,只留正在读写的 - 按
P键切换为按DISK WRITE排序,写密集型波峰一目了然 - 按
p键切回 PID 模式(别留在线程 TID 视图,容易漏父进程) - 如果波峰一闪而过,加
-d 0.5改为 0.5 秒刷新:sudo iotop -o -d 0.5
波峰持续时间短时,得配合 pidstat 补漏
iotop 刷新再快也有延迟,极短脉冲(如数据库 checkpoint、日志 flush)可能漏掉。这时用 pidstat 按固定间隔抓累计值,反向锁定:
- 执行
pidstat -d 1 10:每秒采样一次,共 10 次,输出每个进程的累计读写字节数 - 重点看
kB_rd/s和kB_wr/s列,找单次采样中突增 >5 倍均值的条目 - 若发现某进程在第 7 秒突然写 80MB,而前后几秒都
- 注意:
pidstat不显示文件路径,需结合lsof -p PID查它正在写的文件
别忘了确认波峰是否来自缓存抖动
很多“IO 波峰”其实是内核刷脏页(pdflush 或 writeback),并非真实磁盘操作。这类波峰特征明显:
-
iotop显示[jbd2/sda1-8]或[kworker/u*]占高 IO -
iostat的%util高,但await很低( - 用
cat /proc/vmstat | grep pgpg看pgpgin/pgpgout是否同步飙升 - 临时缓解:调大脏页阈值
echo 20 | sudo tee /proc/sys/vm/dirty_ratio
真正的波峰永远发生在进程层,设备统计只是回声。盯住 iotop -o 的实时排序,比盯着 iostat 的数字猜半天更可靠 —— 尤其当波峰只持续 1~2 秒时,采样窗口就是决定性因素。











