Energy Aware Scheduling(EAS)
EAS赋予调度器新的功能,使其能预测其调度决策(Task Placement)于CPU的能量消耗带来的影响,即Energy Aware。它依赖于CPU能量模型(Energy Model),以此来实现在确保性能影响最小的情况下为每个任务选择能量最优的CPU的调度决策。该特性主要由Linaro和ARM共同开发,在Linux Kernel 5.0版本正式发布。
事实上EAS的开发过程经过了漫长的讨论和版本变迁,每个阶段的功能实现首先发生在Android Kernel,然后开始逐步引入Linux mainline。而在Linux mainline中经历了漫长的Scheduling和Power Management模块的融合,最终在5.0版本主线接纳。下面对其设计思想、实现以及变迁过程进行梳理。
背景介绍
- CPUFreq、CPUIdle和Scheduler早期处于各行其政而又功能交叠的状态,如图4所示
图4. Scheduler与CPUFreq和CPUIdle之间的关系(无EAS支持)(图片参考自Linaro官网)
- Power Management模块(CPUFreq和CPUIdle子系统包含其中)与Schedule子系统之间独立运作且功能上相互影响,如传统的CFS调度策略力求达到Performance最大化和Load Balance,而PM则要求实现能耗最小,两者之间存在矛盾
- 随着手机等设备的发展和普及,PM需求越来越突出,要求PM必须与Schedule进行配合来工作
- CPU架构也经历着演变,有Asymmetric Multiprocessing(AMP), Symmetric Multiprocessing(SMP), Bound Multiprocessing(BMP)和Heterogeneous Multiprocessing(HMP),而这本身对Schedule带来了新的挑战,推动传统的调度功能进行修改以最大化CPU能效
- Linux Kernel主要的调度类CFS为适应SMP调度开发,将所有CPU视为同等进行调度,且对能耗一无所知
发展过程
EAS经历了一下三个发展阶段,主要是ARM为适配其CPU big.LITTLE 架构逐步开发演进而来
- In Kernel Switcher(IKS):同样称为CPU Migration,在最初ARM提出 big.LITTLE 架构时为了让Linux Kernel支持,在原有的CFS调度基础上加入IKS,根据负载变化决定采用big或者LITTLE的CPU进行调度,其特点同一时间只有big或者LITTLE core可见,而不能big和LITTLE core同时可见,且big和LITTLE cores的数量相同,如图5所示
图5. IKS下的Task Placement操作方式(图片参考自Linaro官网)
- Global Task Scheduling(HMP/GTS):由Linaro开发,主要是改善IKS,其特点是所有CPU可见,不再采用big Little CPU切换,而直接将Task调度到对应的CPU上,如图6所示。该过程本身更轻量,而进程切换过程带来了10%的能耗降低,同时支持了非对称多处理SoC(比如2 Contex-A15 cores + 4 Cortex-A7 cores),当然也能在同一时间让更多CPU运行,达到更高的峰值性能,这部分代码并未进入Linux Kernel主线,只存在于Android源码中
关于GTS与IKS的详细对比可以进一步阅读:https://www.linaro.org/blog/big-little-software-update/
图6. GTS下的Task Placement操作方式(图片参考自Linaro官网)
- Energy Aware Scheduling(EAS):ARM在2017年发布了 DynamlQ 架构,实现了总共8 cores的big LITTLE组合CPU架构,而Linux Kernel的Schedule和PM也相互融合,随着EAS的到来支持了非对称多处理器架构,CFS不再是视所有CPU对等的SMP架构特有的调度类
重点问题
- Scheduler并不了解SoC的Power模块信息,2014年的提交”sched: Add a new SD_SHARE_POWERDOMAIN for sched_domain“解决了该问题,增加了Scheduler标记SD_SHARE_POWERDOMAIN,让其关联到Power Domain
- Schedule子系统的SMP特性:传统上Linux Kernel认为Multi-Cores中每个Core是相同的,尤其是Schedule子系统,其最重要的调度类CFS和RT都是以SMP的方式进行任务调度,而ARM big.LITTLE的出现意味着这种假设需要被打破,并且以一种更加通用的方式实现对big.LITTLE的支持,”ARM: topology: use new cpu_capacity interface“ 和 ”sched: consolidation of cpu_capacity“等提交开始解决这一问题,将每个CPU的Capacity区分对待
- Schedule子系统与CPUIdle的融合:将Schedule子系统中Idle Class的Idle Task与CPUIdle关联,以达到CPU更高效率的Idle状态来减小能耗,有如下提交来解决融合问题
- Schedule子系统与CPUFreq的融合:首先需要解决相同的负载在不同频率下看起来不同的问题,或者在相同频率下不同CPU类型(big或者LITTLE)下的负载不同的问题,”sched: Scale-invariant per-entity load-tracking“和”scheduler-driven cpu frequency scaling“带来了”Dynamic voltage and frequency scaling(DVFS)“技术,解决了这一问题
- 另外,在现有的代码中做修改,需要保证Schedule子系统,CPUFreq,CPUIdle以及PM等各个模块已有的功能不被破坏或影响,且相关的改动涉及的领域众多,需要经过多次的讨论,以及社区各个模块Maintainer以及开发这的Review以及测试,最终代码合入主线,这需要经历漫长的过程
解决了这些问题加入EAS后模块视图如图7所示,实际的决策过程不再由CPUFreq和CPUIdle等模块发出,而是将由Scheduler作出决策,而CPUFreq和CPUIdle分别提供信息让Scheduler知道CPU的Power状态,并根据Scheduler的决策实际控制CPU运行状态。
图7. Scheduler与CPUFreq和CPUIdle之间的关系(EAS支持之后)(图片参考自Linaro官网)
Kernel 提交
更多有关EAS的讨论信息可以查看链接内容:https://www.linaro.org/blog/summary-energy-aware-scheduling-workshop-linux-kernel-summit-2014/
EAS的设计思想也可以参考2014年由Nicolas Pitre在lwn发布的文章Teaching the scheduler about power management 以及 Energy-aware scheduling on asymmetric systems
Kernel Doc中的介绍:https://www.kernel.org/doc/html/latest/scheduler/sched-energy.html#background-and-terminology