| 指标 | 含义 | 关注点 |
|---|---|---|
| r/s, w/s | 每秒读写次数 | IOPS |
| rkB/s, wkB/s | 每秒读写 KB | 吞吐量 |
| await | 平均 IO 等待时间 (ms) | 延迟 |
| r_await, w_await | 读写分别的等待时间 | 延迟分布 |
| svctm | 平均服务时间 | 设备自身耗时 |
| %util | 设备繁忙百分比 | 饱和度 |
| avgqu-sz | 平均队列长度 | 排队情况 |
iostat -x 1 # 扩展统计,每秒刷新
iostat -x -m 1 # 以 MB 显示
sar -d 1 # 磁盘 IO 历史统计
iotop # 实时进程 IO 排序(需 root)
iotop -o # 只显示有 IO 活动的进程
pidstat -d 1 # 进程 IO 统计
lsof -p <PID> # 进程打开的文件
# iostat -x 关键字段解读
# await 高 + svctm 低 → 请求排队严重
# await 高 + svctm 高 → 磁盘自身慢
# await 低 + %util 高 → 磁盘接近满负荷但还能响应
# 查看磁盘调度器
cat /sys/block/sda/queue/scheduler
# IO 跟踪
blktrace -d /dev/sda -o - | blkparse -i -
btrace /dev/sda # 简化版
cat /sys/block/sda/queue/scheduler
# [mq-deadline] none
# 常见调度器:
# mq-deadline — 多队列截止时间,SSD 默认
# kyber — 低延迟调度器
# bfq — 带宽公平队列,HDD 友好
# none — 无调度(NVMe 直通)
# 顺序读写
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
dd if=test of=/dev/null bs=1M count=1024 iflag=direct
# 随机 IOPS (需要 fio)
fio --name=randwrite --ioengine=libaio --iodepth=16 \
--rw=randwrite --bs=4k --direct=1 --size=1G \
--numjobs=4 --runtime=60 --group_reporting
# 文件系统缓存影响
# 加上 direct 标志绕过 Page Cache 测真实磁盘性能
| 问题 | 表现 | 排查方向 |
|---|---|---|
| IO 饱和 | %util 高, avgqu-sz 高 | 加磁盘/用 SSD/优化查询 |
| 延迟尖刺 | await 偶尔飙高 | 检查后台任务(日志刷盘、备份) |
| 单线程慢 | w_await 远大于 r_await | fsync 频繁、写放大 |
| 缓存失效 | iowait 突然升高 | 内存不足,Page Cache 被回收 |
磁盘 IO 慢?
├─ %util 接近 100% → 磁盘饱和 → 扩容量/分流
├─ await 高但 %util 低 → 磁盘自身慢/故障 → 检查 SMART
├─ 写延迟高 → 检查 fsync 频率 → 应用配置优化
├─ 个别进程 IO 高 → iotop 定位 → 优化该进程
└─ Page Cache 颠簸 → free 检查缓存 → 扩内存