Linux IO 调度器选择与配置指南
详解 Linux I/O 调度器选择与配置,HDD 推荐 mq-deadline/deadline、SSD/NVMe 使用 none/noop,通过 udev 规则持久化,覆盖调度器查看与切换命令,含 Ubuntu 22.04 实测回显。
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伪文件查看/切换。
调度器选型原则
| 设备类型 | 推荐调度器 | 说明 |
|---|---|---|
| 机械硬盘 HDD | mq-deadline(旧内核 deadline) | 对读写请求设置截止时间,保证延迟有界,适合有寻道开销的 HDD |
| SSD | mq-deadline 或 none | SSD 无寻道,deadline 或 none 均可 |
| NVMe / 高性能 SSD | none(无调度器,直通) | 由设备端与协议层自身优化,减少内核队列开销 |
| 虚拟化/云盘 | 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