From 71d157a98c0daeda3c03663ba1be280350604883 Mon Sep 17 00:00:00 2001 From: Cheng Jian Date: Fri, 4 Nov 2022 21:07:23 +0800 Subject: [PATCH] scheduler/load_balance: Load Balance GraphViz --- android/AOSP.md | 22 ++++++++++++++ study/kernel/00-DESCRIPTION/ARCH.md | 13 +++++++-- study/kernel/00-DESCRIPTION/LOCKING.md | 5 +++- study/kernel/00-DESCRIPTION/SCHEDULER.md | 29 +++++++++++++++---- .../07-cfs/10-load_balance/Makefile | 21 ++++++++++++++ .../07-cfs/10-load_balance/README.md | 5 ++++ 6 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 study/kernel/01-process/05-schedule/07-cfs/10-load_balance/Makefile create mode 100644 study/kernel/01-process/05-schedule/07-cfs/10-load_balance/README.md diff --git a/android/AOSP.md b/android/AOSP.md index debdcdb..ca012c6 100644 --- a/android/AOSP.md +++ b/android/AOSP.md @@ -53,7 +53,29 @@ blogexcerpt: ANDROID +# AOSP-5.15 +------- +PELT multiplier + + +| Bug NO | COMMIT | 描述 | 参考链接 +|:------:|:------:|:---:| +| Bug: 177593580 | 889f8be857d8 ANDROID: sched: Introducing PELT multiplier
1b458bb3d144 ANDROID: sched: add vendor hook to PELT multiplier | PELT multiplier 允许 PELT 使用不同的衰减速率. | +| + +```cpp +Bug: 238985916 +70a112b621e7 ANDROID: ABI: Update symbols to unisoc whitelist for the scheduler 5st +``` + +7cf9646c245f ANDROID: sched: Add vendor hooks for cpu affinity. +a18836162846 ANDROID: cgroup: Add vendor hook for cpuset. +869954e72dac ANDROID: vendor_hooks: Export the tracepoints sched_stat_sleep and sched_waking to let module probe them +455e0a85357d ANDROID: sched: Add vendor hooks to compute new cpu freq. + + +39722f310fbd BACKPORT: PM: runtime: Fix supplier device management during consumer probe diff --git a/study/kernel/00-DESCRIPTION/ARCH.md b/study/kernel/00-DESCRIPTION/ARCH.md index f6b2376..5c72a5c 100644 --- a/study/kernel/00-DESCRIPTION/ARCH.md +++ b/study/kernel/00-DESCRIPTION/ARCH.md @@ -159,17 +159,26 @@ Intel Architecture Day 2021, 官宣了自己的服务于终端和桌面场景的 | 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | |:----:|:----:|:---:|:----:|:---------:|:----:| | 2020/10/02 | Catalin Marinas | [x86: Add initial support to discover Intel hybrid CPUs](https://lore.kernel.org/lkml/20201002201931.2826-1-ricardo.neri-calderon@linux.intel.com) | 支持混合微架构的 CPU(Alder Lake CPU) | v3 ☐ | [Patchwork 0/3](https://lore.kernel.org/lkml/20201002201931.2826-1-ricardo.neri-calderon@linux.intel.com) | -| 2021/05/12 | Rafael J. Wysocki | [cpufreq: intel_pstate: hybrid: CPU-specific scaling factors](https://www.phoronix.com/scan.php?page=news_item&px=P-State-Preps-For-Hybrid) | Hybrid CPU 的 P-state 增强 | v1 ☑ 5.14-rc1 | [Patchwork 0/3](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=eb3693f0521e020dd8617c7fa3ddf5c9f0d8dea0) | | 2021/02/08 | Kan Liang | [Add Alder Lake support for perf](https://lkml.org/lkml/2021/2/8/1142) | perf 支持 Hybrid CPU. | v1 ☑ 5.14-rc1 | [LKML 00/49](https://lkml.org/lkml/2021/2/8/1142) | | 2021/04/05 | Kan Liang | [Add Alder Lake support for perf (kernel)](https://lkml.org/lkml/2021/4/5/775) | perf 支持 Hybrid CPU(内核态). | v1 ☑ 5.13-rc1 | [LKML V5 00/25](https://lkml.org/lkml/2021/4/5/775), [LKML V3 00/25](https://lkml.org/lkml/2021/3/26/964) | | 2021/04/23 | Kan Liang | [perf tool: AlderLake hybrid support series 1](https://lkml.org/lkml/2021/4/23/52) | perf 支持 Hybrid CPU(内核态). | v1 ☑ 5.13-rc1 | [LKML v5 00/26](https://lkml.org/lkml/2021/4/23/52) | | 2021/05/27 | Kan Liang | [perf: Support perf-mem/perf-c2c for AlderLake](https://lkml.org/lkml/2021/4/5/775) | perf 支持 Hybrid CPU(内核态). | v2 ☑ 5.14-rc1 | [LKML v1 0/8](https://lkml.org/lkml/2021/4/5/775), [LKML v2 0/8](https://lkml.org/lkml/2021/5/27/191) | + + +#### 1.4.1.2 P-State(HWP) +------- + +| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | +|:----:|:----:|:---:|:----:|:---------:|:----:| +| 2021/05/12 | Rafael J. Wysocki | [cpufreq: intel_pstate: hybrid: CPU-specific scaling factors](https://www.phoronix.com/scan.php?page=news_item&px=P-State-Preps-For-Hybrid) | Hybrid CPU 的 P-state 增强 | v1 ☑ 5.14-rc1 | [Patchwork 0/3](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=eb3693f0521e020dd8617c7fa3ddf5c9f0d8dea0) | | 2021/11/19 | Srinivas Pandruvada | [cpufreq: intel_pstate: ITMT support for overclocked system](https://www.phoronix.com/scan.php?page=news_item&px=Linux-Patch-ITMT-OC-ADL) | Intel ITMT (Intel Turbo Boost Max Technology) 感知混合架构, Alder Lake CPU 上 P-Core/E-core 优先级应该有不同的值(P-core 0x40, P-core HT sibling 0x10, E-core 0x26). | v1 ☑ 5.16-rc3 | [Patchwork](https://patchwork.kernel.org/project/linux-pm/patch/20211119051801.1432724-1-srinivas.pandruvada@linux.intel.com), [COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=03c83982a0278207709143ba78c5a470179febee) | | 2021/12/16 | Srinivas Pandruvada | [cpufreq: intel_pstate: Update EPP for AlderLake mobile](https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.17-P-State-ADL-Mobile) | 修正 AlderLake 的 EPP. | v1 ☑ 5.17-rc1 | [COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b6e6f8beec98ba7541213c506fe908517fdc52b8) | | 2022/04/15 | Zhang Rui | [intel_idle: add AlderLake support](https://lore.kernel.org/all/20220415093951.2677170-1-rui.zhang@intel.com) | 参见 [phoronix 报道](https://www.phoronix.com/scan.php?page=news_item&px=Intel-Idle-Alder-Lake) | v1 ☐☑✓ | [LORE](https://lore.kernel.org/all/20220415093951.2677170-1-rui.zhang@intel.com) | +| 2022/10/24 | Rafael J. Wysocki | [cpufreq: intel_pstate: Make HWP calibration work on all hybrid platforms](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?id=f5c8cf2a4992dd929fa0c2f25c09ee69b8dcbce1) | 修复硬件 P-State(HWP) 校准程序在 Intel 混合 CPU 平台的一些问题.
1. 以前进行这项工作的尝试是基于使用 CPPC, 但事实证明, CPPC 信息对于此目的来说不够可靠, 唯一的方法是对 P 核和 E 核使用硬编码的比例因子(幸运的是, 这与非混合情况下相同). 幸运的是, 迄今为止, P-core 的相同缩放因子适用于所有混合平台. 这个补丁集的第一个补丁通过避免在一个 CPU 上读取的 MSR 值将用于另一个 CPU 的性能扩展的情况, 确保所有 CPU 都将使用来自 MSR 的正确信息. 第二个补丁完善了 hybrid_get_cpu_scaling() 的实现, 用已知的缩放因子作为 cpu->pstate.scaling. | v1 ☑✓ 6.1-rc3 | [LORE v1,0/2](https://lore.kernel.org/all/2258064.ElGaqSPkdT@kreacher) | -#### 1.4.1.2 ITMT SMT migration Improvement + +#### 1.4.1.3 ITMT SMT migration Improvement ------- Intel 在 LPC-2022 演示 [Bringing Energy-Aware Scheduling to x86](https://lpc.events/event/16/contributions/1275) 时, 对 ITMT 的改进一并进行了阐述. LWN 也对此进行了讲解 [Hybrid scheduling gets more complicated](https://lwn.net/Articles/909611). diff --git a/study/kernel/00-DESCRIPTION/LOCKING.md b/study/kernel/00-DESCRIPTION/LOCKING.md index 4945801..ce5cec5 100644 --- a/study/kernel/00-DESCRIPTION/LOCKING.md +++ b/study/kernel/00-DESCRIPTION/LOCKING.md @@ -292,8 +292,11 @@ percpu rw 信号量是一种新的读写信号量设计, 针对读取锁定进 |:----:|:----:|:---:|:----:|:---------:|:----:| | 2019/06/01 | "Joel Fernandes (Google)" | [Harden list_for_each_entry_rcu() and family](https://lore.kernel.org/patchwork/cover/1082845) | 本系列增加了一个新的内部函数rcu_read_lock_any_held(), 该函数在调用这些宏时检查reader节是否处于活动状态. 如果不存在reader section, 那么list_for_each_entry_rcu()的可选第四个参数可以是一个被计算的lockdep表达式(类似于rcu_dereference_check()的工作方式). . | RFC ☑ 5.4-rc1 | [PatchWork RFC,0/6](https://lore.kernel.org/patchwork/cover/1082845) | -Google 的 Joel Fernandes 等发现 RCU 并没有很好的节能, 在 Android 和 ChromeOS 系统的功耗方面, RCU 占据了比较大的比重. 他们在 LPC-2022 上演示了他们在延迟 RCU 处理等降低 RCU 功耗和底噪的工作. 参见 [Make RCU do less (& later) !](https://lpc.events/event/16/contributions/1204). +Google 的 Joel Fernandes 等发现 RCU 并没有很好的节能, 在 Android 和 ChromeOS 系统的功耗方面, RCU 占据了比较大的比重. 他们在 LPC-2022 上演示了他们在延迟 RCU 处理等降低 RCU 功耗和底噪的工作. 参见 [Make RCU do less (& later) !](https://lpc.events/event/16/contributions/1204). 随后 2022 年 10 月份左右, 补丁[推送到 v6.2 版本](https://lore.kernel.org/rcu/20221019225138.GA2499943@paulmck-ThinkPad-P17-Gen-1/). +| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | +|:----:|:----:|:---:|:----:|:---------:|:----:| +| 2022/10/19 | Paul E. McKenney | [Lazy call_rcu() updates for v6.2](https://lore.kernel.org/all/20221019225138.GA2499943@paulmck-ThinkPad-P17-Gen-1) | TODO | v6 ☐☑✓ | [LORE v6,0/14](https://lore.kernel.org/all/20221019225138.GA2499943@paulmck-ThinkPad-P17-Gen-1) | # 6 FUTEX diff --git a/study/kernel/00-DESCRIPTION/SCHEDULER.md b/study/kernel/00-DESCRIPTION/SCHEDULER.md index 39b2de4..30456a0 100644 --- a/study/kernel/00-DESCRIPTION/SCHEDULER.md +++ b/study/kernel/00-DESCRIPTION/SCHEDULER.md @@ -3704,7 +3704,7 @@ Oracle 数据库具有类似的虚拟化功能, 称为 Oracle Multitenant, 其 | 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | |:----:|:----:|:----:|:---:|:----------:|:---:| | 2016/05/06 | Peter Zijlstra | [sched: select_idle_siblings rewrite](https://lore.kernel.org/lkml/20160509104807.284575300@infradead.org) | 通过这组补丁, 将 select_idle_siblings 中对 sched_domain 上 CPU 的单次扫描替换为 3 个显式的扫描.
1. select_idle_core 在 LLC 域内搜索一个空闲的 CORE
2. select_idle_cpu 在 LLC 域内搜索一个空闲的 CPU.
3. select_idle_smt 在目标 CORE 中搜索一个空闲的 CPU.
select_idle_cpu 中需要遍历 sched_domain 中所有 CPU 查找 idle CPU. 这是一个非常耗时的过程, 因此维护了 sd->avg_scan_cost 类似于查找 idle CPU 的平均耗时. 如果当前 CPU 的 aavg_idle / 512) < avg_cost, 则直接跳过这个流程. | RFC ☑ 4.9-rc1 | [LORE 0/7](https://lore.kernel.org/patchwork/cover/677017), [关键 COMMIT](https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/commit/?id=10e2f1acd0106c05229f94c70a344ce3a2c8008b) | -| 2018/05/30 | Peter Zijlstra | [select_idle_sibling rework](https://lore.kernel.org/all/20180530142236.667774973@infradead.org) | 优化 select_idle_XXX 的性能 | RFC ☐☑✓ | [LORE v1,0/11](https://lore.kernel.org/all/20180530142236.667774973@infradead.org) | +| 2018/05/30 | Peter Zijlstra | [select_idle_sibling rework](https://lore.kernel.org/all/20180530142236.667774973@infradead.org) | 优化 select_idle_XXX 的性能. 核心扫描是在有空闲核心的情况下进行的, 它有一个最坏的情况, 我们总是扫描整个 LLC, 以确定在门控之前已经没有空闲核心了. CPU 扫描与剩余的平均空闲时间成正比. 由于 CPU 扫描可能实际上看不到我们自己的兄弟线程 (如果它们在 CPU 空间中很远的地方被枚举), 检查是否有空闲的兄弟线程. Rohit Jain 建议在一个比例搜索 `__select_idle_core()` 中完成所有这三件事. 它使用新的 SMT 拓扑位来执行 core/SMT 迭代. 并且依赖于 select_idle_cpu() 对 nr 的更改. 最总效果就是迭代 @nr 个 CPU, 并选择在任务关联掩码中繁忙线程数量最少的内核中的第一个空闲线程. | RFC ☐☑✓ | [LORE v1,0/11](https://lore.kernel.org/all/20180530142236.667774973@infradead.org) | | 2019/7/1 | Subhra Mazumdar | [Improve scheduler scalability for fast path](https://lore.kernel.org/patchwork/cover/1094549) | select_idle_cpu 每次遍历 LLC 域查找空闲 CPU 的代价非常高, 因此通过限制搜索边界来减少搜索时间, 进一步通过保留 PER_CPU 的 next_cpu 变量来跟踪上次搜索边界, 来缓解此次优化引入的线程局部化问题 | v3 ☐ | [LWN](https://lwn.net/Articles/757379/), [PatchWork](https://lore.kernel.org/patchwork/cover/1094549/), [lkml](https://lkml.org/lkml/2019/7/1/450), [Blog](https://blogs.oracle.com/linux/linux-scheduler-scalabilty-like-a-boss) | | 2018/01/30 | Mel Gorman | [Reduce migrations and unnecessary spreading of load to multiple CPUs](https://lore.kernel.org/patchwork/cover/878789) | 通过优化选核逻辑, 减少不必要的迁移 | | | | 2019/1/21 | Srikar Dronamraju | [sched/fair: Optimize select_idle_core](https://lore.kernel.org/patchwork/patch/1163807) | | | | @@ -5288,7 +5288,15 @@ Intel 的 [Wult/Wake Up Latency Tracer](https://github.com/intel/wult) 一个在 ## 10.1 进程创建 ------- -### 10.1.1 shared page tables +### 10.1.1 进程创建 FORK +------- + +| 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | +|:----:|:----:|:---:|:----:|:---------:|:----:| +| 2022/10/31 | Zhang Qiao | [sched: sched_fork() optimizations](https://lore.kernel.org/all/20221031125113.72980-1-zhangqiao22@huawei.com) | sched_fork() 使用当前 CPU 初始化新任务的 vruntime, 但新任务可能不在这个 CPU 上运行. 所以这个补丁集将解决这个问题. | v1 ☐☑✓ | [LORE v1,0/2](https://lore.kernel.org/all/20221031125113.72980-1-zhangqiao22@huawei.com) | + + +### 10.1.2 shared page tables ------- 对 shared page tables 的研究由来已久, Dave McCracken提出了一种共享页面表的方法[Implement shared page tables](https://lore.kernel.org/patchwork/cover/42673), 可以参见 [Shared Page Tables Redux](https://www.kernel.org/doc/ols/2006/ols2006v2-pages-125-130.pdf). 但从未进入内核. @@ -5308,10 +5316,10 @@ Intel 的 [Wult/Wake Up Latency Tracer](https://github.com/intel/wult) 一个在 | 2022/01/18 | Khalid Aziz | [Add support for shared PTEs across processes](https://patchwork.kernel.org/project/linux-mm/cover/cover.1642526745.git.khalid.aziz@oracle.com) | 内核中的页表会消耗一些内存, 只要要维护的映射数量足够小, 那么页表所消耗的空间是可以接受的. 当进程之间共享的内存页很少时, 要维护的页表条目(PTE)的数量主要受到系统中内存页的数量的限制. 但是随着共享页面的数量和共享页面的次数的增加, 页表所消耗的内存数量开始变得非常大.
比如在一些实际业务中, 通常会看到非常多的进程共享内存页面. 在 x86_64 上, 每个页面页面在每个进程空间都需要占用一个只有 8Byte 大小的 PTE, 共享此页面的进程数目越多, 占用的内存会非常的大. 如果这些 PTE 可以共享, 那么节省的内存数量将非常可观.
这组补丁在内核中实现一种机制, 允许用户空间进程选择共享 PTE. 一个进程可以通过 通过 mshare() 和 mshare_unlink() syscall 来创建一个 mshare 区域(mshare'd region), 这个区域可以被其他进程使用共享 PTE 映射相同的页面. 其他进程可以通过 mashare() 使用共享 PTE 将共享页面映射到它们的地址空间. 然后还可以通过 mshare_unlink() syscall 来结束对共享页面的访问. 当最后一个访问 mshare'd region 的进程调用 mshare_unlink() 时, mshare'd region 就会被销毁, 所使用的内存也会被释放. | RFC ☐ | [LKML RFC,0/6](https://patchwork.kernel.org/project/linux-mm/cover/cover.1642526745.git.khalid.aziz@oracle.com) | -### 10.1.2 进程退出 +### 10.1.3 进程退出 ------- -#### 10.1.2.1 进程退出时的处理 +#### 10.1.3.1 进程退出时的处理 ------- | 时间 | 作者 | 特性 | 描述 | 是否合入主线 | 链接 | @@ -5319,7 +5327,7 @@ Intel 的 [Wult/Wake Up Latency Tracer](https://github.com/intel/wult) 一个在 | 2021/11/18 | Sebastian Andrzej Siewior | [kernel/fork: Move thread stack free out of the scheduler path](https://lore.kernel.org/all/20211118143452.136421-1-bigeasy@linutronix.de) | [sched: Delay task stack freeing on RT](https://lore.kernel.org/all/20210928122411.593486363@linutronix.de) 的完善方案. 在 finish_task_switch() 完成后任务可能会死亡并退出, 这时候虽然快速回收任务堆栈有利于繁重的工作负载, 但这是内核实时性延迟的源头. 因此, 延迟启用 RT 的内核上的堆栈清理. | v1 ☐ | [PatchWork 0/8](https://lore.kernel.org/all/20211118143452.136421-1-bigeasy@linutronix.de) | | 2021/11/18 | Linus Torvalds | [task: Making tasks on the runqueue rcu protected](https://lore.kernel.org/all/20211118143452.136421-1-bigeasy@linutronix.de) | [sched: Delay task stack freeing on RT](https://lore.kernel.org/all/20210928122411.593486363@linutronix.de) 的完善方案. 在 finish_task_switch() 完成后任务可能会死亡并退出, 这时候虽然快速回收任务堆栈有利于繁重的工作负载, 但这是内核实时性延迟的源头. 因此, 延迟启用 RT 的内核上的堆栈清理. | v1 ☐ | [PatchWork 0/8](https://lore.kernel.org/all/20211118143452.136421-1-bigeasy@linutronix.de) | -#### 10.1.2.2 reaper 进程 +#### 10.1.3.2 reaper 进程 ------- linux 下, reaper 线程用于释放已经执行结束的线程所占用的资源. 通常这个工作由父进程通过 wait() 或者 waitpid() 完成. 在 linux 中, 父进程死亡后, 需要由其他 reaper 进程来完成这项工作. 粗略地说: @@ -5332,7 +5340,7 @@ linux 下, reaper 线程用于释放已经执行结束的线程所占用的资 -### 10.1.3 进程冻结与恢复 +### 10.1.4 进程冻结与恢复 ------- CRIU 是一个在 Linux 用户空间 (userspace) 上实现了 checkpoint/restore 功能的软件工具. @@ -5797,6 +5805,15 @@ ECRTS 2020(32nd Euromicro Conference on Real-Time Systems) 上 Daniel 等人发 | [BART](https://github.com/arm-software/bart) | Behavioural Analysis and Regression Toolkit | +### 12.4.5 调度可视化 +------- + + +| 编号 | 工具 | 描述 | 链接 | +|:---:|:----:|:---:|:---:| +| 1 | SchedViz | [Understanding Scheduling Behavior with SchedViz](https://opensource.googleblog.com/2019/10/understanding-scheduling-behavior-with.html) | [google/schedviz, github](https://github.com/google/schedviz) | +| 2 | systrace | NA | NA | +| 3 | perfetto | NA | NA | **引用: ** diff --git a/study/kernel/01-process/05-schedule/07-cfs/10-load_balance/Makefile b/study/kernel/01-process/05-schedule/07-cfs/10-load_balance/Makefile new file mode 100644 index 0000000..1dfecff --- /dev/null +++ b/study/kernel/01-process/05-schedule/07-cfs/10-load_balance/Makefile @@ -0,0 +1,21 @@ +ROOT=../../../ +PLATFORM=$(shell $(ROOT)/systype.sh) +include $(ROOT)/Make.defines.$(PLATFORM) + +target=memorylayout + + + +all:$(target) + + +memorylayout : memorylayout.o + $(CC) $^ -o $@ $(LDFLAGS) + echo "C程序的内存布局..." + +%.o : %.c + $(CC) -c $^ -o $@ $(CFLAGS) $(DEFINES) + +clean : + rm -rf *.o + rm -rf $(target) diff --git a/study/kernel/01-process/05-schedule/07-cfs/10-load_balance/README.md b/study/kernel/01-process/05-schedule/07-cfs/10-load_balance/README.md new file mode 100644 index 0000000..2259ed7 --- /dev/null +++ b/study/kernel/01-process/05-schedule/07-cfs/10-load_balance/README.md @@ -0,0 +1,5 @@ +# 1 概述 +------- + + +# 2 周期性调度器 \ No newline at end of file