iowait 高怎么排查?三步定位是磁盘慢还是程序狂读写
答案:iowait 是 CPU 空闲等待 IO 的时间占比。排查顺序:iostat -x 1 看哪个设备饱和 → pidstat -d 1 定位哪个进程在读写 → iotop 实时确认,最后判断是磁盘问题还是程序问题。
排查三步
# 1. 看哪个设备忙、多慢(每秒刷新)
iostat -x 1
# 2. 定位是哪个进程在大量 IO
pidstat -d 1
# 3. 实时看进程 IO 排行
sudo iotop -oP关键指标解读(iostat -x)
| 指标 | 含义 | 判断 |
|---|---|---|
%util | 设备繁忙度 | ≈100% 说明磁盘饱和 |
await | IO 平均响应(ms) | 机械盘几十 ms 正常,SSD 应 <1ms;大说明排队/慢盘 |
r/s、w/s | 每秒读写请求数 | 看吞吐是否异常 |
svctm | 单次 IO 服务时间 | 已过时,仅参考 |
常见场景对照:
%util高 +await大 → 磁盘真饱和(换盘/加缓存/减 IO);%util不高 +iowait高 → 可能是 swap 抖动、文件系统配置、或等待网络挂载 IO;- 多进程抢 IO → 单设备 util 高但 CPU 仍在忙,iowait 不一定高。
容易被忽略的原因
- swap 换页:内存不足时
kswapd疯狂读写 swap,iowait 飙升; - 文件系统刷盘:ext4
data=ordered、sync 频繁触发; - RAID 校验/重建:RAID5/6 在重建或校验时 IO 开销大;
- 日志/监控进程:
journald、采集 agent 周期性刷盘。
深度入口
- iowait 原理与指标详解:iowait 深入解读
- IO 子系统原理:IO 子系统
- iostat 完整用法:iostat 使用指南
FAQ
Q: iowait 高是什么原因? A: iowait 是 CPU 空闲但等待磁盘/网络 IO 完成的时间占比。高说明 CPU 在等 IO,要么磁盘慢,要么有进程疯狂读写。
Q: iowait 高怎么排查? A: 三步:1) iostat -x 1 看哪个设备 util% 高、await 大;2) pidstat -d 1 定位哪个进程在大量读写;3) 结合 iotop 实时确认。
Q: iostat 里哪个指标关键? A: %util 表示设备繁忙度(接近 100% 说明磁盘饱和);await 是 IO 平均响应(毫秒);svctm 过时参考;r/s、w/s 看吞吐。
Q: 磁盘 util 100% 但 iowait 不高,正常吗? A: 正常。util 高说明磁盘饱和,但若有多个进程排队,CPU 可能仍在忙自己的事,iowait 只是"CPU 空闲等 IO"的时间占比。
Q: iowait 高一定是磁盘坏了吗? A: 不一定。可能是:磁盘确实慢/满、文件系统碎片、刷盘策略(如 ext4 的 data=ordered)、RAID 校验、或者 swap 频繁换页。
Q: 怎么区分是磁盘问题还是程序问题? A: 用 iostat -x 看设备 util% 和 await:设备忙且 await 大是磁盘问题;设备不忙但程序慢是程序/调度问题。再配合 pidstat -d 和 strace 定位程序行为。
一句话总结:iowait 高先分清楚是"设备饱和"还是"程序 IO 模式差"——iostat -x 看设备、pidstat -d 找进程、iotop 实时确认,三步定位。