可直接写入新调度器名称到/sys/block/sdb/queue/scheduler立即生效,无需重启;先用cat /sys/block/sdb/queue/scheduler查看当前激活项(方括号内),再用echo deadline|sudo tee等命令临时切换,支持选项包括deadline、kyber、none或noop,切换后需用iostat -x验证%util、await等指标改善,永久生效推荐udev规则而非全局内核参数。

可以直接写入新调度器名称到对应 sysfs 路径,立即生效,无需重启。
确认当前调度器状态
先查看 sdb 当前使用的调度算法,明确当前激活项:
cat /sys/block/sdb/queue/scheduler
输出类似 noop [deadline] cfq kyber,方括号内即为当前生效的调度器。
临时切换调度器(重启失效)
用 echo 写入目标算法名,注意必须是系统支持且列出的选项之一:
- 设为 deadline:echo deadline | sudo tee /sys/block/sdb/queue/scheduler
- 设为 kyber:echo kyber | sudo tee /sys/block/sdb/queue/scheduler
- 设为 none(适用于 NVMe 或 SATA SSD):echo none | sudo tee /sys/block/sdb/queue/scheduler
- 若内核不支持
none,可退而使用noop
执行后再次 cat 查看,确认方括号已更新。该操作即时生效,但仅维持到下次重启。
验证效果需结合实际负载观察
不能只看吞吐量数字,建议在修改前后用 iostat -x 1 持续采集 30 秒以上,重点关注:
- %util:是否显著下降(说明调度更高效)
- await 和 r_await/w_await:延迟是否有改善
- avgqu-sz:队列长度是否更稳定
尤其对数据库或高并发随机读写场景,deadline 或 kyber 常比默认 cfq 更稳;SSD 类设备启用 none 后,await 通常明显降低。
永久生效要避免全局 kernel 参数
不推荐改 /boot/grub/menu.lst 或内核命令行(elevator=xxx),因其作用于所有块设备,易导致 HDD 和 SSD 混插时误配。
推荐用 udev 规则按设备精准控制:
- 创建
/etc/udev/rules.d/60-io-scheduler.rules - 内容示例:
ACTION=="add|change", KERNEL=="sdb", ATTR{queue/scheduler}="deadline" - 重载规则:
sudo udevadm control --reload-rules && sudo udevadm trigger
这样既保证重启后仍生效,又避免“一刀切”带来的兼容性风险。











