关注了就能看到更多这么棒的文章哦~
Removing the scheduler's energy-margin heuristic
Removing the scheduler's energy-margin heuristich
DeepL assisted translation
https://lwn.net/Articles/899303/
CPU scheduler 的工作总是挺困难的;它必须找到一种方法来把 CPU 时间分配给系统中的所有任务,必须要是公平的,能允许所有的任务都有进展,并使整个系统的吞吐量(throughput)最大化。最近,它又收到了一个新要求:最大限度地减少系统的能耗。目前有一个由 Vincent Donnefort 和 Dietmar Eggemann 合作发布的 patch set 正在讨论中,它对满足这个要求的实现方式进行了更改。实际的变动并不大,但它说明了我们在撰写正确的启发式规则上是有多么困难。
当然,减少能耗是值得关注的目标;毕竟,节省下来能源我们就可以用来开采更多的加密货币了。也有一些不那么重要的考虑点,比如环境问题,虽然节省能耗的目标之一正是保护环境,但越来越多的使用电池供电的设备却又为这一任务增加了更多的紧迫性。如果能让电池的寿命更长的话,那么让人崩溃的手机没电等情况就会减少,用户也会更高兴。
这些需求从而导致开发者们在内核中添加了 energy-aware scheduling。当 scheduler 在决定如何在系统中安放某个 task 时,它会努力减少系统整体的能源消耗;措施包括让 CPU 运行在针对当前 workload 来说最小可能的功耗情况下,并每当可能的时候就完全关闭处理器的电源。例如,如果目前运行在某个特定功率范围的 CPU 可以接受另一个 task,并不需要提高到更高的功耗,那么就应该将这个 task 从另一个 CPU 转移过来。
2018 年,Quentin Perret 的 patch(是 energy-aware scheduling patch set 的一部分)给调度器添加了一个名为 find_energy_efficient_cpu()的函数;它的目标就是为一个特定的 task 找到最佳位置(从节省能源消耗的角度)。其中所使用的启发式方法的核心是在每个 "performance domain"(也就是一组 CPU, 它们的能耗是互相关联的)中找到最空闲的 CPU,并估计将任务放在该 CPU 上会产生多大的能源成本(或节省多少)。这里最空闲的 CPU 最有可能保持在低功耗状态,所以给它安排一些额外工作是很合理的。
然而,将一个 task 从某个 CPU 转移到另一个 CPU 是有代价的;该 task 可能会得抛弃掉一部分或所有的内存 cache 内容,这将使其运行速度变慢。这就影响了性能,也不利于节省能源,所以应该尽可能地避免这种情况。作为防止任务在 CPU 之间迁移过多的一种方法,find_energy_efficient_cpu() 只在算出移动之后能比运行在之前 CPU 上所好能耗节省超过 6% 的情况下才会移动该任务。
不过,为了计算最佳 CPU,会有很多开销,导致 scheduler 的决策增加了不必要的延迟。因此,Perret 在 2019 年的 5.4 内核中进行了重新设计。目的就是以较少的 CPU 开销来获得相同的结果;那个 patch 的 changelog 里说 "不打算进行功能上的变动"。但事实证明,这里有一个很微妙的变动,显然逃脱了人们的 review:6%的数值现在是与整个系统所使用的能耗来作为基数了,而不仅仅是一个任务之前运行的 CPU 的能耗。这是一个相对比较高的标准了,在一个拥有足够多 CPU 的系统中,一般来说 task 很可能就永远都不会满足这个条件了。
哪怕是在较小型的系统上,这个新规则在许多情况下也事实上阻止了 task 的迁移。这在有相对较多的小 task 运行的情况下尤其如此。而这种情况经常出现在安卓设备上,并且这里能耗问题是非常重要的问题。如果它不再能够移动 task 来节省能源,那么 find_energy_efficient_cpu()所做的所有工作都被浪费了,设备的运行效率也比原来要低。
一个明显的解决方案就是撤销 5.4 版本对算法的修改,但是,Donnefort 说,"原始版本的实现其实也没有什么充分的理由"。事实上,对于 6%这个数字,从来没有人能给出任何理由,在第四版 patch set 中提高到 6%之前,这个数字还只是 1.5%。它最大的特点可能是比较容易用右移操作来进行近似计算。Donnefort 得出的结论是,最好是直接完全删除这个判断,只要看起来 task 迁移可以节省能耗,那么就进行这个迁移。
根据与 patch set 一起发布的 benchmark,这个做法确实取得了更好的能耗性能比。在视频 benchmark 中最多可以减少 5.6%。在一些测试中,CPU 性能略有下降,但变化似乎并不明显。正如 Donnefort 所说:
去除边界数据后,内核可以最好地利用能源模型(Energy Model),task 可以有更高的可能性被放在它们最适合的地方,这可以节省大量功耗,同时对性能的影响也很有限。
这一变动的一个可能的缺点就是增加了 task 在 CPU 之间的跳动,但 Donnefort 说,测试中 "没有显示出问题"。
这个 patch set 已经是第 11 次修改了,主要是根据 review 意见进行了一些改动。对于这个版本,调度器的维护者 Peter Zijlstra 只说了一句话。"谢谢!"。这样看来,删除 6% 的启发式条件是有其合理性的,而且迟早会进入 mainline。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~