cat /sys/block/sda/queue/scheduler 是唯一可靠查看方式,lsblk -D、iostat、df 均不显示 IO 调度器;输出中方括号内项为当前生效调度器,如 [mq-deadline],NVMe 设备常显示 [none] 表示绕过软件调度层。

cat /sys/block/sda/queue/scheduler 是唯一可靠查看方式
lsblk -D、iostat、df 都不显示 IO 调度器,它们只管设备拓扑或统计信息。调度器是内核块层运行时策略,只暴露在 /sys/block/设备名/queue/scheduler 这个 sysfs 接口里。
必须先确认真实设备名,再查对应路径:
- 用
lsblk -d或cat /proc/partitions列出物理块设备,排除loop、dm-、zram等虚拟设备 - 对 SATA 设备(如
sda),执行cat /sys/block/sda/queue/scheduler - 对 NVMe 设备(如
nvme0n1),执行cat /sys/block/nvme0n1/queue/scheduler
输出形如 [mq-deadline] kyber bfq none,方括号 [] 里的就是当前生效项。看到 [none] 不代表错误——NVMe 常态如此,说明内核跳过软件调度层,由硬件直接处理。
为什么 cat 出来一堆名字,却不确定哪个在用?
方括号位置才是关键。比如输出 noop [deadline] mq-deadline,表示当前激活的是 deadline;而 [none] mq-deadline kyber 表示当前是 none,其余只是可用选项。
常见误判点:
-
lsblk -D显示的DISC-GRAN等参数和调度器完全无关 -
dmesg | grep scheduler只能查内核编译时支持了哪些调度器,不是运行时实际启用的 - 某些旧驱动或 RAID 卡会屏蔽部分调度器,
cat输出里没出现的,就真的不能用
查不到 scheduler 文件?设备可能不支持或路径不对
如果 cat /sys/block/sda/queue/scheduler 报 No such file or directory,大概率是以下情况之一:
- 设备名写错,比如把
nvme0n1p1(分区)当成nvme0n1(设备)——必须用主设备名,不能带p1 - 该设备压根没有软件调度层,例如部分 virtio-blk 或某些 USB 存储设备,
/sys/block/xxx/queue/下根本无scheduler文件 - 内核启动时禁用了 blk-mq(极少见),但现代发行版基本不存在这种情况
验证路径是否存在:ls /sys/block/sda/queue/ | grep scheduler。没结果就别硬试,换设备或查硬件文档。
临时切换后 cat 不变?写入失败的典型表现
执行 echo kyber > /sys/block/sda/queue/scheduler 后再 cat,发现方括号没动,说明写入失败。原因很具体:
- 权限不足:必须用 root,
sudo sh -c 'echo kyber > /sys/block/sda/queue/scheduler'才安全 - 写入非法值:只能写
cat输出里列出的名字,比如输出只有[mq-deadline] kyber,就不能写bfq - NVMe 强制
none:若设备显示[none]且写其他值返回Invalid argument,这是内核主动拒绝,不是操作问题 - RAID 卡固件限制:某些 LSI 或 MegaRAID 卡只认
noop或deadline,其余写入会被忽略
真正生效的标志,是 cat 输出中方括号位置移动,且无报错。别信“命令没报错就算成功”——必须二次验证。
最易被忽略的一点:每个块设备独立配置,sda 和 nvme0n1 的调度器可以完全不同,查和改都得按设备逐个来,不存在“整个系统统一设置”这回事。


















