LWN:利用机器学习来更好地实现负载均衡!

关注了就能看到更多这么棒的文章哦~

Improved load balancing with machine learning

By Jonathan Corbet
July 1, 2025
OSSNA
Gemini flash translation
https://lwn.net/Articles/1027096/

扩展调度器类 ("sched_ext") 允许以一组 BPF (伯克利包过滤器) 函数的形式将自定义 CPU 调度器加载到内核中;它已在 6.12 内核版本中合入。自那时以来,sched_ext 使得调度算法的广泛实验成为可能。在 2025 年的 北美开源峰会 上,Ching-Chun ("Jim") Huang 介绍了将(本地)机器学习应用于复杂系统进程调度问题的工作。

Huang 首先回顾了 Linux 调度器开发的时间线,始于 2007 年采用完全公平调度器 (CFS)。为了特定用例,人们曾做出各种努力来编写 CFS 的替代品,其中值得注意的是 2009 年 Con Kolivas 提交的 BFS,以及 2016 年他提交的 MuQSS。2023 年,EEVDF 调度器 (Earliest Eligible Virtual Deadline First 调度器) 作为 CFS 的增强和最终替代品出现。最终,在经过广泛讨论后,次年 sched_ext 被合入。

他说,换句话说,从 CFS 时代开始到 Linux 中添加可扩展调度器,共花了 17 年。这段时间反映了一种长期存在的观点,即一个调度器可以适用于所有情况并达到最佳效果。林纳斯·托瓦兹在 2007 年清楚地表达了这一立场:

关于“服务器”与“桌面”配置文件不同的论点纯属胡说八道,是由那些不了解自己所说内容的人散布的。整个“服务器”和“桌面”调度不同的概念就是垃圾。

Huang 表示,自那时以来,情况已经发生了变化。2007 年,机器通常最多有四个 CPU,这些 CPU 彼此等效,工作负载相对简单。而到 2025 年,系统可以拥有超过 48 个异构 CPU 内核,并且对吞吐量、延迟和能耗有着复杂的要求。CFS(和 EEVDF)使用的启发式算法是为更简单的时代设计的,现在已不再是最佳选择。

现代系统的复杂性体现在多种形式。如果工作负载的调度位置远离其内存,NUMA (非统一内存访问) 系统可能会表现不佳。CFS 调度器经常做出糟糕的放置选择;结果,管理员被迫将进程绑定到特定的 CPU 或把系统分成几个部分来获得较好的性能。异构系统具有多种 CPU 类型,它们具有不同的性能和能耗特性,甚至指令集也不同。将任务放置在错误类型的 CPU 上会影响性能、浪费能源,在某些情况下甚至可能由于指令集不匹配而导致 crash。

如今所出现的工作负载类型也增加了自身的复杂性。例如,游戏工作负载通常结合了渲染和流媒体任务。渲染对延迟敏感,应在高性能核心上运行,而流媒体可以在更高效的核心上运行。一个平等对待这两种任务类型的调度器最终会导致掉帧。5G 网络中涉及的网络处理包含严格的延迟约束和 CPU 密集型工作。即使是现代开发环境也面临挑战,它结合了 CPU 密集型任务(例如编译)和交互式任务。糟糕的调度器决策可能导致大量的上下文切换和用户界面无响应。

Huang 表示,所有这些的最终结果是,任何使用单一、固定算法的调度器都从根本上是失效的。所有传统调度器正是如此。它们将简单的系统视图带入了一个普通计算机拥有数十亿种可能状态的世界,并且它们的局限性正在显现。

sched_ext 框架提供了一个潜在的解决方案,一个调度器可以演进以应对当代挑战的环境。Huang 以 Free5GC 项目 为案例研究,该项目正在为 5G 网络处理创建一个开源解决方案。其数据平面处理尤其受到许多严苛的约束。它有许多 CPU 密集型任务,但也有一些严格的延迟约束。CPU 调度器必须能够平衡这些约束;CFS 常常无法做到最佳。

该项目实验了一种名为 "scx_packet" 的 sched_ext 调度器。它使用了一个相对简单的算法:系统中一半的 CPU 保留给延迟敏感的网络处理任务,而另一半则用于 CPU 密集型通用处理。但是,这个调度器平等对待所有网络流量——语音通话、网页浏览和流媒体都流向相同的 CPU。这可能导致语音数据被下载流量阻塞,并且紧急呼叫与社交媒体活动具有相同的优先级。这种方法还导致一些 CPU 过载,而另一些则处于空闲状态,因为工作负载会发生转移。最后,有些数据包比其他数据包需要更多的处理;更 CPU 密集型的数据包的处理应该单独调度。

这一经验促使 Free5GC 开发人员研究机器学习。他说,在此类系统上进行调度需要考虑许多输入维度,这正是机器学习的“完美问题领域”。调度器必须考虑任务的优先级、CPU 需求、其当前的虚拟运行时间,以及最近的 CPU 使用模式。必须考虑每个 CPU 的负载,以及 NUMA 距离、缓存共享和运行频率。当然,还有特定工作负载相关的因素。

开发了一个新的 sched_ext 调度器(基于 scx_rusty),旨在将所有这些参数考虑在内,并决定何时将任务从一个 CPU 迁移到另一个。它最初以数据收集模式运行,查看迁移决策及其结果;然后这些决策用于训练一个模型(在用户空间中),该模型随后存储在一个 BPF map 中。调度器随后可以在内核内部使用此模型进行负载均衡决策。这些决策的结果会不断被测量并报告回用户空间,用户空间会随着时间的推移更新模型。

实现这个调度器需要克服内核环境特有的障碍。神经网络处理涉及相当多的浮点运算,但内核代码中不允许使用浮点指令(因为在进入内核时保存浮点单元状态会产生沉重的性能开销,所以内核不会这样做)。取而代之的是,神经网络处理采用了定点运算形式。

在一项使用至关重要的内核编译基准测试中,该调度器相比 EEVDF 调度器将编译时间提高了 10%。任务迁移的数量减少了 77%。

Huang 最后总结了机器学习在此背景下有效的原因。他说,在这种复杂环境中的调度是一个模式识别问题,而神经网络擅长这项任务。该调度器能够平衡相互竞争的目标,并为新的架构和工作负载自动再训练。调度器能够为每个迁移决策考虑 15 个不同的参数,并根据结果调整其模型。

感兴趣的读者可以查阅Huang演讲的幻灯片。基于机器学习的 sched_ext 调度器源代码可在 GitHub 上找到。

[感谢 Linux 基金会资助我参加本次活动。]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值