TL; DR
- 在 Meta 的规模下,延迟退化几毫秒就会对广告性能产生显著的负面影响。
- 当 Linux 内核升级可能导致 Meta 广告投放集群的延迟出现倒退时,我们转向 sched_ext —— 这个上游、基于 BPF 的可扩展调度框架 —— 来构建一个针对广告投放工作负载定制的调度策略。
- 结果:广告检索阶段尾延迟(99 百分位)降低 28%,节省 3.28 兆瓦(MW)电力,以及广告排名数量增加 1.1%,证明针对工作负载的调度优化可以直接带来业务价值。
为什么广告延迟很重要
Meta 的广告服务集群在服务平台入口处平均每秒处理超过 500 万个请求,全天候所有变现表面总计超过 4000 亿次请求1。 每减少一毫秒的 p99 延迟,都能让平台上的广告对用户更具相关性,而更好的匹配意味着广告主获得更强的投资回报。

这为通过针对工作负载的调度来降低延迟提供了真正的机会。这也是为什么我们的广告和 Linux 内核团队一直合作,使用 sched_ext —— 这个上游、基于 BPF 的可扩展调度框架 —— 构建一个针对广告投放工作负载定制的调度策略。直到现在,我们一直在使用 Linux 内核中通常集成的通用调度器(CFS 和 EEVDF),它们在不了解工作负载的情况下将线程平衡到 CPU 上。然而,在这里我们知道每个线程的目的和重要性。借助 sched_ext,我们可以将这些知识直接编码到调度器中。改善 p99 请求延迟的工作会被优先调度,其他一切工作则退居其次。
sched_ext 在 Meta 的应用
sched_ext 是一个开源的、基于 BPF 的调度器框架,已正式进入 kernel v6.12。我们通过与 Google 的 ghOSt 作者合作,设计了一个适合上游 Linux 集成的调度器。它已经在 Meta 的多个服务中部署,带来了显著的调度延迟降低。
在将我们的集群升级到最新稳定版 Linux(kernel v6.9)时,我们观察到在 Linux kernel v6.6 中引入的 Earliest Eligible Virtual Deadline First (EEVDF) 调度器导致了延迟倒退,降低了响应中排名广告的数量。因此,部分广告主机被迫继续使用较旧的 v6.4 内核,造成了技术债务和运维碎片化。
鉴于其已有的强劲性能,sched_ext 成为解决这些调度倒退问题的理想候选方案。
使用 sched_ext 进行定制调度
Sched_ext 允许调度器开发者将他们首选的调度策略实现为 BPF 程序。当主机开始运行广告工作负载时,会应用针对广告优化的策略。此后,内核会通过一组事件驱动的回调函数调用 BPF 调度器,以处理常见的调度事件,例如:
- 线程唤醒:当线程变为可运行状态时选择 CPU。
- 入队:将线程放入运行队列。
- 派发:当 CPU 空闲时选择下一个线程。
- 空闲状态转换:响应 CPU 进入/退出空闲状态。
从高层来看,该策略将 CPU 软分区为两个池,一个用于延迟关键请求路径上的线程,另一个用于延迟敏感度较低的工作。哪个线程进入哪个池是策略中编码的领域特定知识的一部分。每个池的大小使用基于负载的启发式方法动态调整。这种方法倾向于随着时间的推移将相关工作保持在相同的 CPU 上,改善末级缓存(L3)局部性并减少昂贵的 DRAM 访问。
该策略被打包为一个用户态二进制文件,用于加载 BPF 程序。这种设计使得实验和性能优化更快。要推出变更,我们只需重启调度器进程即可卸载旧策略并加载新策略,而无需重新构建或重新安装内核。
结果与影响
初始上线是在最大的广告服务服务器类型上,从使用 CFS 调度器的 kernel 6.4 切换到使用 sched_ext 的 kernel 6.9。根据回测实验,上线带来了:
- 加权广告排名数 +1.1%(检索并排名的广告数量指标)。
- 全集群节省 3.28 兆瓦电力。
- 广告检索路径服务 p99 延迟降低 28%2。
复合改进。随后两次仅作为用户态变更交付的调度器策略更新,进一步扩大了收益:
- 服务 p99 延迟额外降低 60%。
- 关键路径超时错误减少 18%。
这是一项非同小可的成果,且无需依赖内核发布。上述每次后续迭代都以天而非月为单位交付,因为调度器策略以 BPF 程序的形式存在于用户态。这种节奏将 sched_ext 从“内核升级解锁器”转变为广告服务的持续优化平台。

从短期修复到战略资产
最初作为针对特定运维问题的针对性响应,现在已经发展成为比我们最初预期的更具战略意义且更广泛适用的方案。sched_ext 为 Meta 带来了几项关键益处:
并行且解耦的调度器优化路径。上游 Linux 调度自然会随时间演进,有时会发生较大步进(例如 CFS 到 EEVDF 的过渡),这可能会对下游使用者造成干扰。sched_ext 为 Meta 提供了灵活性,使我们能够在这种演进的同时持续改进这些定制调度器。我们运行并优化自己的基于 BPF 的调度逻辑,针对我们生产工作负载的独特需求进行定制,因此无论上游发生什么变化,我们的关键服务都能保持优化状态。
独立部署并降低开销。调度器改进以 BPF 程序更新的形式交付,几天内即可完成,而非数月。实验成本的降低具有变革性。以前需要内核补丁和数月验证的想法——本地缓存感知放置、基于 ROI 的执行器路由、NUMA 感知引导——现在变成了可行的迭代,而非重大项目。
共享的行业资产。sched_ext 已被上游合并到 Linux v6.12,因此 Meta 在此使用的相同机制现在可供整个 Linux 生态系统使用。任何工作负载不符合通用模型的运维者——超大规模服务商、云提供商、嵌入式系统团队——都可以发布针对工作负载的调度策略,而无需分叉内核。
未来计划
sched_ext 已经让我们看到了进一步提升广告性能的机会,因为它让应用能够对调度器的行为进行更细粒度的控制。例如,广告服务拥有关于服务请求相对重要性的重要上下文,并且可能能够向调度器发出信号,指示何时线程开始处理重要请求。当调度器收到此提示时,它可以采取适当措施,例如增加该线程的调度时间片或确保它始终位于队列顶部。
致谢
特别感谢 Samuel Nair、Usama Arif、GP Musumeci、Praveen Alevoor、Ye Wang,以及更广泛的广告容量效率和内核团队的贡献与合作。
广告基础设施领导团队:Uladzimir Pashkevich、 Varna Puvvada、 Prabhakar Goyal、 Neeraj Agrawal、 Tak Yan、Liz Shepherd、Drew Lackman
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.