Linux 磁盘 IO 性能问题定位方法

4次阅读

Linux 磁盘 IO 性能问题定位方法

定位 linux 磁盘 IO 性能问题,核心是分层排查:先看整体负载是否由 IO 引起,再确认是哪个设备、哪个进程、哪种 IO 模式(读/写/随机/顺序)在拖慢系统。

观察系统级 IO 压力

iostat -x 1 查看关键指标:

  • %util 接近 100% 表示设备持续忙碌,但需结合 awaitsvctm 判断是否真瓶颈(如 await 显著大于 svctm,说明队列积压)
  • r/sw/s 反映 IOPS,rMB/s/wMB/s 反映吞吐量,对比磁盘标称值可初步判断是否超载
  • avgqu-sz(平均队列长度)持续大于 1,说明请求排队,常见于高并发随机 IO 场景

定位高 IO 消耗的进程

使用 iotop -oP(需 root 权限)实时查看活跃 IO 进程:

  • -o 只显示有实际 IO 的进程,避免干扰
  • -P 按进程而非线程聚合,更易识别主因
  • 关注 IO> 列(当前 IO 速率)和 IO_w(累计写入量),快速锁定“IO 狂魔”
  • 若看到 jbd2kswapd 占比高,可能分别指向日志刷盘频繁或内存不足引发交换

分析 IO 访问模式与文件层级

pidstat -d 1lsof -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 应设为 nonekyber,HDD 可用 bfqmq-deadline
  • 确认挂载选项:mount | grep sdx,避免误用 syncbarrier=1 等强一致性参数影响性能
text=ZqhQzanResources