唯一可靠方式是读取/sys/block/设备名/queue/scheduler:每个块设备独立配置,需先用lsblk -d确认物理设备名,再cat该路径查看方括号内当前生效项;nvme显示[none]属正常设计,不可强行修改。

查 /sys/block/设备名/queue/scheduler 是唯一可靠方式
Linux 没有全局“系统级”IO调度算法,每个块设备(如 sda、nvme0n1)独立配置,lsblk、df、dmesg 都不暴露调度器信息。必须直接读取 sysfs 接口:
- 先确认设备名:
lsblk -d或cat /proc/partitions,排除loop、dm-、zram等非物理设备 - 再查调度器:
cat /sys/block/sda/queue/scheduler(把sda替换为你的真实设备名) - 输出形如
[mq-deadline] kyber bfq none,方括号内就是当前生效项 - NVMe 设备(如
nvme0n1)常见输出是[none]——这不是错误,而是内核主动绕过软件调度层,此时写入其他调度器会失败
看到 [none] 就别硬改,尤其对 NVMe 设备
none 在现代内核中不是“未设置”,而是明确表示跳过 blk-mq 软件调度,由 NVMe 控制器自身处理队列。强行写入 kyber 或 mq-deadline 会返回 Invalid argument 或静默失败。
- 验证是否为 NVMe:
lsblk -d | grep nvme或lspci | grep -i nvme - 若设备是 SATA SSD 却显示
[cfq]或[deadline],才值得考虑切换;若已是[mq-deadline]或[kyber],通常无需调整 - 部分旧驱动或 RAID 卡可能不支持
mq-deadline,写入后仍显示原值,说明内核拒绝了该设置
临时切换调度器:echo 写入 + root 权限
这个操作立即生效,但重启后还原。适合快速验证,但对根设备(如装系统的 sda)慎用,可能引发短暂卡顿:
- 必须用 root:
sudo sh -c 'echo kyber > /sys/block/sda/queue/scheduler' - 只能写入
cat输出中列出的选项,比如输出是[noop] mq-deadline,就不能写bfq - 写成功后再次
cat应看到方括号移位;若没变,说明设备不支持或权限不足 - 某些场景(如数据库压测前)可临时切到
mq-deadline,但别在生产环境反复切换
永久修改靠 GRUB 参数,不是配置文件
靠内核启动参数 elevator=xxx 实现,对所有块设备统一生效,无法按设备区分:
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT行末加elevator=mq-deadline(空格分隔) - Debian/Ubuntu 执行:
sudo update-grub;RHEL/CentOS 执行:sudo grub2-mkconfig -o /boot/grub2/grub.cfg - 重启才生效;若启动失败,进 GRUB 编辑启动项,临时删掉
elevator=参数即可恢复 - 混用 HDD 和 SSD 时,这个全局参数会失效——此时得用 udev 规则按设备名精准设置,而不是依赖 GRUB
none 不是缺省值,而是设计选择;而 SATA SSD 用 mq-deadline 或 kyber 比 cfq 更稳,但改完必须用 iostat -x 1 观察 await 和 %util 才算真正落地。











