linux-sre-handbook

03-磁盘IO分析

IO 核心指标

指标 含义 关注点
r/s, w/s 每秒读写次数 IOPS
rkB/s, wkB/s 每秒读写 KB 吞吐量
await 平均 IO 等待时间 (ms) 延迟
r_await, w_await 读写分别的等待时间 延迟分布
svctm 平均服务时间 设备自身耗时
%util 设备繁忙百分比 饱和度
avgqu-sz 平均队列长度 排队情况

工具链

1. 总览

iostat -x 1              # 扩展统计,每秒刷新
iostat -x -m 1           # 以 MB 显示
sar -d 1                 # 磁盘 IO 历史统计

2. 进程级

iotop                    # 实时进程 IO 排序(需 root)
iotop -o                 # 只显示有 IO 活动的进程
pidstat -d 1             # 进程 IO 统计
lsof -p <PID>            # 进程打开的文件

3. 深入分析

# 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           # 简化版

IO 调度器

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 决策树

磁盘 IO 慢?
├─ %util 接近 100% → 磁盘饱和 → 扩容量/分流
├─ await 高但 %util 低 → 磁盘自身慢/故障 → 检查 SMART
├─ 写延迟高 → 检查 fsync 频率 → 应用配置优化
├─ 个别进程 IO 高 → iotop 定位 → 优化该进程
└─ Page Cache 颠簸 → free 检查缓存 → 扩内存

延伸阅读