命令是干什么的
块设备的 IO 调度器决定内核如何排队、合并与排序发往磁盘的请求,直接影响延迟和吞吐。查看与调整的入口是每个设备自己的 /sys/block/设备名/queue/scheduler,方括号里的那一项才是当前生效的策略。选型主要看设备类型:NVMe 和高性能 SSD 交给设备自身的多队列最快,机械盘需要调度器做寻道排序,桌面交互场景更在乎公平性。4.20 到 5.0 之后内核只保留多队列调度器,老文章里的 noop、deadline、cfq 在新内核上已经不存在。
基本信息
| 适用平台 | Linux 内核块层;4.20 之后为多队列体系(blk-mq) |
|---|---|
| 查看入口 | /sys/block/设备名/queue/scheduler,方括号内是当前生效值 |
| 常见取值 | none、mq-deadline、kyber、bfq;老内核为 noop、deadline、cfq |
| 相关参数 | queue/rotational 判断盘类型,queue/nr_requests 是队列深度 |
| 固化方式 | udev 规则、tuned 性能档位,或发行版默认配置 |
| 权限要求 | 读取任意用户可看,写入需要 root |
典型使用场景
- NVMe 数据库盘尾延迟偏高时,确认调度器是否被系统默认档位改成了带额外排队的策略
- 机械盘做顺序写和备份,用排序合并能力换吞吐,避免随机 IO 把盘打满
- 虚拟化与云主机先确认是透传设备还是虚拟盘,调度器结论不能照搬物理机
- 桌面与交互式终端切到 bfq,改善输入和窗口切换时的卡顿感
- 上线前基线核对:把调度器写进初始化脚本或 udev 规则,防止重启后悄悄回退
查看与临时调整
查看与临时调整
cat /sys/block/nvme0n1/queue/scheduler # 输出形如 [none] mq-deadline kyber bfq
cat /sys/block/sda/queue/scheduler # 机械盘或 SATA SSD 常见 [mq-deadline]
cat /sys/block/sda/queue/rotational # 1 表示机械盘,0 表示固态或虚拟盘
cat /sys/block/nvme0n1/queue/nr_requests # 队列深度,配合调度器判断排队情况
uname -r # 先看内核版本,决定有哪些调度器可选
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler # 立即生效但不持久
cat /sys/block/sda/queue/scheduler # 复核方括号已经移到新策略上固化方式
固化方式
# 方式一:udev 规则 /etc/udev/rules.d/60-iosched.rules
# ACTION=="add|change", KERNEL=="nvme0n1", ATTR{queue/scheduler}="none"
sudo udevadm control --reload && sudo udevadm trigger # 规则改完重载并重新触发
# 方式二:交给 tuned,档位里已经包含调度器设置
tuned-adm active # 看当前生效的性能档位
tuned-adm list | head # 列出可用档位,例如 throughput-performance
tuned-adm profile throughput-performance # 切档位,内部会设置推荐的调度器调度器选择对照
| 调度器 | 适合的设备与负载 | 说明 |
|---|---|---|
| none | NVMe、高性能企业级 SSD | 不做内核排队,请求直接进设备自身队列,延迟最低 |
| mq-deadline | 机械盘、通用服务器盘 | 读写分别排队并给读请求较短超时,兼顾吞吐与延迟上限 |
| kyber | 低延迟 SSD、对响应敏感的业务 | 按延迟目标控制队列,按请求类型分域限流 |
| bfq | 机械盘、单队列设备、桌面交互 | 按进程公平分配带宽,改善卡顿,吞吐有牺牲 |
| 老内核 noop/deadline/cfq | 仅 4.20 之前的内核 | 新内核已移除,照旧文档配置会报无此参数 |
先看设备类型再选:rotational 为 0 通常是固态或虚拟盘。虚拟化盘不要照搬物理机结论,以宿主机和云厂商的建议为准。
调度器是运行期参数,直接写 sysfs 重启就回退,要长期生效必须用 udev 规则或 tuned 档位固化。
udev 规则和 tuned 同时存在时,谁后执行谁生效,现象会变得不稳定,同一台机器只保留一种写入机制。