SSD应选用最不干预的调度器:NVMe用none/noop,SATA SSD用deadline或mq-deadline,配合禁用rotational、增大nr_requests、关闭read_ahead_kb等参数调优。

固态硬盘(SSD)没有机械寻道和旋转延迟,传统为 HDD 设计的调度逻辑不仅无益,反而增加 CPU 开销、干扰设备自身控制器的智能调度。最优策略不是“挑一个快的”,而是“选一个最不干预的”。
看硬件类型,直接决定基础选项
不同 SSD 接口和协议特性差异大,不能一概而论:
- NVMe SSD:底层支持多队列、深度命令队列(64K+),控制器已做精细调度 → 必须用 none 或 noop(内核 ≥5.0 后推荐 none,语义更准确)
- SATA SSD:虽无寻道,但主控能力有限,且常受限于 AHCI 单队列瓶颈 → deadline 或 mq-deadline 更稳妥;内核 ≥5.0 可试 kyber(对小 IO 延迟更稳)
- 带缓存 RAID 卡 / ZFS 池 / 虚拟化后端盘(如 AWS EBS、阿里云云盘):I/O 已在硬件或中间层完成优化 → 统一用 noop 或 none
看实际负载,微调匹配场景
同一块 NVMe 盘挂不同服务,调度器影响可能相反:
- 数据库(PostgreSQL/MySQL OLTP):大量同步小写 + 强延迟敏感 → 若用 kyber,可保持低尾延迟;若用 none,需确认应用层已启用异步 I/O 或批量提交
- 虚拟机宿主机(KVM/Virtio-blk):Guest OS 自行调度,宿主只需透传 → none 是通用选择;部分新版 Virtio 驱动默认即 none
-
日志服务器或对象存储后端(如 MinIO、Ceph OSD):高吞吐、顺序写为主 → none 配合增大
nr_requests(如设为 1024)效果更明显
怎么查、改、验,三步闭环
不靠猜测,靠验证:
-
查当前设置:
cat /sys/block/nvme0n1/queue/scheduler→ 输出类似noop [none] mq-deadline kyber,方括号内为生效项 -
临时切换(立即生效):
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler;切换前建议先运行iostat -x 1记录基线 -
永久生效:避免改 grub(易出错),推荐 udev 规则 —— 创建
/etc/udev/rules.d/60-ssd-scheduler.rules,内容为:ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none" -
验证重点:别只盯吞吐(MB/s),更要看
iostat -x中的r_await/w_await(平均请求延迟)和%util(是否持续 100%)。换为 none 后,若延迟下降、avgrq-sz更稳定、且await波动减小,说明生效
顺手该调的配套参数
单改调度器不够,几个关键参数要同步清理:
-
关掉旋转模拟:
echo 0 > /sys/block/nvme0n1/queue/rotational(确保系统识别为非旋转介质) -
调大队列深度:
echo 1024 > /sys/block/nvme0n1/queue/nr_requests(默认 128 易成瓶颈) -
禁用机械式预读:
echo 0 > /sys/block/nvme0n1/queue/read_ahead_kb(SSD 不需要预加载) -
关闭合并(可选):
echo 0 > /sys/block/nvme0n1/queue/nomerges(让设备自己决定是否合并,提升延迟一致性)


















