
Linux系统出现IO等待过高(%wa高),说明CPU大量时间在空等磁盘响应,本质是I/O子系统成了瓶颈。排查要分层推进:先确认是不是IO问题,再定位哪块盘忙,最后揪出具体进程。
看top或vmstat确认IO等待是否异常
运行 top,观察CPU行中 %wa 值:持续高于20%就值得警惕;若%wa高而%us、%sy很低,基本可锁定为IO瓶颈。
也可用 vmstat 1 查看 b(阻塞进程数)和 wa 列,b值长期大于0且wa同步升高,进一步佐证IO阻塞。
用iostat定位高负载磁盘
执行 iostat -dx 2(需先装sysstat包),重点关注以下字段:
- %util:持续接近或超过80%,表示该设备已饱和;
- await:平均I/O响应时间,>50ms说明排队严重;
- r/s 和 w/s:结合业务判断是否超出预期IOPS;
- rkB/s 和 wkB/s:看吞吐是否达到磁盘理论上限。
找出 %util 或 await 最高的设备(如 sda、nvme0n1),这就是瓶颈盘。
用iotop或pidstat找出罪魁祸首进程
对准上一步发现的高负载磁盘,运行:
- sudo iotop -o:只显示正在做I/O的进程,按DISK READ/WRITE排序,一眼看到读写量最大、IO%最高的进程;
- pidstat -d 1:按PID统计每秒读写字节数,适合脚本化分析或后台采集;
- 补充手段:fuser -vm /mount/point 可查挂载点上活跃的访问进程(需先用 mount 确认目标盘挂载位置)。
分析进程行为并针对性处理
拿到高IO进程PID后,别急着kill,先诊断原因:
- 如果是数据库进程(如mysqld、postgres),检查慢查询日志、缺失索引、全表扫描;
- 如果是日志类进程(如rsyslog、应用自身),检查日志级别是否设为DEBUG、是否未启用轮转;
- 如果是备份或同步工具(如rsync、tar),确认是否在非业务低峰期执行;
- 用 lsof -p PID 查看它打开了哪些大文件,用 strace -p PID -e trace=read,write 观察实际读写调用频次与大小。
优化方向包括:加缓存、调大buffer、异步写入、分离日志盘、升级更高IOPS云盘等。










