必须指定设备名查,如cat /sys/block/sda/queue/scheduler,输出中方括号内即当前生效调度器;nvme常为[none]属正常,无需修改,sata ssd推荐mq-deadline或kyber。

怎么查当前设备用的是哪个调度器
Linux 没有“全系统统一”的 IO 调度策略,每个块设备(如 sda、nvme0n1)独立配置,必须指定设备名才能查准。
- 先确认设备名:
lsblk -d或cat /proc/partitions,只看物理盘(排除loop、dm-、zram等) - 查调度器:
cat /sys/block/sda/queue/scheduler(把sda换成你的设备) - 输出形如
noop [mq-deadline] kyber bfq none,方括号内那个就是当前生效的 -
nvme0n1常见输出是[none]——这不是异常,是内核主动绕过软件调度层,别急着改 - 若看到
cfq且内核 ≥5.0,说明该设备可能被旧规则残留影响,建议检查是否真在用单队列路径
为什么 cat /sys/block/xxx/queue/scheduler 会报 No such file or directory
路径错或设备不支持 sysfs 调度接口,常见于虚拟化环境或云盘。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 设备名不对:比如系统重启后
sda变成sdb,或用了 LVM/RAID,应查底层物理设备(如/dev/sda),而非逻辑卷(如/dev/dm-0) - 云盘屏蔽:阿里云云盘、AWS EBS 等通常只暴露
vda,且/sys/block/vda/queue/scheduler可能只显示[none]或直接报错,这是设计如此,不可修改 - 驱动不支持:某些老 RAID 卡或 Xen PV 驱动不提供
queue/scheduler接口,ls /sys/block/sda/queue/里压根没有scheduler这个文件 - 权限问题:非 root 用户执行会失败,但错误通常是
Permission denied,不是No such file
查出来是 [none],还要不要改成 noop 或 deadline
绝大多数情况下,不用改,强行写反而可能失败或无效果。
-
none在 NVMe 设备上是正常状态,表示由固件直接处理请求,内核不介入;此时写noop或deadline会被内核拒绝,cat后仍显示[none] - SATA SSD 显示
[none]属少见,需确认是否为较新内核 + 特定驱动组合,一般应设为mq-deadline或kyber - 写入失败时会报
Invalid argument,不是权限问题,而是该设备根本不接受你写的调度器名 - 如果
nvme0n1显示[none],再 echo 一遍none都是多余操作
怎么确认改没生效(尤其临时切换后)
不能只信 echo 命令没报错,得回读验证,且要结合负载观察实际行为。
- 改完立刻
cat /sys/block/sda/queue/scheduler,确认方括号已移到目标项上 - 运行中改调度器不触发设备重置,所以不会断 IO,但部分场景(如从
bfq切到noop)可能导致短时await波动,用iostat -x 1观察 10 秒以上 - 关键指标盯
r_await和avgqu-sz:r_await > 1ms(SSD)或> 10ms(HDD)+avgqu-sz > 1才说明队列真堵了,单纯%util高可能是调度器主动限速 - 改完不做压测就认为“有效”,大概率是假阳性;真实负载下
await下降才说明调度器起作用
sda,结果加了新盘后系统从 sdb 启动,调度器设置完全失效;而云服务器用户花时间研究 kyber 参数,却不知道自己的 vda 根本不支持任何调度器切换。










