首页/系统/Linux 内核与性能调优速查/EEVDF 调度器(6.6 起)
CPU 与调度60 条

EEVDF 调度器(6.6 起)

内核 6.6 起默认调度器演进为 EEVDF(最早合格虚拟截止时间),改善延迟敏感任务的选择;调参项迁移到 sched_base_slice 等。

EEVDF 是什么

从 Linux 6.6 开始,CFS 被 EEVDF(Earliest Eligible Virtual Deadline First,最早合格虚拟截止期优先)取代,成为普通任务(SCHED_NORMAL)的默认调度器。它按「资格时间 + 虚拟截止期」选下一个任务:只有已获得应得份额、处于有资格状态的任务才能被选中,其中虚拟截止期最早的先运行。它保留了时间片概念,但把调参入口换成了 sched_base_slice_ns。

基本信息

引入版本Linux 6.6(2023 年发布)
取代对象CFS 作为 SCHED_NORMAL 的默认调度器
新参数sched_base_slice_ns(基础时间片,毫秒量级)
旧参数sched_latency_ns、sched_min_granularity_ns 在 6.6 及以上已移除
确认方法uname -r 与 ls /proc/sys/kernel/sched_*

典型使用场景

  • 内核升级后沿用旧调优脚本,需要先核对文件是否存在
  • 交互延迟敏感服务在换代后重新评估响应表现
  • 排查升级后延迟分布变化是否由调度器换代引起
  • 为延迟调优寻找新内核上实际可用的参数入口
  • 与 sched_ext、实时调度组等机制区分,避免归因错误

确认版本与参数

确认版本与参数
uname -r
ls /proc/sys/kernel/ | grep -E 'sched_(base_slice|latency|min_granularity)'
sysctl kernel.sched_base_slice_ns 2>/dev/null
zcat /proc/config.gz 2>/dev/null | grep -E 'CONFIG_SCHED_CLASS_EXT|CONFIG_FAIR_GROUP_SCHED'
vmstat 1 5 | tail -5                    # 观察 r 与 cs
cyclictest -p 80 -t 1 -i 1000 -l 10000 2>/dev/null | tail -5   # 若已安装,量化延迟分布

内核版本与参数

版本默认调度器相关调参
5.x 及更早CFSsched_latency_ns、sched_min_granularity_ns 等
6.6 及以后EEVDFsched_base_slice_ns
确认方式uname -r按版本决定该查哪组参数名
调度延迟类调优前先确认内核版本:旧 CFS 时代的经验参数在新内核上不一定适用,文件本身也可能已不存在。
EEVDF 并没有取消时间片,仍有基础片长与调度粒度,只是入口换名;旧脚本里的文件路径要整体复核。
sched_base_slice_ns 是基础片长,不是唯一决定因素:任务互相竞争时还会按权重与资格状态调整,实际运行时长要结合 niceness 一起看。
部分发行版或厂商内核会把新调度器特性回移到较低的大版本号上,因此以 ls /proc/sys/kernel 的实际文件为准,不要只看 uname -r 的主版本。

易错点

  • 照抄 CFS 时代调参:在 6.6 及以上内核写入 sched_latency_ns 会直接报文件不存在
  • 以为换代自动解决延迟问题:仍需 cyclictest、perf sched 等工具量化验证
  • 把 EEVDF 与其他机制混为一谈:它替代的是普通任务调度器,与实时调度组、sched_ext 是不同层面
  • 只在一台机器验证就推广:内核版本分布不一致,应分别建立基线
  • 升级内核前不留基线:升级后性能变化无法归因到调度器还是其他改动

数据来源与参考

  • Linux 内核 Documentation/scheduler/sched-design-CFS.rst
  • Linux 内核 6.6 发布说明(EEVDF 默认启用)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌