磁盘IO负载过高表现为系统响应迟缓但CPU使用率未必高,排查分三步:先用top看%wa定性(>30%即IO瓶颈),再用iostat -x 2查%util≥80%和await>50ms锁定高负载磁盘,最后用iotop -o定位高IO进程并结合lsof分析具体文件。

磁盘 IO 负载过高通常表现为系统响应迟缓、应用卡顿,但 CPU 使用率未必高——真正拖慢系统的,是进程在排队等磁盘响应。排查关键不在“谁占了 CPU”,而在“谁在猛读写磁盘”。整个过程分三步走:先确认确实是 IO 问题,再锁定压力大的磁盘,最后揪出具体进程。
看 %wa 判断是否为 IO 等待导致的卡顿
运行 top,重点关注右上角的 %Cpu(s) 行中 %wa(iowait)数值:
- %wa < 10%:IO 压力基本正常
- %wa 在 10%–30%:已有明显 IO 等待,需进一步观察
- %wa > 30%:IO 成为瓶颈,系统变慢大概率由此引起
- %wa > 50%:磁盘严重阻塞,进程大量挂起在不可中断状态(D 状态)
注意:%wa 高只说明 CPU 在等磁盘,并不指明是哪块盘、哪个进程,但它是最快速的“问题定性”依据。
用 iostat 找出高负载的磁盘设备
执行 iostat -x 2(需先安装 sysstat:Ubuntu/Debian 用 apt install sysstat,CentOS/RHEL 用 yum install sysstat):
- 重点看 %util 列:持续 ≥ 80% 表示该磁盘已饱和,是瓶颈所在
- 结合 await(平均等待时间):>50ms 说明请求排队严重,不只是忙,还很慢
- 观察 r/s 和 w/s:判断是读密集型(如数据库查询)还是写密集型(如日志刷盘、备份)
例如输出中 sda %util = 96.3%,就可锁定问题在 sda 设备,后续所有排查围绕它展开。
用 iotop 定位消耗 IO 最高的进程
安装并运行 iotop -o(Ubuntu:apt install iotop;CentOS:yum install iotop):
- -o 参数只显示正在做 IO 的进程,避免干扰
- 默认按 IO> 列(IO 等待时间占比)排序,值越接近 100% 越可疑
- 关注 DISK READ 和 DISK WRITE 两列,识别是读多还是写多
- 记下 PID 和 COMMAND,比如看到 mysqld 持续写入 40MB/s,或 rsyslogd 大量刷日志,就是突破口
若权限不足,必须加 sudo 运行,否则看不到其他用户进程的 IO 细节。
辅助验证与深入分析
确认高 IO 进程后,可进一步验证其行为:
- 查它在访问哪些文件:lsof -p PID | grep REG(筛选普通文件)
- 看挂载点对应关系:lsblk 或 findmnt /dev/sda,确认该进程操作的路径是否落在问题磁盘上
- 临时限制 IO(应急):ionice -c 3 -p PID 将其设为空闲类,缓解对其他进程影响
常见元凶包括未优化的数据库查询、日志级别设为 DEBUG、定时备份未错峰、或程序存在文件循环写却无缓冲等。


















