Linux 6.3 收到了一个 Linux CPU 调度程序修复补丁,修复了自 2019 年底以来一直存在于主线内核中的“ CFS 调度器计算不平衡导致的整数溢出” 问题。
该问题最先在英特尔至强可扩展 Sapphire Rapids 服务器上发现,自 2019 年 10 月被报告以来,一直存在于主线内核。当时报告该 Bug 的具体表现为:
CFS 的重新平衡算法存在问题,kernel/sched/fair.c 中的 calculate_imbalance 函数可能由于整数溢出错误导致产生的结果不正确。
该算法旨在将一些任务从最繁忙的组拉到本地组。但是当两个组都或将变得过载时,算法不会将本地组推到调度域的平均负载之上。
而且,在某些情况下,该平衡算法的计算可能是错误的,导致无意义的任务迁移,甚至放大不平衡。
Linaro 的 Vincent Guittot 已发送了一组修复补丁来处理该不平衡溢出问题。 他解释说,“当本地组完全繁忙但其平均负载高于系统负载时,计算不平衡将溢出,本地组不是拉动此负载的最佳目标。”
该修复补丁已紧急进入 Linux 6.3-rc7 内核版本,具体解决方式是:如果本地组的负载超过平均系统负载,则不要尝试从本地组中拉出任何任务。
一旦被主线采用,该补丁应该会被反向移植到最近的稳定 Linux 内核版本。