人人都会AI编程

20.4 磁盘 IO 性能分析

更新时间:2026-07-12

磁盘 IO 性能直接决定数据库、文件服务、消息队列等 IO 密集型应用的响应速度。当系统出现卡顿、服务超时或负载升高时,快速判断是否由磁盘引起、定位瓶颈进程和具体设备,是运维和排查的基本功。

1. 关键指标速览

在分析之前,先明确几个常用术语:

  • IOPS(每秒读写次数):衡量小 IO 随机访问的能力,数据库、邮件服务对此敏感。
  • 吞吐量(MB/s):衡量顺序大 IO 的带宽,影响日志写入、视频传输、备份恢复等场景。
  • 延迟(Latency):单次 IO 请求从发起到完成的时间,通常关注平均值(await)和百分位值。
  • 队列深度(avgqu-sz):设备中待处理的 IO 请求数,过高说明积压严重。
  • 利用率(%util):设备繁忙程度。对机械磁盘,趋于 100% 通常意味着饱和;对 SSD/云盘,此值仅表示至少有一个请求在处理,并不能完全反映真实负载,需结合其他指标。

2. 核心工具与典型用法

(1) iostat —— 快速查看块设备及分区统计

iostat 是标准工具,通常安装 sysstat 包获得。基础用法:

iostat -x 1          # 每秒输出一次扩展统计

关键列解释(以 -x 模式为例):

  • r/s / w/s:每秒读/写次数,相加得 IOPS。
  • rkB/s / wkB/s:每秒读/写千字节,相加得吞吐量。
  • await:IO 请求的平均等待时间(含队列等待和服务时间),单位毫秒。应用感知的延迟主要参考此值。
  • r_await / w_await:读/写的平均延迟,可分别查看读写瓶颈。
  • aqu-sz:平均队列长度。
  • %util:设备带宽利用率。注意:对并发的 SSD,100% 并不代表极致饱和,应结合 IOPS 和延迟判断。

经验阈值(机械盘):await 超过 20ms 通常影响体验;对 SSD,5-10ms 也需关注,具体取决于应用延时要求。

(2) iotop —— 定位是哪个进程在吃 IO

iotop -o           # 仅显示正在产生 IO 的进程

可以实时看到每个进程的磁盘读写速率和 IO 百分比。快速找出“凶手”,结合 iostat 可判断进程读写是否与设备压力吻合。

(3) pidstat —— 从进程角度获取历史样本

pidstat -d 1         # 每秒输出进程 IO 统计

输出包含 kB_rd/s、kB_wr/s 等,适合脚本采集或事后分析。

(4) dstat / sar —— 综合监控与历史回溯

dstat -d --disk-util --disk-tps 可同屏显示多个磁盘的读写量和利用率。sar -d 则可回溯历史数据(需 sysstat 采集服务运行)。

3. 实际分析路径

通常按以下步骤层层递进:

第 1 步:宏观确认是否 IO 问题
系统响应慢时,先用 top 查看 CPU 的 %iowait(即 CPU 空转等待 IO 的比例)。如果某颗或多颗 CPU 的 iowait 持续高于 30-50%,磁盘很可能是瓶颈。但注意:iowait 高也可能因 IO 任务集中而 CPU 闲置,现代多核系统上单独查看意义已减弱,仍需结合设备指标。

第 2 步:找到饱和的设备

iostat -x 1

观察各磁盘的 await 和 %util。若某块盘 await 显著偏高(如 >50ms),而队列长度 >1,说明该设备处理能力跟不上请求。

第 3 步:定位繁忙进程

iotop -o

pidstat -d 1 | grep -v 0.00

确定是哪个进程(mysql、java、rsync)在大量读写。结合读写速率,判断是正常的业务峰值,还是异常的如全表扫描、日志爆炸、不当备份。

第 4 步:深入文件级别(可选)
使用 lsof -p <pid> 查看进程打开了哪些文件;或者 strace -p <pid> -e trace=read,write 2>&1 | head 观察系统调用行为。对于数据库,查看其自身的慢查询日志往往更直接。

4. 实例解读

假设 iostat -x 1 看到某 SSD 如下数据:

Device   r/s   w/s rkB/s wkB/s  await r_await w_await aqu-sz %util
sda    1500 30000 12000 480000  12.50   2.00   15.20   4.30  98

解读:写入 IOPS 极高(30000),吞吐量约 480 MB/s,平均写延迟 15.2 ms,对于 SATA SSD 已算较高;队列深度 4.3,说明持续有排队;%util 接近 100%。此时如果应用日志显示事务提交慢,可以判定磁盘写入能力饱和。优化方向:升级为 NVMe、增加 RAID、将 WAL 日志分离到低延迟设备,或优化应用写入模式(批量、异步)。

5. 不得不知的陷阱

  • %util 的误导:单块 NVMe 磁盘背后可能有多条并行通道,100% 的 util 时仍可能有 IOPS 余量;应更多关注延迟和队列深度。
  • 缓存效应iostat 看到的是块设备层统计,并不直接体现应用实际落盘延迟。文件系统缓存、RAID 卡缓存会掩盖真实设备性能。压测时应使用 O_DIRECTfio 绕过缓存评估真实 IO 能力。
  • 虚拟化/云环境:云盘性能受限于配额(IOPS、带宽),突发耗尽后会被限流,表现为延迟突然飙升。此时需结合云监控检查是否触达限制。

掌握上述工具和分析路径,足以应对绝大多数日常磁盘 IO 性能问题。关键是养成“先宏观后微观、从设备到进程”的习惯,避免在错误的方向上浪费精力。