
定位 Linux 磁盘 IO 性能问题,核心是分层排查:先看整体负载是否由 IO 引起,再确认是哪个设备、哪个进程、哪种 IO 模式(读/写/随机/顺序)在拖慢系统。
观察系统级 IO 压力
用 iostat -x 1 查看关键指标:
- %util 接近 100% 表示设备持续忙碌,但需结合 await 和 svctm 判断是否真瓶颈(如 await 显著大于 svctm,说明队列积压)
- r/s 和 w/s 反映 IOPS,rMB/s/wMB/s 反映吞吐量,对比磁盘标称值可初步判断是否超载
- avgqu-sz(平均队列长度)持续大于 1,说明请求排队,常见于高并发随机 IO 场景
定位高 IO 消耗的进程
使用 iotop -oP(需 root 权限)实时查看活跃 IO 进程:
- -o 只显示有实际 IO 的进程,避免干扰
- -P 按进程而非线程聚合,更易识别主因
- 关注 IO> 列(当前 IO 速率)和 IO_w(累计写入量),快速锁定“IO 狂魔”
- 若看到 jbd2 或 kswapd 占比高,可能分别指向日志刷盘频繁或内存不足引发交换
分析 IO 访问模式与文件层级
用 pidstat -d 1 或 lsof -p PID 结合业务逻辑深挖:
- pidstat -d 可按进程输出每秒读写字节数、读写次数,辅助判断是大块顺序 IO 还是小块随机 IO
- lsof -p PID 查看进程打开的文件,重点关注大文件、日志文件、数据库数据文件等
- 对数据库类应用,检查是否缺失索引导致全表扫描(大量随机读);对日志服务,确认是否未轮转导致单文件过大(顺序写变长尾延迟)
检查底层存储与配置合理性
排除上层后,验证硬件与内核层是否合理:
- 用 lsblk -d -o NAME,ROTA,RQ-SIZE,LOG-SEC 确认磁盘类型(ROTA=1 为机械盘,0 为 SSD)、队列深度(RQ-SIZE)、扇区大小
- 检查 I/O 调度器:cat /sys/block/sdX/queue/scheduler,SSD 应设为 none 或 kyber,HDD 可用 bfq 或 mq-deadline
- 确认挂载选项:mount | grep sdx,避免误用 sync 或 barrier=1 等强一致性参数影响性能











