LWN:分层固定带宽服务调度器!

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

The hierarchical constant bandwidth server scheduler

By Jonathan Corbet
June 18, 2025
Gemini flash translation
https://lwn.net/Articles/1024757/

POSIX 实时模型(realtime model) 在 Linux 内核中完成实现,可以确保实时进程获得完成其工作所需的 CPU 时间。然而,当有多个实时进程争夺可用的 CPU 资源时,它的效率可能会降低。由 Yuri Andriaccio 发布,并由 Luca Abeni、Alessio Balsini 和 Andrea Parri 参与工作的 分层常数带宽服务器(hierarchical constant bandwidth server, HCBS)补丁系列是对 Linux 调度器的一项修改,旨在以确定且正确的方式配置包含多个实时任务的系统。

POSIX 实时模型的核心概念是优先级——最高优先级的任务总是运行。如果多个进程具有相同的优先级,结果取决于它们是配置为 SCHED_FIFO 任务(在这种情况下,正在运行的任务会一直占用 CPU 直到其自愿放弃)还是 SCHED_RR 任务(导致相同优先级的任务以时间片轮转的方式共享 CPU )。这种模型允许单个实时任务无限期地独占一个 CPU,这可能会牺牲也需要运行的其他实时任务的利益。

为了改进对包含多个实时任务的系统的支持,Peter Zijlstra 于 2008 年在 2.6.25 内核中添加了 实时组调度(realtime group scheduling)功能。它允许系统管理员将实时任务放入控制组中,然后限制每个组可用的 CPU 时间量。此功能有效并已被使用,但它从未被视为最佳解决方案。它很容易配置不当(文档警告说:“随意更改这些设置可能会导致系统不稳定”),以多种方式使调度器复杂化,并且缺乏坚实的理论基础。

内核开发者并非总是被理论证明强烈驱动,他们更喜欢观察实际系统如何运行。但在实时领域,一定程度的严谨性是必要的。例如,如果一个实时系统被用于在繁忙的高速公路上引导机动车辆,那么在该系统需要 CPU 时间时,它能够快速获得所需的 CPU 时间就显得非常重要。“它似乎在大多数时间都能正常工作”对于此类应用来说被认为是不够的。

实时组调度所追求的目标被称为“常数带宽服务器”(constant bandwidth server, CBS)调度器。在这种系统中,每个任务都由两个参数来描述:它需要的 CPU 时间量(“最坏情况执行时间”)以及它需要该时间段的频率(“周期”)。在一个正确配置的系统中,调度器可以确保每个实时任务在需要时获得所需的 CPU 时间。目前内核中 确实 有一个 CBS 调度器,即截止期限调度器(deadline scheduler)(详情请参阅备受怀念的 Daniel Bristot de Oliveira 撰写的 这篇文章),但该调度器并非分层的,并且要求实时任务是专门为其编写的。

分层 CBS 服务器是 CBS 概念的扩展,允许将多个实时任务组织(和控制)在一个层次结构中——特别是在 Linux 系统上的控制组层次结构中。它最早在 Giuseppe Lipari 和 Sanjoy Baruah 于 2001 年发表的这篇论文中被描述。当然,实际的实现与学术论文有所不同,但它依赖于该论文的理论基础。

当在分层常数带宽服务器下运行时,每个控制组有两个旋钮来控制资源预留: cpu.rt_period_us (周期)和 cpu.rt_runtime_us (所需的 CPU 时间);这两个旋钮都以微秒表示。如果将 cpu.rt_period_us 设置为 1000000 ,并将 cpu.rt_runtime_us 设置为 100000 ,那么放置在该控制组中的任务将有权每秒获得 100 毫秒的 CPU 时间,即占用单个 CPU 的 10%。在该组内部,任务将使用正常的优先级规则相互竞争。

为了实现这一保证,分层 CBS 调度器重用了最初为不同目的添加的机制:截止期限服务器(deadline server)。长期以来,为普通优先级任务预留少量 CPU 时间一直被认为很重要,即使实时任务想要获得所有可用的时间。这扇小小的“时间窗”可以用于,例如,在实时任务失控且不释放 CPU 时重新获得系统控制权。

过去,实现这种行为已被证明具有挑战性;多年来,一直使用节流机制将实时任务从 CPU 中推出,占用可用时间的 5%(默认)。然而,即使没有其他任务需要运行,这种排除也会发生,导致在实时任务可运行时 CPU 处于空闲状态。这种行为激怒了开发者,最终找到了一项解决方案。

该解决方案是创建一个名为“截止期限服务器”的特殊任务,该任务将在截止期限调度器(deadline scheduler)下运行。在 Linux 下,截止期限任务拥有所有任务中的最高优先级,甚至可以推开 POSIX 实时任务。截止期限服务器被配置为这样运行:它有权占用可用 CPU 时间的 5%(每秒 50 毫秒);它利用这段时间来运行普通优先级运行队列中的任务。如果有任务正在等待运行,截止期限服务器会确保它们有机会运行;相反,如果没有可运行的任务,截止期限服务器就会放弃 CPU,使其可供任何可能正在争夺它的实时任务使用。

因此,截止期限服务器的添加是为了确保非实时任务能够运行,但它们也可以用于实时任务。当一个控制组被配置为在分层 CBS 服务器下运行时,一个截止期限服务器会被设置,以该组配置的执行时间和周期来运行。当截止期限服务器运行时,它将以通常的方式调度该组内的任务,确保整个组获得分配给它的资源,即使系统中其他地方有更高优先级的实时任务试图运行。

该论文中描述的算法只设想了两级控制组层次结构,其中根组是其中一级。这对于大多数实际的实时应用程序来说应该足够了;过度的复杂性无助于设计一个正常运行的实时系统。即便如此,该系列中的最终补丁还是修改了实现,以允许更深的控制组层次结构。然而,只有叶子组(即没有子组的组)能够包含实时任务。考虑到 CBS 中使用了绝对 CPU 时间和周期值,多层控制不像在普通(非实时)组调度中那样有意义。

最终的结果是一个有望比实时组调度更具确定性,同时对调度器代码影响更小的解决方案。后者方面的一个积极迹象是,这个补丁系列在移除现有实时组代码后,在添加新功能的同时,将调度器的大小减少了近 400 行。

这项工作在 2025 年 Linux 内核电源管理和调度峰会上进行了讨论,因此应该就其发展方向达成了普遍共识。截至本文撰写之时,已发布的系列补丁的评论数量很少;随着其他开发者有机会审阅代码,这种情况可能会随时间而改变。无论如何,这种性质的更改在被认为准备好进入主线内核(mainline kernel)之前可能需要一段时间;一如既往,永远不应假设截止期限适用于实时补丁的接受。

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值