iowait 高排查步骤

按顺序排查:确认 iowait 与 steal 占比 → 找 IO 进程 → 看设备指标 → 评估内存回收干扰,避免直接归因存储。

排查顺序

iowait 表示 CPU 空闲且系统仍有未完成 IO 的时间比例,它升高说明「有 IO 在等」,但并不能直接证明设备是瓶颈。合理的排查顺序是:先确认 iowait 与 steal 的占比(排除虚拟化抢占造成的假象),再找出产生 IO 的进程,然后看设备侧的延迟与队列,最后评估内存回收与换页是否带来了额外的读放大。

基本信息

工具链mpstat → iotop / pidstat -d → iostat -x → PSI io
辅助证据/proc/vmstat 的 pswpin/pswpout(换页)、pgscan 系列(回收)
误判点虚拟化 steal、swap 换入换出、内存回收导致的读放大
统计口径iowait 只在 CPU 空闲时累计,满负荷计算时会掩盖 IO 等待
容器视角需在宿主侧确认整体压力,容器内多为宿主数据

典型使用场景

  • 应用延迟升高伴随 wa 高,需要判断是存储问题还是内存问题
  • 后台备份或同步任务影响在线业务,定位责任进程
  • 容器内 IO 被邻居挤占,从宿主视角确认整体负载
  • swap 导致的换入换出被误判为磁盘故障
  • 虚拟化环境中识别假性 iowait,避免无效的存储调优

步骤命令

步骤命令
mpstat -P ALL 1 3 | tail -5  # 看各核 %iowait 与 %steal,先排除虚拟化因素
sudo iotop -obn 1 | tail -20  # 按 IO 排序找出最活跃的进程
pidstat -d 1 3  # 每进程的读写速率(kB_rd/s、kB_wr/s)
iostat -dx 1 3  # 设备侧延迟、队列深度与利用率
cat /proc/pressure/io  # IO 停顿比例,判断对业务的实际影响
grep -E 'pswpin|pswpout' /proc/vmstat  # 判断 IO 是否来自换页而非业务读写

现象对照

现象可能原因下一步
wa 高、steal 接近 0业务或后台任务的磁盘 IO用 iotop/pidstat 定位进程并考虑限速
wa 高且 b 列也高较多任务在等 IO查设备延迟与队列深度
wa 高且 pswpout 增长内存不足触发换出转查内存、限额与回收压力
st 明显大于 0虚机被宿主抢占与平台侧确认,而非在本机调存储
wa 高但设备指标正常存储链路或元数据问题检查客户端、网络存储或文件系统层
iowait 只在 CPU 空闲时累计:系统若长期满负荷计算,等待 IO 的时间不会计入 wa,IO 压力会被掩盖。这种情况下应结合 PSI io 与设备侧指标判断。
单核 wa 打满与全核均摊的处理方式不同:前者可能只是某个进程或某条中断路径的局部问题,后者通常意味着设备或链路整体吃紧,先看每核分布再定方向。

易错点

  • 把 iowait 高直接归因存储故障:内存回收、换页与虚拟化抢占都会抬高 wa
  • 不看 steal:虚拟机上把宿主抢占当成自己的 IO 问题,调优方向完全错误
  • 只看整机平均不看单核分布:局部问题被平均值掩盖
  • 忽略 PSI:iowait 无法说明对业务的停顿影响程度
  • 在容器里用全局指标下结论:需要宿主视角或宿主侧监控才能确认整体压力

数据来源与参考

  • sysstat 文档
  • Linux 内核 Documentation/accounting/psi.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌