磁盘 IO 分析与调优
IO 分析工具
# iostat:最常用的磁盘 IO 分析工具
iostat -xdm 1 5
# r/s, w/s: 每秒读/写次数 (IOPS)
# rkB/s, wkB/s: 每秒读/写吞吐量
# await: 平均 IO 等待时间(ms),正常 < 10ms
# %util: 设备利用率,> 80% 说明有瓶颈
# iotop:按进程查看 IO
iotop -oP
# blktrace:块设备追踪(深度排查)
blktrace -d /dev/sda -o - | blkparse -i -
IO 调度器
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# [mq-deadline] kyber bfq none
# 临时修改
echo mq-deadline > /sys/block/sda/queue/scheduler
| 调度器 | 适用场景 | 特点 |
|---|---|---|
mq-deadline | 数据库、通用 | 保证请求延迟上限,防饥饿 |
kyber | 低延迟场景 | 轻量级,适合 NVMe |
bfq | 桌面/交互式 | 公平调度,按比例分配带宽 |
none/noop | NVMe SSD | 不做调度,SSD 自行优化 |
提示
SSD 用 none 或 mq-deadline,HDD 用 mq-deadline。NVMe 设备自带硬件队列,OS 层面的调度反而增加延迟。
fio 基准测试
# 随机读(测 IOPS)
fio --name=randread --ioengine=libaio --rw=randread \
--bs=4k --numjobs=4 --size=1G --runtime=60 \
--direct=1 --group_reporting
# 顺序写(测吞吐量)
fio --name=seqwrite --ioengine=libaio --rw=write \
--bs=1M --numjobs=1 --size=4G --runtime=60 \
--direct=1 --group_reporting
调优建议
| 场景 | 优化方向 |
|---|---|
| 数据库(随机 IO) | SSD/NVMe + none 调度 + 调大 nr_requests |
| 日志写入(顺序 IO) | HDD 即可 + 增大 readahead |
| IO Wait 高 | 排查慢查询、减少同步写、增加磁盘或切 SSD |
常见面试问题
Q1: %util 100% 就代表磁盘已达极限吗?
答案:
不一定。%util 表示设备有 IO 请求的时间比例,但现代 SSD/NVMe 支持并行处理多个请求(队列深度可达 128+)。即使 %util 100%,如果 await 很低,吞吐量可能还有余量。真正判断瓶颈要综合看 await、avgqu-sz(平均队列长度)和实际 IOPS。