跳到主要内容

磁盘 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/noopNVMe SSD不做调度,SSD 自行优化
提示

SSD 用 nonemq-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 很低,吞吐量可能还有余量。真正判断瓶颈要综合看 awaitavgqu-sz(平均队列长度)和实际 IOPS。

相关链接