[Industry News] Linux内核为什么需要sched_ext调度
Tofloor
poster avatar
mozixun
Moderator
2026-09-25 17:09
Author

概要:

如果你嫌下面那些话你看不懂或者不想看, 那么用人话说就是: 做Linux适配的CPU/整机厂商可以在不需要修改内核的前提下, 自己亲手定制针对整机特调的Linux进程调度, 而且可以针对某一场景特调到底

sched_ext是一个让Linux内核直接拥有安卓那样的灵活调度方案(安卓实现调度是:厂商基于EAS优化的内核+用户空间调度,例如fas-rs)的实现, 它让调度进程跑在用户空间, 而其本体作为框架运行在内核空间

以下为腾讯元宝生成的内容:

sched_ext(也叫 SCX)不是“又一个调度算法”,而是 Linux 里新增的一个可热插拔的调度框架:把“怎么挑 CPU、怎么排队、怎么发任务”这套策略用 BPF 程序写出来,内核只负责底层上下文切换、运行队列、安全兜底。它进主线是 Linux 6.12(2024-11),官方定位见内核文档与合入提交。

一、一句话:为什么内核需要它

通用调度器(早先 CFS,现在很多场景用 EEVDF)追求“对所有人都别太差”;但现代硬件和负载越来越不通用——游戏渲染线程、数据库 OLTP、广告排序、VM 调度、NUMA/CCX 缓存局部性、内存带宽隔离,各自要的“公平”不一样。过去想给某类负载定制调度,要么改内核重编重启,要么维护私有内核;sched_ext 让你用 BPF 写策略、运行时加载/卸载、出错自动回退 CFS/公平类,所以内核才需要它。

类比:CFS 像全市统一红绿灯,保证不堵死但不够“专线”;sched_ext 像给某个园区临时装可编程红绿灯,规则用 BPF 写,写错了立刻切回统一红绿灯。

二、它解决哪三个真问题

  1. 实验成本太高
    直接改核心调度器要懂整套 sched_class、重编内核、重启、预热负载;数据中心预热 Memcached 都要几小时,学术圈学生还没跑完实验就毕业了。sched_ext 把复杂 sched_class 回调封装成更简单的 struct sched_ext_ops,只写关心的回调,加载即生效。
  2. 通用策略覆盖不到的专用负载
    比如:OLTP 要尾延迟、分析查询要吞吐;游戏渲染要低延迟、备份要少抢核;某批低优任务狂吃内存带宽拖垮高优任务。BPF 调度器可按 cgroup、任务属性、NUMA/CCX、IPC/缓存热度自定义排队和切片,不用进主线也能先跑。
  3. 生产环境快速灰度/回滚

    三、它到底怎么工作(形象版)

    • 新增调度类 SCHED_EXT,类优先级在 stop > dl > rt > fair(CFS/EEVDF) > ext > idle 这一串里,位于 fair 之下、idle 之上;不加载 BPF 时 SCHED_EXT 等价于普通公平调度,不会把系统劫持。
    • BPF 侧实现回调:select_cpu(唤醒选核)、enqueue(入队/发到调度队列)、dispatch/consume(CPU 空了取任务)、update_idle、running/stopping 等;只填 .name 也能跑,其余有默认行为。
    • 中间用 DSQ(dispatch queue,简单 FIFO)解耦:默认每个 CPU 一个 local DSQ,全局一个 global DSQ,也可自建“按 NUMA/按 CCX/按 cgroup/按业务”的 DSQ。BPF 内部想用 rbtree 算 vruntime、用 map 算优先级都行,最终把可运行任务“投”到 DSQ,内核来真正上 CPU。
    • 唤醒时不把任务绑死在某 CPU 运行队列,先由策略决定分组/发队列,真正运行前再落到具体 rq,所以能做全局或子域负载均衡。
    • 开关方式:加载 BPF 调度器可用 scx_bpf_switch_all() 把所有非实时任务交给 ext;也可设 SCX_OPS_SWITCH_PARTIAL,只让显式 SCHED_EXT 的任务走 ext,其余继续 CFS,方便灰度共存。

    四、为什么“安全”才敢用

    这是它需要存在的另一半原因——可插拔调度最怕把机器调度死。

    • 加载前 BPF verifier 静态检查:不能野指针、不能死循环、不能越权。
    • 运行期看门狗:任务可运行但长时间没被调度(默认约 30s 超时,可配短),或 BPF 回调返回非法值/报错/panic,内核自动 abort 这个 BPF 调度器,把所有任务退回公平类。
    • SysRq-S 手动回退,SysRq-D 打调试快照;进 bypass 模式时临时用默认路径跑,不影响系统完整性。
    • 因为走 BPF struct_ops,没有 UAPI 强绑定,内核可以改回调接口,不像传统系统调用那样被长期锁死。

    五、什么时候该想到它(而不是硬改 CFS)

    • 某类任务尾延迟敏感:游戏/桌面交互/OLTP/交易——用延迟优先的 scx(如 lavd/bpfland 思路)
    • 混合负载隔离:OLTP vs 分析、在线 vs 离线、广告排序 vs 检索——按 cgroup/优先级单独排队
    • 非对称/复杂拓扑:AMD CCX 多 L3、NUMA、大小核、内存带宽瓶颈——按缓存域和带宽节流自定义选核
    • 临时避险:新 CPU 微码/硬件缺陷、突发资源争用,先上 BPF 策略兜底,后续再决定进主线

    六、边界要讲清

    • 它不是用来“取代 CFS/EEVDF”的,主线仍要通用调度器;很多实验成果反过来会合进通用类(如 shared-runqueue 思路就受 sched_ext 实验推动)。
    • 用它能省事,但 BPF 调度路径有额外开销(资料估算每调度决策约增加几百 ns 级,HFT/低延迟音频要实测);极硬实时别用它代替 SCHED_DEADLINE/RT。
    • 内核要开 CONFIG_SCHED_CLASS_EXT、CONFIG_BPF、BPF_JIT、DEBUG_INFO_BTF 等;加载要特权(CAP_SYS_ADMIN),调度器代码 GPL 通过 verifier。

    官方文档入口:https://docs.kernel.org/scheduler/sched-ext.html ,概述/动机 https://sched-ext.com/docs/OVERVIEW ;内核样例在 tools/sched_ext(scx_simple 等)。

Reply Favorite View the author
All Replies
avatar
𰻞𰻝面
deepin
2026-09-25 17:38
#1

普通人用不到

Reply View the author
avatar
mozixun
Moderator
2026-09-25 17:43
#2
𰻞𰻝面:

普通人用不到

Steam Deck: 下次发言的时候记得先仔细百度一下, 哪怕问一下AI

Reply View the author
avatar
𰻞𰻝面
deepin
2026-09-25 17:46
#3
mozixun:

Steam Deck: 下次发言的时候记得先仔细百度一下, 哪怕问一下AI

开发者用的,普通人用不到

Reply View the author
avatar
kernel-cachyos-bot
deepin
2026-09-25 19:22
#4
𰻞𰻝面:

开发者用的,普通人用不到

意思是你的手机不需要任何调度就能工作吗, 你的意思是你的手机不需要任何厂商调度就能运行起来而且满足生活日用的各项负载还要做到低功耗? 你的手机设置里"省电模式","均衡模式","性能模式"就是你在控制调度的实现, 到目前为止我没有见过你的意思的这种手机

Reply View the author