sched/fair: Prefer fully idle cores for NOHZ balancing

CFS 调度器 · NOHZ idle load balancer · SMT 感知优化

📋 补丁基本信息

项目内容
补丁类型优化(performance)——选核路径的 SMT 感知裁剪
状态In Review(v3,NVIDIA 提出)
当前版本v3 · lore 链接
版本演进 v1(07-28,+18/-5)→ v2(07-29,+39/-9,响应 AMD Prateek 质疑)→ v3(07-31,+47/-9,处理 Peter Zijlstra 讨论)
作者机构Andrea Righi (NVIDIA)
提交日期2026-07-31(v3)
改动范围kernel/sched/fair.c,+47/-9 行,1 文件
核心函数find_new_ilb() / kick_ilb()
原始链接lore Message-ID

💡 一句话总结

在 SMT 超线程服务器场景下,通过让 find_new_ilb() 优先选择整个 core 完全空闲的 CPU 作为 NOHZ idle load balancer,避免激活 busy core 的 SMT sibling 而拉低其算力,在 NVIDIA Vera 平台的 GEMM 基准中实测吞吐提升约 50%(6.2 → 9.4 TFLOP/s)。

📊 速览卡片

核心机制
SMT 感知选核
优化目标
保护 sibling 算力
适用场景
超线程服务器
实测提升
GEMM +50%

🎯 解决什么问题

系统层面:ILB 选择未感知 SMT 拓扑
NOHZ idle load balancing 需要选一个空闲 CPU 当 ILB,代表空闲 CPU 做均衡。 原 find_new_ilb() 只挑第一个空闲 housekeeping CPU,不看它所在 core 是否完全空闲。
场景层面:SMT sibling 唤醒干扰 busy core
若 ILB CPU 是繁忙 core 的 sibling,激活它会降低 busy sibling 性能。 NVIDIA 观测到:短暂唤醒后单线程性能需 sibling 空闲 ~10,000 cycles 才恢复。
受影响负载:GEMM 等计算密集型 HPC、超线程服务器延迟敏感应用

🧩 核心机制

重写 find_new_ilb(),在候选集合层面做 SMT 感知裁剪:

find_new_ilb SMT 感知选核架构图
图 1:优先选完全空闲 core 的 CPU 作 ILB,跳过 busy core 的 sibling,无全空闲 core 时回退
来源:基于 lore 真实补丁 diff 绘制
步骤操作目的
构建候选cpumask_and(idle, nohz.idle_cpus_mask, housekeeping)空闲且 housekeeping 的 CPU
SMT 裁剪busy CPU 或非全空闲 core → cpumask_andnot(cpu_smt_mask)跳过有 busy sibling 的 core
返回全空闲 core 的 CPU;无则 fallback优先 + 兜底

🔬 关键代码

+	if (!idle_cpu(ilb_cpu)) {
+		/* 有 busy sibling 的 core 不可用,跳过其 SMT mask */
+		if (sched_smt_active() && fallback >= 0)
+			cpumask_andnot(ilb_cpus, ilb_cpus,
+				       cpu_smt_mask(ilb_cpu));
+		continue;
+	}
+	/* 优先选整个 core 都空闲的 CPU,保留第一个空闲作 fallback */
+	if (sched_smt_active() && !is_core_idle(ilb_cpu)) {
+		if (fallback < 0)
+			fallback = ilb_cpu;
+		cpumask_andnot(ilb_cpus, ilb_cpus,
+			       cpu_smt_mask(ilb_cpu));
+		continue;
+	}

▲ 核心:遇到 busy/非全空闲 core 批量跳过其 sibling;保留 fallback 兜底

📈 性能影响

场景/用例运行环境改进前改进后
GEMM 通用矩阵乘法(HPC/深度学习核心算子,计算密集型负载)NVIDIA Vera 平台,SMT 超线程启用~6.2 TFLOP/s~9.4 TFLOP/s(+50%)

说明:GEMM 是矩阵乘法基准,代表 HPC/深度学习场景的计算密集型负载,对单核算力敏感,因此保护 sibling 算力能带来显著收益。补丁 commit message 未提供基准,此实测数据来自补丁讨论/关联工作(解读(AI 分析):数据出处为 NVIDIA 在讨论/关联工作中自报,未独立验证)。

💬 讨论焦点

v1 讨论:AMD Prateek 与 IBM 的质疑推动 v2 重构
  • AMD K Prateek Nayak(07-29)对 v1 提出疑问:仅按「是否完全空闲 core」裁剪候选,是否覆盖了 find_new_ilb() 的所有调用路径?ibm.com 的 Swapnil Shegde 也加入讨论。
  • Peter Zijlstra(07-29)质疑 SMT 检测逻辑的语义:用 idle_cpu() 判断 sibling 是否影响 busy core 不够严谨,应区分「core 是否完全空闲」与「仅该 CPU 空闲」。
v2 → v3:按 review 完善 SMT 检测
v2(+39/-9)响应 AMD/IBM 质疑,扩大改动面并引入 is_core_idle() 判定;v3(+47/-9)进一步处理 Peter 的关切:对 busy core 的 sibling 批量跳过(cpumask_andnot(cpu_smt_mask)),保留 fallback 兜底。IBM meted@linux.ibm.com(07-31)在 v3 发布后继续参与讨论。

⚠️ 风险与局限

潜在回归 / 并发 / 边界
  • 多核扩展性:SMT 裁剪引入的 cpumask_andnot 只在 sched_smt_active() 时生效;非 SMT 平台上行为与旧版一致(no-op 路径)(解读(AI 分析))。
  • 均衡延迟:若整个机器都无完全空闲 core,ILB 选择会退化到 fallback——但这只是「选核偏好」而非「不均衡」,均衡不会被卡死(补丁保留 fallback 逻辑)。
  • 架构相关:收益依赖 SMT 拓扑下 sibling 唤醒对 busy core 的干扰程度;不同 SMT 布局(如 POWER 与 x86)干扰成本不同,GEMM +50% 是 NVIDIA Vera 平台数据,未必全平台适用(讨论中已有人质疑该收益的可移植性,解读(AI 分析))。
  • 补丁未提供:commit message 未给出更广泛的基准(多负载/多平台),仅 GEMM 单点数据。
严重度:MINOR(选核偏好优化,非正确性改动;主要风险在收益的可移植性)· review 质疑:AMD/IBM/Peter Z 均有参与,已在 v2/v3 响应

🔗 交叉引用

📌 关联工作
SMT-aware asymmetric CPU capacity (v5) — 同一作者的姊妹系列,解决 SMT 算力高估问题
NOHZ ILB fallback 选项(Adam Li / Valentin Schneider 讨论) — nohz_full 场景的同类优化
🔄 版本演进
v1(07-28)→ v2(07-29)→ v3(07-31),经多轮 review 完善 SMT 检测逻辑

✅ 关键洞察

  • 发现:优先选完全空闲 core 的 CPU 作 NOHZ ILB(跳过 busy core 的 SMT sibling),解决「唤醒 sibling 拉低 busy core 算力」的选核缺陷。
  • 证据:NVIDIA Vera 上实测 GEMM +50%(6.2 → 9.4 TFLOP/s,作者自报,未独立验证);对 HPC/延迟敏感负载意义大。
  • 边界:仅在 sched_smt_active() 的超线程平台生效;非 SMT / 无空闲 core 时回退旧行为(fallback 兜底,均衡不停滞)。
  • 风险 / 建议:单平台单负载数据,收益可移植性待验证;v1→v3 经 AMD/IBM/Peter Zijlstra 多轮 review 完善,属选核偏好优化而非正确性修复。
⚠️ 免责声明

本站内容均由 AI 基于公开知识辅助生成,仅供学习参考,请勿直接引用作为依据。作者不对信息的准确性、完整性及适用性作保证,亦不对因使用本站内容产生的任何损失承担责任。