Linux IO 调度器选择与配置指南

详解 Linux I/O 调度器选择与配置,HDD 推荐 mq-deadline/deadline、SSD/NVMe 使用 none/noop,通过 udev 规则持久化,覆盖调度器查看与切换命令,含 Ubuntu 22.04 实测回显。

Linux性能优化与调优I/O调度2026/09/29

Linux IO 调度器选择与配置指南

目标:为 HDD、SSD、NVMe 选择合适的 I/O 调度器并持久化配置:HDD 使用 mq-deadline/deadline,SSD/NVMe 使用 none(等效 noop),通过 udev 规则实现设备启动自动生效。本文命令在 Ubuntu 22.04(内核 6.8.0,多队列 blk-mq)实测。

环境信息

  • 操作系统:Ubuntu 22.04.5 LTS;内核:6.8.0-138-generic
  • 实测调度器:cat /sys/block/sda/queue/scheduler 输出 none [mq-deadline]
  • 新内核(6.x)已全面采用多队列 blk-mq,块设备调度器为 none 或 mq-deadline

前置条件

  • root 权限;具备物理块设备(如 /dev/sda,本实验在服务器内以 loop/sda 演示)。
  • 调度器通过块设备队列的 scheduler 伪文件查看/切换。

调度器选型原则

设备类型推荐调度器说明
机械硬盘 HDDmq-deadline(旧内核 deadline)对读写请求设置截止时间,保证延迟有界,适合有寻道开销的 HDD
SSDmq-deadline 或 noneSSD 无寻道,deadline 或 none 均可
NVMe / 高性能 SSDnone(无调度器,直通)由设备端与协议层自身优化,减少内核队列开销
虚拟化/云盘none 或 mq-deadline后端通常已有排队,前端 none 更推荐

💡 说明:none 在 blk-mq 下即"无内核调度器",等效传统 noop(FIFO 直达设备)。现代内核里 noop 已被 none 取代。

查看当前调度器

# 查看某块设备调度器([] 内为当前生效项)
cat /sys/block/sda/queue/scheduler
# none [mq-deadline]

# 列出全部块设备
lsblk -d -o NAME,SCHED

临时切换调度器

# 临时切换到 none(立即生效,重启失效)
echo none > /sys/block/sda/queue/scheduler

# 切换到 mq-deadline
echo mq-deadline > /sys/block/sda/queue/scheduler

# 验证
cat /sys/block/sda/queue/scheduler

通过 udev 规则持久化

为设备持久化调度器,推荐使用 udev 规则,亦可按设备属性(如 queue/rotational=1 为 HDD、=0 为 SSD)自动区分。

/etc/udev/rules.d/60-io-scheduler.rules:

# 按设备是否旋转(rotational=1 HDD / 0 SSD)自动选择调度器
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline"

# 或按具体设备指定
# KERNEL=="sda", SUBSYSTEM=="block", ACTION=="add|change", ATTR{queue/scheduler}="mq-deadline"
# 校验语法并重新加载规则
udevadm control --reload-rules
# 触发一次让规则生效(新增设备即自动生效)
udevadm trigger --subsystem-match=block
# 验证
cat /sys/block/sda/queue/scheduler

⚠️ 注意:不同发行版 udev 语法或有差异(SUBSYSTEM、ATTR 大小写),请以目标系统 man 7 udev 为准。云上 NVMe 多为 none,无需额外配置。

常见问题

Q:改了调度器对已运行的 IO 生效吗? A:生效。echo 调度器 > scheduler 会立即作用于新提交的 IO 请求,但正在排队的请求继续按旧调度策略处理。

Q:SSD 用 none 会不会丢请求? A:不会。none 只是不做内核排队调度,请求仍按 FIFO 交给设备,谈不上丢失。

Q:K8s/云盘环境该选哪个? A:云盘后台通常已是网络存储并自带排队,建议 none;本地裸盘按磁盘类型照上表。

卸载方式

删除 udev 规则文件并 udevadm control --reload-rules,或改回调度器默认。

参考链接

  • 内核文档:Documentation/block/queue-sysfs.rst、Documentation/admin-guide/iostats.rst
  • man udev、man udevadm
Linux IO 调度器选择与配置指南 - Quzuo