lsblk -d 不显示io调度器,因其仅展示设备静态属性,而调度器是内核块层运行时策略,需通过 cat /sys/block/sda/queue/scheduler 查看,方括号内为当前生效项。

lsblk -d 不能查看或调整 IO 调度算法。
为什么 lsblk -d 不显示调度器信息
lsblk 是一个块设备信息展示工具,它读取 /sys/block/ 和 udev 数据,用于显示设备名称、大小、类型、挂载点、文件系统等静态属性。
IO 调度器(如 deadline、mq-deadline)属于内核块层的运行时策略,其状态保存在 /sys/block/sda/queue/scheduler 这类可写接口中,lsblk 不解析也不暴露该路径内容。
即使加了 -d(仅显示磁盘,不显示分区),它依然不包含 scheduler 字段。
正确查看当前调度器的方法
使用以下命令直接读取 sysfs 接口:
- 查看某块设备(如 sda)当前调度器:
cat /sys/block/sda/queue/scheduler
输出形如:noop [deadline] bfq none,方括号内为当前生效项 - 确认设备名可用 lsblk 或 lsblk -d 获取参考,但实际查调度器必须用 sysfs 路径
- 对 NVMe 设备(如 nvme0n1),路径为:cat /sys/block/nvme0n1/queue/scheduler;5.0+ 内核常显示 [none]
如何设置 deadline 或 mq-deadline
Linux 中的 deadline 调度器在较新内核(如 5.0+)已被 mq-deadline 取代(专为多队列块层设计),二者逻辑相似,但 mq-deadline 是默认启用的现代版本。
- 临时切换(重启失效):
echo mq-deadline > /sys/block/sda/queue/scheduler
需 root 权限;执行后再次 cat 验证是否生效 - 永久生效(推荐方式):
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 行末添加:
elevator=mq-deadline
然后运行 sudo update-grub && sudo reboot - 注意:部分发行版(如 RHEL/CentOS 8+、Ubuntu 20.04+)默认已用 mq-deadline;若看到 [none],说明设备(如 NVMe)被内核自动绕过调度,无需强制设为 mq-deadline
适用场景与验证建议
- mq-deadline 适合传统 HDD、RAID 卡、数据库(MySQL/PostgreSQL)等强调响应确定性的场景
- SSD/NVMe 通常用 none 或 noop,设 mq-deadline 可能增加延迟、无实质收益
- 修改前后建议用 iostat -x 1 或 iotop 观察 await、svctm、%util 等指标变化
- 虚拟机宿主机上,建议由底层调度,客户机统一用 noop











