lsblk -D 仅显示丢弃能力参数(DISC-GRAN、DISC-MAX、DISC-ZERO),无法查看或调整IO调度算法;正确方法是执行cat /sys/block/sda/queue/scheduler查看当前调度器(方括号内为生效项),并通过echo写入该路径临时切换,或通过GRUB添加elevator=参数永久设置。

lsblk -D 不能查看或调整 IO 调度算法(如 BFQ、Kyber、none),它只显示块设备的丢弃能力参数(DISC-GRAN、DISC-MAX、DISC-ZERO),与调度器完全无关。
IO 调度器是内核块层的运行时策略,必须通过 /sys/block/xxx/queue/scheduler 这类 sysfs 接口操作,lsblk 工具不读取也不暴露该路径。
如何正确查看当前 IO 调度算法
要确认某块设备(如 sda 或 nvme0n1)当前使用的调度器:
执行命令:
cat /sys/block/sda/queue/scheduler
输出示例:
[mq-deadline] kyber bfq none
方括号 [] 内即为当前生效的调度器。
- 设备名需替换为你的真实磁盘名,可用 lsblk 或 lsblk -d 快速列出(例如:sdb、nvme0n1)
- NVMe 设备常显示 [none],表示绕过软件调度,由硬件自身管理;部分驱动下也可手动设为 kyber
- 若看到 none 且写入其他调度器失败,说明该设备不支持软件调度层
如何在线临时切换调度算法(无需重启)
需 root 权限,立即生效,但重启后恢复默认:
- 设为 bfq(适合桌面交互、多任务):
echo bfq > /sys/block/sda/queue/scheduler - 设为 kyber(适合 NVMe,强调低延迟读):
echo kyber > /sys/block/nvme0n1/queue/scheduler - 设为 none(SSD/NVMe 常用,最小开销):
echo none > /sys/block/sda/queue/scheduler
⚠️ 注意:
– 只能写入方括号中列出的选项,否则报 Invalid argument
– 不建议对根设备(如正在挂载 `/` 的 sda)激进切换,可能短暂卡顿
– 写入后务必再 cat 一次确认是否生效
如何永久设置 IO 调度算法
靠内核启动参数实现,对所有块设备统一生效:
- 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX_DEFAULT 行末尾添加:
elevator=bfq 或 elevator=kyber - 保存后更新 GRUB 配置:
Debian/Ubuntu:sudo update-grub
RHEL/CentOS:sudo grub2-mkconfig -o /boot/grub2/grub.cfg - 重启系统后才生效;若启动异常,可在 GRUB 启动菜单按 e 编辑临时删掉 elevator=xxx
? 提示:
– 该方式无法为不同设备(如 HDD 和 NVMe)分别指定调度器
– 如需 per-device 永久配置,可配合 udev 规则(例如匹配 nvme* 自动 echo kyber)
各调度器适用场景简明对照
- bfq:桌面环境、多用户交互、需要响应公平性(如浏览器、音视频播放)
- kyber:NVMe 设备,尤其重视同步读延迟(如数据库查询、实时日志读取)
- none:现代 NVMe/SSD、硬件 RAID 卡、虚拟机磁盘(由底层调度)
- mq-deadline:传统数据库、OLTP 场景,兼顾延迟与吞吐
实际效果因负载类型、内核版本、硬件固件而异,建议搭配 iostat -x 1 或 iotop 对比切换前后的 await、%util、r/s w/s 等指标。


















