From b8edd5d90e881d1f2c7abd27ba53b996844a75b9 Mon Sep 17 00:00:00 2001 From: Cheng Jian Date: Wed, 26 Nov 2025 10:03:48 +0800 Subject: [PATCH] description/open_source: update phoronix vs LWN to date 20250701 --- study/kernel/00-DESCRIPTION/SCHEDULER.md | 24 +++++++++++++++++++++--- study/kernel/00-DESCRIPTION/TODO.md | 13 +++++++++++-- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/study/kernel/00-DESCRIPTION/SCHEDULER.md b/study/kernel/00-DESCRIPTION/SCHEDULER.md index 32e608e..b36c29e 100644 --- a/study/kernel/00-DESCRIPTION/SCHEDULER.md +++ b/study/kernel/00-DESCRIPTION/SCHEDULER.md @@ -2232,11 +2232,20 @@ idle balance 中执行 update_blocked_average 是很费时费力的, 可以做 |:----:|:----:|:---:|:---:|:----------:|:----:| | 2021/02/05 | Vincent Guittot | [move update blocked load outside newidle_balance](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=39b6a429c30482c349f1bb3746470fe473cbdb0f) | Joel 报告了 newidle_balance 中的抢占和 irq 关闭序列很长, 因为大量的 CPU cgroup 正在使用, 并且需要更新. 这个补丁集优化 NEWLY_IDLE CPU 的 Blocked Load 更新. | v1 ☑✓ 5.13-rc1 | [LORE v1,0/6](https://lore.kernel.org/all/20210205114830.781-1-vincent.guittot@linaro.org)
*-*-*-*-*-*-*-*
[LORE v4,0/7](https://lore.kernel.org/all/20210224133007.28644-1-vincent.guittot@linaro.org) | | 2021/02/24 | Aubrey Li | [sched/fair: reduce long-tail newly idle balance cost](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=acb4decc1e900468d51b33c5f1ee445278e716a7) | TODO | v2 ☑✓ 5.13-rc1 | [LORE](https://lore.kernel.org/all/1614154549-116078-1-git-send-email-aubrey.li@intel.com) | -| 2021/10/19 | Vincent Guittot | [Improve newidle lb cost tracking and early abort](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=8ea9183db4ad8afbcb7089a77c23eaf965b0cacd) | 通过考虑更新阻塞负载 update_blocked_averages() 所花费的时间, 在没有机会运行至少一个负载平衡循环的情况下完全跳过负载平衡循环. 因此在 newidle_balance() 中, 当 this_rq 的第一个 sd 满足 `this_rq->avg_idle max_newidle_lb_cost` 时, 认为执行 update_blocked_averages() 是非常昂贵且没有收益的, 只会增加开销. 因此在 newidle_balance() 中尽早检查条件, 尽可能跳过 update_blocked_averages() 的执行. | v3 ☑ [5.16-rc1](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9a7e0a90a454) | [2021/10/4 LKML v1](https://lkml.org/lkml/2021/10/4/1188)
*-*-*-*-*-*-*-*
[2021/10/04 PatchWork](https://lore.kernel.org/lkml/20211004171451.24090-1-vincent.guittot@linaro.org), [LKML](https://lkml.org/lkml/2021/10/4/1188)
*-*-*-*-*-*-*-*
[LKML v3,0/5](https://lkml.org/lkml/2021/10/19/590), [LORE v3,0/5](https://lore.kernel.org/all/20211019123537.17146-1-vincent.guittot@linaro.org), [关键 COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9d783c8dd112) | | 2022/06/08 | Josh Don | [sched: allow newidle balancing to bail out of load_balance](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=792b9f65a568f48c50b3175536db9cde5a1edcc0) | 在执行 newidle 负载平衡时, 可能会有新任务到达, 也可能有挂起的唤醒. 如果检测到这些情况, newidle_balance() 已经通过退出 sched_domain load_balance() 解决了这个问题. 这对于最小化唤醒延迟非常重要.
然而, 如果我们已经在 load_balance() 中, 在返回到 newidle_balance() 之前, 我们可能会在那里停留一段时间. 如果我们在 LBF_ALL_PINNED 情况下输入 "goto redo" 循环, 情况会更加恶化. 一个非常直接的解决方法是调整 should_we_balance(), 以便在执行 CPU_NEWLY_IDLE Balance 且检测到新任务时释放. 测试发现, 两个轮流休眠和相互唤醒的线程绑定到两个核上, 其他大量利用率为 100% 的线程被绑定到所有其他核上, 如果没有这个补丁, 这对线程的唤醒延迟约为 120us, 几乎全部花费在 load_balance() 中. 合入这个补丁后, 唤醒延迟降低到 6us. | v1 ☑✓ 6.0-rc1 | [LORE](https://lore.kernel.org/all/20220609025515.2086253-1-joshdon@google.com) | | 2023/07/27 | Chen Yu | [Optimization to reduce the cost of newidle balance](https://lore.kernel.org/all/cover.1690273854.git.yu.c.chen@intel.com) | 这是新空闲平衡优化 [Limit the scan depth to find the busiest sched group during newidle balance](https://lore.kernel.org/all/cover.1686554037.git.yu.c.chen@intel.com) 的新版本. 它旨在降低新空闲平衡的成本, 在一些高核计数系统上, 新空闲平衡被发现占用了明显的 CPU 周期. 例如, 当在 Intel Sapphire Rapids 上运行 sqlite 时, 它有 2 x 56C/112T = 224 个 cpu: newidle_balance 以及 update_sd_lb_stats 的热点达到 5% 以上. 为了减少这一开销, Tim 提出的问题启发了我们进行优化:
1. 第一个是 ILB_UTIL. 建议在 update_sd_lb_stats() 中限制扫描深度. 扫描深度取决于该调度域的总体利用率. 利用率越高, update_sd_lb_stats() 扫描的数据就越少. 亦然.
2. 第二个是 ILB_FAST. 与其总是在 update_sd_lb_stats() 中查找最繁忙的组, 不如降低标准并尝试查找相对繁忙的组. 当本地组为 group_has_spare 时, ILB_FAST 生效. 因为当有许多 cpu 并发地运行 newidle_balance() 时, 计划组应该有很高的空闲百分比.
3. 与 ILB_UTIL 和 ILB_FAST 相比, ILB_UTIL 抑制了系统繁忙时的调度组扫描. 后者在系统不忙时选择折衷的忙群. 它们相互补充, 独立工作. | v1 ☐☑✓ | [LORE v1,0/7](https://lore.kernel.org/all/cover.1690273854.git.yu.c.chen@intel.com) | | 2024/01/19 | K Prateek Nayak | [sched/fair: Skip newidle_balance() when an idle CPU is woken up to process an IPI](https://lore.kernel.org/all/20240119084548.2788-1-kprateek.nayak@amd.com) | 当使用 Anton Blanchard 的 [ipistorm 基准 BenckMark](https://github.com/antonblanchard/ipistorm) 的修改版本测量 IPI 吞吐量时, 配置为测量执行固定数量的 smp_call_function_single() 所花费的时间 (等待设置为 1), 在 v5.7 和 v5.8 之间观察到基准时间的增加. Bissection 指出, [commit b2a02fc43a1f ("smp:Optimize send_call_function_single_ip()")](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=b2a02fc43a1f40ef4eb2fb2b06357382608d4d84) 是运行时间增加的原因. 由于最新的内核不可能进行干净的恢复, 为了恢复旧的行为, 跳过了 send_call_function_single_prep_ipi() 中的 call_function_single_pip() 检查, 导致 send_call_function_single_ip() 始终调用 arch_send_call_formation_singe_ipi(). 这个相同提交在 do_idle() 中引入的 flush_smp_call_function_queue() 也被删除, 因为上述更改将无条件地在 TIF_POLLING 模式下向空闲 CPU 发送 IPI. | v1 ☐☑✓ | [LORE](https://lore.kernel.org/all/20240119084548.2788-1-kprateek.nayak@amd.com) | +### 4.4.2 Improve cost accounting of newidle_balance +------- + + +| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | +|:----:|:----:|:---:|:---:|:----------:|:----:| +| 2021/10/19 | Vincent Guittot | [Improve newidle lb cost tracking and early abort](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=8ea9183db4ad8afbcb7089a77c23eaf965b0cacd) | 通过考虑更新阻塞负载 update_blocked_averages() 所花费的时间, 在没有机会运行至少一个负载平衡循环的情况下完全跳过负载平衡循环. 因此在 newidle_balance() 中, 当 this_rq 的第一个 sd 满足 `this_rq->avg_idle max_newidle_lb_cost` 时, 认为执行 update_blocked_averages() 是非常昂贵且没有收益的, 只会增加开销. 因此在 newidle_balance() 中尽早检查条件, 尽可能跳过 update_blocked_averages() 的执行. | v3 ☑ [5.16-rc1](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9a7e0a90a454) | [2021/10/4 LKML v1](https://lkml.org/lkml/2021/10/4/1188)
*-*-*-*-*-*-*-*
[2021/10/04 PatchWork](https://lore.kernel.org/lkml/20211004171451.24090-1-vincent.guittot@linaro.org), [LKML](https://lkml.org/lkml/2021/10/4/1188)
*-*-*-*-*-*-*-*
[LKML v3,0/5](https://lkml.org/lkml/2021/10/19/590), [LORE v3,0/5](https://lore.kernel.org/all/20211019123537.17146-1-vincent.guittot@linaro.org), [关键 COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9d783c8dd112) | +| 2025/06/26 | Chris Mason | [sched/fair: bump sd->max_newidle_lb_cost when newidle balance fails](https://lore.kernel.org/all/20250626144017.1510594-2-clm@fb.com) | 邮用于修复 COMMIT `c5b0a7eefc sched/fair: Remove sysctl_sched_migration_cost condition` 条件导致的性能回归问题.使用 `schbench` 工具进行测试, 每秒请求数(RPS)从 5.4M 下降到 3.4M, 问题表现为 `newidle balance` 操作次数增加了约 100 倍, 这些操作大多失败, 未能找到负载可迁移的 CPU. 工作线程约 20% 的时间花在 `newidle balance` 上.
因此本补丁尝试在 newidle balance 失败时增大其成本(`domain_cost`), 从而抑制其频繁触发. 同时对成本的上限进行限制, 防止其无限增长.
补丁修改了 `update_newidle_cost( ) ` 和 `sched_balance_newidle( ) ` 函数逻辑.
sched_balance_newidle()` 函数中, 原逻辑: 无论 newidle balance 是否成功,均使用实际耗时更新 `max_newidle_lb_cost`. 新逻辑: 如果没有拉取到任务(`pulled_task == false`), 则将该次 balance 的 cost 提升为当前最大 cost 的 1.5 倍. 这样做的目的是: 提升失败操作的成本感知, 使得调度器在未来更谨慎地触发 newidle balance. `update_newidle_cost()` 函数中, 原逻辑: 直接更新 `sd->max_newidle_lb_cost = cost;`, 新逻辑: 增加上限限制, 使用 `sysctl_sched_migration_cost + 200` 作为最大值. 避免成本无限增长. | v2 ☐☑✓ | [LORE](https://lore.kernel.org/all/20250626144017.1510594-2-clm@fb.com) | +| 2025/11/07 | Peter Zijlstra | [sched: The newidle balance regression](https://lore.kernel.org/all/20251107160645.929564468@infradead.org) | 解决由提交 `155213a2aed4 ("sched/fair: Bump sd->max_newidle_lb_cost when newidle balance fails")` 引入的调度器 newidle balance 逻辑的性能退化问题, 重新引入 newidle balance 的"目标+随机"(NI_TARGET + NI_RANDOM)策略的比例型 proportional newidle balance, 提供一个更加合理和高效的 newidle balance 机制, 以提高系统整体的负载均衡效果与性能.
为了控制 newidle 平衡的开销, 调度器维护了一个 `sd->max_newidle_lb_cost` 指标, 表示执行 newidle balance 的平均代价. 当 newidle balance 没有成功迁移任务时, 该值会增加, 从而降低后续触发 newidle 的频率. 这是 COMMIT `155213a2aed4` 的初衷. 然而, 这一改动导致了: 在某些负载下 newidle balance 过于保守, 错失负载均衡机会. 性能退化, 尤其是在需要快速响应负载变化的场景. Patch 1-2: Revert 回退到更早的 newidle 行为(NI_TARGET), 移除了 newidle balance 失败时对 domain_cost 的放大处理. 恢复使用实际测量值更新 max_newidle_lb_cost, 删除了 sysctl_sched_migration_cost 的上限限制, 着回到了 newidle 仅尝试迁移到目标调度组(target group)的方式, 该行为在旧版本中表现良好, 避免了不必要的平衡请求. Patch 3-4: 引入 proportional newidle balance, 在目标组失败后, 以一定概率尝试其他调度组(NI_RANDOM), 类似于 NI_TARGET + NI_RANDOM 的组合策略. | v1 ☐☑✓ | [2025/11/07, LORE v1, 0/4](https://lore.kernel.org/all/20251107160645.929564468@infradead.org) | + ### 4.4.3 Task Stealing From LLC ------- @@ -7217,9 +7226,18 @@ LSFMMBPF 2024 上对 sched_ext 进行了讨论 [LWN, 2024/05/23, LSFMMBPF-2024, | 2025/04/23 | Tejun Heo | [sched_ext: Introduce scx_sched](https://lore.kernel.org/all/20250423234542.1890867-1-tj@kernel.org) | 为支持多个分层调度器做准备. 该补丁集将原本全局的调度状态封装进新的结构体 `scx_sched`, 以支持未来多调度器实例的管理. 目前仅支持系统范围的根调度器(`scx_root`), 后续补丁将逐步引入多调度器支持, 并逐一更新相关代码.
补丁内容主要包括: 将全局变量移入 `scx_sched` 结构、优化内存分配、内联函数重构、事件统计结构迁移等. 尽管代码变动较大, 但均为内部结构调整, 预期不会带来用户可见的变化. 参见 [phoronix, 2025/06/04, Sched_Ext Boasts CPU Selection Improvements In Linux 6.16](https://www.phoronix.com/news/Linux-6.16-Sched-Ext) | v1 ☐☑✓ | [2025/04/23, LORE v1, 00/12](https://lore.kernel.org/all/20250423234542.1890867-1-tj@kernel.org)
*-*-*-*-*-*-*-*
[2025/04/25, LORE v2, 00/12](https://lore.kernel.org/all/20250425215840.2334972-1-tj@kernel.org/) | | 2025/09/19 | Tejun Heo | [sched_ext: Implement cgroup sub-scheduler support](https://lore.kernel.org/all/20250920005931.2753828-1-tj@kernel.org) | sched_ext 的 **cgroup 子调度器(sub-scheduler) 支持**的补丁集( RFC) , 旨在实现多层级调度器在 cgroup 树中的协同工作, 以适应多租户服务器环境与差异化工作负载的调度需求. 当前实现通过 BPF 提供灵活调度策略, 支持最多 4 层嵌套调度, 允许动态 CPU 分配与更好的故障隔离.
补丁集共 46 个, 分为独立修复、准备阶段、核心子调度实现、嵌套调度实现四部分. 关键特性包括:
1. 子调度器可挂接到 cgroup 层级任意位置;
2. 支持 BPF 驱动的嵌套调度逻辑( 示例见 `scx_qmap. bpf. c`);
3. 改进任务初始化、退出、插入调度队列等机制;
4. 引入子调度器的启用/禁用接口, 最小化系统扰动;
5. 优化调试信息输出与多调度器状态展示.
6. 该实现仍处于早期阶段, 部分路径( 如 enqueue) 需进一步完善, 但已具备展示完整调度嵌套能力. | v1 ☐☑✓ | [LORE](https://lore.kernel.org/all/20250920005931.2753828-1-tj@kernel.org) | +#### 11.2.1.5 sched_ext bypass mode +------- -#### 11.2.1.5 sched_ext debug +| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | +|:---:|:----:|:---:|:----:|:---------:|:----:| +| 2025/11/09 | Tejun Heo | [sched_ext: Improve bypass mode scalability](https://lore.kernel.org/all/20251109183112.2412147-1-tj@kernel.org) | 旨在提升 Linux 调度扩展(sched_ext) 的 bypass 模式在大规模系统上的可扩展性. 主要解决两个问题:
1. **减少 DSQ 锁竞争**: 原 bypass 模式使用每 NUMA 节点的全局 DSQ, 但在任务绑定到特定小 CPU 子集时, 仍可能导致严重扫描开销和锁竞争.
补丁改用每 CPU 的 DSQ, 并在调度中止时立即退出调度与迁移操作, 避免陷入长循环. 同时引入 hardlockup 检测作为安全机制.

2. **防止任务集中导致 RCU 挂起**: 使用每 CPU DSQ 时, 若 BPF 调度器导致任务集中在少数 CPU 上, 将导致队列无法及时处理. 补丁加入基于定时器的负载均衡机制, 将任务在 NUMA 节点内部重新分发, 并缩短 bypass 模式下的时间片以提升响应速度.

测试表明, 该补丁集在 192 核 AMD EPYC 机器上能有效应对极端场景, 显著提升系统稳定性与调度器退出效率. 附带的 `scx_cpu0` 示例调度器用于验证任务集中情况下的表现. | v1 ☐☑✓ | [LORE](https://lore.kernel.org/all/20251109183112.2412147-1-tj@kernel.org) | + + + + +#### 11.2.1.6 sched_ext debug ------- | 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | @@ -7585,7 +7603,7 @@ ECRTS 2020(32nd Euromicro Conference on Real-Time Systems) 上 Daniel 等人发 | 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | |:---:|:----:|:---:|:----:|:---------:|:----:| -| 2025/10/18 | Muhammad Usama Anjum | [PM: Hibernate: Add hibernation cancellation support](https://lore.kernel.org/all/20251018142114.897445-1-usama.anjum@collabora.com) | 旨在支持在休眠过程中取消操作. 当前, 系统休眠需 15-20 秒, 期间无法中断, 影响用户体验. 作者 Muhammad Usama Anjum 提出通过检测电源键中断, 在休眠过程中允许用户中止该流程. 补丁共 4 个, 包括导出休眠状态函数、处理 ACPI 按钮事件、忽略休眠期间的电源键事件, 以及清除挂起标志. 测试表明, 修改后可在休眠中安全取消操作. 该系列补丁共修改 7 个文件, 新增 26 行代码, 删除 4 行. | v1 ☐☑✓ | [2025/10/18, LORE v1, 0/4](https://lore.kernel.org/all/20251018142114.897445-1-usama.anjum@collabora.com) | +| 2025/10/18 | Muhammad Usama Anjum | [PM: Hibernate: Add hibernation cancellation support](https://lore.kernel.org/all/20251018142114.897445-1-usama.anjum@collabora.com) | 旨在支持在休眠过程中取消操作. 当前, 系统休眠需 15-20 秒, 期间无法中断, 影响用户体验. 作者 Muhammad Usama Anjum 提出通过检测电源键中断, 在休眠过程中允许用户中止该流程. 补丁共 4 个, 包括导出休眠状态函数、处理 ACPI 按钮事件、忽略休眠期间的电源键事件, 以及清除挂起标志. 测试表明, 修改后可在休眠中安全取消操作. [phoronix, 2025/10/20, Patches Posted To Allow Hibernation Cancellation On Linux](https://www.phoronix.com/news/Linux-Hibernation-Cancellation) | v1 ☐☑✓ | [2025/10/18, LORE v1, 0/4](https://lore.kernel.org/all/20251018142114.897445-1-usama.anjum@collabora.com) | diff --git a/study/kernel/00-DESCRIPTION/TODO.md b/study/kernel/00-DESCRIPTION/TODO.md index 100fcd2..6f237b1 100644 --- a/study/kernel/00-DESCRIPTION/TODO.md +++ b/study/kernel/00-DESCRIPTION/TODO.md @@ -942,7 +942,16 @@ git fetch --unshallow -[知乎--SOSP 2025 论文评述 Day 3 Session 13: OS Memory Management and Scalability](https://zhuanlan.zhihu.com/p/1962852227333990287) + +| 2025/09/18 | Marco Elver | [Compiler-Based Capability- and Locking-Analysis](https://lore.kernel.org/all/20250918140451.1289454-1-elver@google.com) | 一项基于编译器的"能力分析" (Capability Analysis) 与"锁分析" (Locking Analysis) 功能, 旨在通过 Clang 的静态分析能力, 在编译期检测 Linux 内核中同步机制(如锁、RCU、信号量等) 使用的合规性. 关键点包括:
采用 Clang 的 Capability System 特性, 扩展 C 语言以支持能力注解, 确保锁等资源的获取与释放符合预期.
分析机制独立于运行时工具(如 Lockdep、KCSAN), 无性能开销, 提前发现潜在并发问题.
支持多种同步原语, 包括 spinlock、mutex、rwlock、seqlock、RCU 等.
目标是提升内核并发安全性, 同时降低静态分析误报与维护成本. | v3 ☐☑✓ | [2025/09/18, LORE v3, 0/35](https://lore.kernel.org/all/20250918140451.1289454-1-elver@google.com) | + + + +使用 `schbench` 工具进行测试, 每秒请求数(RPS)从 5.4M 下降到 3.4M, 问题表现为 `newidle balance` 操作次数增加了约 100 倍, 这些操作大多失败, 未能找到负载可迁移的 CPU. 工作线程约 20% 的时间花在 `newidle balance` 上. 因此本补丁尝试在 newidle balance 失败时增大其成本(`domain_cost`), 从而抑制其频繁触发. 同时对成本的上限进行限制, 防止其无限增长. sched_balance_newidle()` 函数中, 原逻辑: 无论 newidle balance 是否成功,均使用实际耗时更新 `max_newidle_lb_cost`. 新逻辑: 如果没有拉取到任务(`pulled_task == false`), 则将该次 balance 的 cost 提升为当前最大 cost 的 1.5 倍. 这样做的目的是: 提升失败操作的成本感知, 使得调度器在未来更谨慎地触发 newidle balance. `update_newidle_cost()` 函数中, 原逻辑: 直接更新 `sd->max_newidle_lb_cost = cost;`, 新逻辑: 增加上限限制, 使用 `sysctl_sched_migration_cost + 200` 作为最大值. 避免成本无限增长 + + + + + -作者的博客 [Sanidhya Kashyap](https://sanidhya.github.io) 和 [Jean-Pierre Lozi](https://jean-pierre.lozi.org) \ No newline at end of file