应按设备类型差异化配置:SSD/NVMe设none(或noop)以消除冗余调度,HDD设deadline以保障延迟;须逐盘用smartctl和cat /sys/block/*/queue/scheduler确认类型与当前调度器,避免误配导致IO饥饿或延迟飙升。

在 Linux 系统中,混合负载(比如同时运行数据库、日志服务、备份任务)叠加 HDD 与 SSD 共存的硬件环境时,I/O 调度器不能“一刀切”。关键不是选一个“最好”的调度器,而是按设备类型和业务特征做差异化配置——SSD/NVMe 关掉调度,HDD 启用延迟保障机制。
先确认每块盘的真实类型和当前调度器
盲目修改会适得其反。必须逐设备检查:
- 查设备类型:
smartctl -i /dev/sda | grep "Rotation Rate"—— 输出7200 rpm是 HDD;输出None或无该字段,大概率是 SSD/NVMe - 查当前调度器:
cat /sys/block/sda/queue/scheduler→ 显示类似[mq-deadline] kyber bfq none,方括号内为激活项 - NVMe 设备名是
nvme0n1,不是sda;多个盘必须分别验证,不能只看一块
为 SSD/NVMe 设置 none(或 noop)
SSD 和 NVMe 内部控制器已具备高效请求排序与并行处理能力,内核再做调度反而增加延迟、浪费 CPU。
- 临时生效(重启失效):
echo none > /sys/block/nvme0n1/queue/scheduler(NVMe)或echo none > /sys/block/sdb/queue/scheduler(SATA SSD) - 永久生效(推荐):编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX行末加elevator=none,再执行grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL/CentOS)或update-grub(Debian/Ubuntu) - 注意:部分旧内核不支持
none,可改用noop,效果接近
为 HDD 设置 deadline
HDD 存在机械寻道,随机 I/O 容易造成长尾延迟。deadline 能防止请求“饿死”,对数据库归档、日志轮转等典型混合负载更友好。
- 临时切换:
echo deadline > /sys/block/sda/queue/scheduler - 永久配置(避免影响其他盘):建 udev 规则
/etc/udev/rules.d/60-hdd-scheduler.rules,内容为:SUBSYSTEM=="block", KERNEL=="sda", ATTR{queue/scheduler}="deadline" - 验证:
cat /sys/block/sda/queue/scheduler应显示[deadline],再结合iostat -xdz 2 5观察w_await是否稳定在 30ms 以内
验证优化是否真正起效
改完不是结束,要观察真实 IO 表现:
- 运行
iostat -xdz 2 5,重点关注:
–w_await:HDD 应 ≤30ms,SSD 应 ≤2ms
–%util:长期接近 100% 说明仍存在瓶颈,需进一步排查应用层或队列深度 - 若发现某盘
w_await异常飙升,立刻回查该设备是否被误设为none(HDD 误配会导致严重 IO 饥饿) - 不建议统一使用
cfq或kyber:实测在混插环境下平均写延迟可能增加 40% 以上


















