本文以 NVMe x4 单盘为对象,通过 `fio` 与内核调度器配置,提供可复现的压测方案,帮助在不同负载下选择合适的队列深度与调度器以获得稳定的性能与延迟表现。
## 前提与检查(可复现)
# 查看并切换调度器(root)
cat /sys/block/nvme0n1/queue/scheduler
echo none > /sys/block/nvme0n1/queue/scheduler
# 可选:mq-deadline 或 kyber
echo mq-deadline > /sys/block/nvme0n1/queue/scheduler
echo kyber > /sys/block/nvme0n1/queue/scheduler
# 推荐使用 io_uring 引擎(内核 5.10+)
fio --version
## 顺序读/写与随机混合(fio 可复现)
1. 顺序读(128k,不同 QD 对比):
fio --name=read_seq_qd1 \
--filename=/dev/nvme0n1 --direct=1 --ioengine=io_uring \
--rw=read --bs=128k --iodepth=1 --numjobs=1 \
--runtime=30 --time_based --group_reporting
fio --name=read_seq_qd64 \
--filename=/dev/nvme0n1 --direct=1 --ioengine=io_uring \
--rw=read --bs=128k --iodepth=64 --numjobs=1 \
--runtime=30 --time_based --group_reporting
2. 随机读写(4k,QD 与延迟分布):
fio --name=rand_rw_qd32 \
--filename=/dev/nvme0n1 --direct=1 --ioengine=io_uring \
--rw=randrw --rwmixread=70 --bs=4k --iodepth=32 --numjobs=4 \
--runtime=60 --time_based --group_reporting --lat_percentiles=1
观察指标:`bw`、`iops`、`clat (usec)` 与 `lat (p50/p90/p99)`;顺序负载下提升 QD 通常提高带宽,随机负载则需在吞吐与延迟之间权衡。
## 调度器选择建议(经验与可验证)
- `none`:对 NVMe 设备最小化调度开销,顺序带宽与低延迟场景通常表现最佳。
- `mq-deadline`:提供公平性与饥饿保护,适合多队列混合负载;在随机场景下有稳定性优势。
- `kyber`:针对 NVMe 的延迟优化,在高并发下延迟分布更平滑,需实测确认平台表现。
验证方法:在三种调度器下重复上述 `fio` 用例,记录 `bw/iops/latency` 并对比选择最优组合。
## 注意事项
- 写入测试会影响寿命与数据安全,请在空盘或维护窗口操作。
- 不同 CPU/主板的 PCIe 版本与通道布局会影响上限带宽,上线前需按平台核对。
- 结合文件系统与对齐(如 1MB 对齐)获得稳定的顺序性能。
## 结语
通过标准化的队列深度与 I/O 调度器压测,可以在不同负载下取得平衡的带宽与延迟,形成可复现的 NVMe 调优依据。

发表评论 取消回复