无线电爱好网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

无线电爱好网 首页 技术应用 单片机 查看内容

CFS任务的负载均衡

2022-10-13 10:15| 发布者: 闪电| 查看: 4| 评论: 0

摘要: 负载均衡的系列文章共分为三篇,第一篇为框架篇,描述负载均衡的相关原理、场景和框架。本篇作为该系列文章第二篇,主要通过对任务放置场景(task placement)的均衡分布进行分析,以便加深读者对内核调度器实现任务 ...


二、Energy Aware Scheduling(EAS)



系统中的Energy Aware Scheduling(EAS)机制被使能时,调度器就会在CFS任务由阻塞状态唤醒的时候,使用find_energy_efficient_cpu()为任务选择合适的放置CPU。



1. 什么是Energy Model(EM)


在了解什么是EAS之前,我们先学习下EM。EM的设计使用比较简单,因为我们要避免在task placement时,由于算法过于复杂导致调度延迟变高。理解EM的一个重点是理解性能域(performance domain)。与sched domain相同,内核也有相应的结构体struct perf_domain来定义性能域。相同微架构的CPU会归属到同一个perf domain,4大核+4小核的CPU拓扑信息如下:



little cluster的4个CPU core组成一个perf domain,big cluster则组成另外一个。相同perf domian内的所有CPU core一起进行调频,保持着相同的频率。CPU使用的频点是分级的,各级别的频点与capacity值、power值是一一映射的关系,例如:小核的4个cpu,最大capacity都是512,与之对应的最高频点为1G Hz,那么500M Hz的频点对应的capacity就是256。为了将这些信息有效的组织起来,内核又为EM增加两个新的结构体,用于存储这些信息,它们都能够从perf domain中获取。




2. 什么是EAS


异构CPU拓扑架构(比如Arm big.LITTLE架构),存在高性能的cluster和低功耗的cluster,它们的算力(capacity)之间存在差异,这让调度器在唤醒场景下进行task placement变得更加复杂,我们希望在不影响整体系统吞吐量的同时,尽可能地节省能量,因此,EAS应运而生。它的设计令调度器在做CPU选择时,增加能量评估的维度,它的运作依赖于Energy Model(EM)。


EAS对能量(energy)和功率(power)的定义与传统意义并无差别,energy是类似电源设备上的电池这样的资源,单位是焦耳,power则是每秒的能量损耗值,单位是瓦特。


EAS在非异构系统下,或者系统中存在超载CPU时不会使能,调度器对于CPU超载的判定是比较严格的,当root domain中存在CPU负载达到该CPU算力的80%以上时,就认为是超载。



3. EM是如何估算energy的


由于EM将系统中所有CPU的各级capacity、frequence、power以便捷高效的方式组织起来,计算energy的工作就变得很简单了。内核中某个perf domian的energy可以通过em_pd_energy()获得,它实际上是通过假定将任务放置到某个CPU上,引起perf domain各个CPU负载变化,来估算整体energy数值。令人值得庆幸的是,该方法的实现代码中,有一半以上都是注释语句。


static inline unsigned long em_pd_energy(struct em_perf_domain *pd, unsigned long max_util, unsigned long sum_util)


max_util参数:perf domain各个CPU中的最高负载。

sum_util参数:perf domain中所有CPU的总负载。


前面提到过,同个perf domian下的所有CPU使用相同的频点,因此,cluster选择哪个频点,取决于拥有最大负载的CPU。EM首先会获取当前perf domain的最高频点和最大算力,并将max_util映射到对应的频率上,找到超过该频率的最低频点及相应的算力cs_capacity,毕竟我们要确保任务能够正常执行。


尽管我们知道EA可以很轻易的获得该频点的功率cs_power值,并且无论是cs_capacity还是cs_power,domain下所有CPU都是相同的,但是要获得各个CPU的energy,我们还需要一个跟各个CPU运行时间相关的信息。由于CPU不是超载的(超载情况下EAS不会使能),它不会一直运行任务,我们需要忽略掉idle的部分,这一点可以通过CPU负载与算力的比值进行估算。这是由于,负载体现了CPU执行任务的窗口时间,当整个窗口时间都在运行任务时,CPU的负载就达到其算力上限。


好了,现在需要的信息都齐全,只要将所有CPU的energy累加起来,就能得到整个perf domain的估计能量值。



4. EAS task placement


EAS在任务唤醒时,通过函数find_energy_efficient_cpu()为任务选择合适的放置CPU,它的实现逻辑大致如下:


(1)通过em_pd_energy()计算取得各个perf domian未放置任务的基础能量值;


(2)遍历各个perf domain,找到该domain下拥有最大空余算力的CPU以及prev cpu,作为备选放置CPU;


(3)通过em_pd_energy()计算取得将任务放置到备选CPU引起的perf domain的energy变化值;


(4)通过比较得到令energy变化最小的备选CPU,即将任务放置到该CPU上,能得到最小的domain energy,如果相对于将任务放置到prev cpu,此次的选择能节省6%以上的能量,则该CPU为目标CPU。


选择perf domain中拥有最大空余算力的CPU作为备选CPU,是因为这样可以避免某个CPU负载特别高,导致整个cluster的频点往上提。并且顾及到hot cache的prev cpu有利于提高任务运行效率,EAS对于prev cpu还是难以割舍的,除非节能可以达到6%以上。


另外,从上面的逻辑中也可以看出为何超载情况下EAS是不使能的。我们假定little cluster中cpu3存在超载的情况,那么无论你将任务放置到哪个CPU上,little cluster总是维持最高频点,对于同个perf domain下拥有最大空余算力的CPU来说,这样预估的energy是不公平的,与EAS的设计相违背,EAS希望能通过放置任务改变cluster的频点来降低功耗。




三、总结



本文作为负载均衡系列文章的第二篇,主要对CFS任务的task placement做场景分析,描述调度器在此过程中的选择实现和考量,由于篇幅和精力有限,很多具体的细节还没能呈现清晰,特别是对快速路径和慢速路径这一块的描述,希望有兴趣的朋友可以自行阅读源码实现,共同学习交流。


我们可以看到,目前task placement过程中的一些启发式算法还存在缺陷,也能看到开发者对此的不断思考和创新,随着内核版本的不断更新迭代,未来的调度算法一定会出现更多有意思的特性。



参考资料


[1] linux-5.4.24 source code


[2] linux-5.4.24/Documentation/power/ energy-model.rst


[3] linux-5.4.24/Documentation/scheduler/ sched-energy.rst


[4] https://lwn.net/Articles/728942/

12

路过

雷人

握手

鲜花

鸡蛋

QQ|关于本站|小黑屋|Archiver|手机版|无线电爱好网 ( 粤ICP备15040352号 ) 无线电爱好技术交流5 无线电爱好技术交流1无线电爱好技术交流9开关电源讨论群LED照明应用、电源无线电爱好技术交流4无线电爱好技术交流8无线电爱好技术交流10无线电爱好技术交流11

粤公网安备 44030702001224号

GMT+8, 2022-10-13 10:15 , Processed in 0.109201 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

返回顶部