首页/系统/Linux 运维命令速查/IO 调度器选择与检查
性能与监控48 条

IO 调度器选择与检查

块设备调度器影响延迟与吞吐:NVMe/SSD 常用 none(或 mq-deadline)、机械盘 mq-deadline;用 /sys/block/*/queue/scheduler 查看与调整。

Linux 运维命令速查系统更新于 2026-10-13

命令是干什么的

块设备的 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   # 切档位,内部会设置推荐的调度器

调度器选择对照

调度器适合的设备与负载说明
noneNVMe、高性能企业级 SSD不做内核排队,请求直接进设备自身队列,延迟最低
mq-deadline机械盘、通用服务器盘读写分别排队并给读请求较短超时,兼顾吞吐与延迟上限
kyber低延迟 SSD、对响应敏感的业务按延迟目标控制队列,按请求类型分域限流
bfq机械盘、单队列设备、桌面交互按进程公平分配带宽,改善卡顿,吞吐有牺牲
老内核 noop/deadline/cfq仅 4.20 之前的内核新内核已移除,照旧文档配置会报无此参数
先看设备类型再选:rotational 为 0 通常是固态或虚拟盘。虚拟化盘不要照搬物理机结论,以宿主机和云厂商的建议为准。
调度器是运行期参数,直接写 sysfs 重启就回退,要长期生效必须用 udev 规则或 tuned 档位固化。
udev 规则和 tuned 同时存在时,谁后执行谁生效,现象会变得不稳定,同一台机器只保留一种写入机制。

易错点

  • 只写 sysfs 不持久化,重启回退原值,性能问题以时好时坏的形态反复出现,最后被误判成偶发抖动
  • 机械盘上设成 none:失去寻道排序与请求合并,随机 IO 的延迟和吞吐一起恶化,属于方向性错误
  • 在容器里改 /sys/block 下的调度器:容器看到的是只读或与宿主不同的视图,改动不落地,要在宿主机上操作
  • 照抄老文章的内核参数 elevator=noop:4.20 之后单队列调度器已移除,参数被忽略,以为改了其实没改
  • udev 规则里用写死的设备名匹配:磁盘顺序变化后规则作用到别的设备上,建议用稳定标识或匹配设备属性

数据来源与参考

  • 内核文档:block/(调度器说明)
  • Red Hat 性能调优指南(IO 调度器)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌