首先确认是否存在IO瓶颈,通过iostat检查%util和await指标;再用iotop定位高IO占用进程;接着用ps、lsof和strace分析进程行为;然后检查IO调度器和队列状态;最后结合sar与日志进行长期监控与故障排查。

当Linux系统出现磁盘IO性能下降、响应变慢甚至服务卡顿时,很可能是某个进程占用了大量IO资源。快速定位并处理异常IO进程是系统运维的关键能力。以下是完整的Linux磁盘IO异常检测与故障分析步骤。
1. 使用iostat查看整体IO负载情况
通过iostat命令可以查看系统的磁盘使用率、吞吐量和等待时间,判断是否存在IO瓶颈。
操作命令:
iostat -x 1 5重点关注以下字段:
- %util:设备利用率,持续高于80%说明存在IO压力
- await:IO请求平均等待时间(毫秒),显著升高表示延迟严重
- svctm:服务时间,过高说明磁盘响应慢(注意:在现代系统中可能不准确)
如果发现某块磁盘的%util接近100%,且await值很高,基本可判定该磁盘存在IO瓶颈。
2. 使用iotop定位高IO占用进程
iotop类似于top命令,但专门用于监控进程级IO使用情况。
操作命令:
iotop -o参数说明:
- -o:只显示正在执行IO操作的进程
- -P:仅显示进程(不包括内核线程)
- -b:批处理模式,适合脚本调用
观察输出中的DISK READ和DISK WRITE列,找出读写速率异常高的进程。同时关注IO%列,表示进程对IO带宽的占用比例。
3. 查看进程详细信息与文件操作行为
一旦发现可疑进程,需进一步分析其行为。
获取进程PID后执行:
ps aux | grep PID查看进程所属用户、启动命令等基本信息。
使用lsof查看该进程打开的文件:
lsof -p PID重点关注频繁读写的文件路径,如日志文件、数据库文件或临时目录。
也可使用strace跟踪系统调用:
strace -p PID -e trace=read,write观察是否有大量小IO操作或重复读写同一文件。
4. 检查内核IO栈与调度状态
某些问题源于内核层面,如IO调度器配置不当或设备队列阻塞。
查看当前IO调度策略:
cat /sys/block/sda/queue/scheduler常见值有noop、deadline、cfq、none(多见于SSD)。根据存储类型选择合适的调度器有助于缓解争用。
检查设备队列深度和拥堵情况:
cat /proc/diskstats结合/sys/block/sda/stat中的字段分析IO排队长度。
5. 长期监控与日志分析
对于偶发性IO异常,建议部署周期性采集工具。
可编写脚本定时记录:
- 每分钟运行一次iostat -x 1 1并保存结果
- 结合sar -d收集历史数据(需安装sysstat)
- 使用dmesg检查是否有磁盘错误或超时日志
分析/var/log/messages或journal日志中是否有关于“I/O error”、“timeout”、“blocked”等关键词。
基本上就这些。从宏观IO状态到具体进程行为,再到内核层排查,这套流程能覆盖大多数Linux IO异常场景。关键是要先确认是否存在真实IO瓶颈,再精准定位元凶进程,避免误杀正常业务。平时保持基础监控,出问题时才能快速响应。










