一文介绍Linux EAS

能量感知调度(Energy Aware Scheduling,简称EAS)是目前Android手机中Linux线程调度器的基础功能,它使调度器能预测其决策对CPU能耗的影响。依靠CPU的能量模型(Energy Model,简称EM),EAS能为每个线程选择一个最能节约能量的CPU,并把对系统性能的影响降到最低。

EAS仅在异构CPU拓扑(如Arm big.LITTLE)上运行,因为这是EAS节约能量潜力最大的CPU拓扑结构。

注:本文分析整理基于OPPO Reno9 Pro+的开源代码https://github.com/oppo-source/android_kernel_oppo_sm8475

一、关键概念

1.1capacity

算力(capacity)是CPU调度中的一个基础概念,它反映的是一个CPU的计算能力,是个规格化的值,可以通过读取Android手机的文件节点

/sys/devices/system/cpu/cpu*/cpu_capacity获得每个CPU的最大算力。

CPU的最大计算能力= capacity-dmips-mhz * cpuinfo_max_freq / 1000。

其中”capacity-dmips-mhz”表示该cpu在1mHz频率下运行时可以执行多少个dmips,可以从处理器的device tree文件中获取到;

”cpuinfo_max_freq”表示该CPU支持的最大频率,单位kHz,所以上面的公式才除以1000,把计算单位kHz转为mHz。

为了便于算力的比较与计算,把处理器中计算能力最强的CPU的最大算力规格化为了1024。

在CPU算力与频率呈线性关系的处理器中:CPU某一频率点的算力 =

(该CPU某一频点频率 / 该CPU最大频率)* 该CPU的最大算力。

1.2 opp

Operating Performance Point (OPP),表示每个CPU支持的电压频率对(voltage/frequency tuple)。CPU的每个运行频率点,都有一个对应的电压。频率与电压正相关,频率越高,需要的电压越大。

1.3 power

在弄清了CPU某一频率点的算力后,再来看看CPU某一频率点的功率。CPU的Energy Model模块提供了相关文件节点,可以用来读取到CPU某一频率点的功率。

读取文件节点/sys/kernel/debug/energy_model/pd0/*/power,可以获取小核簇CPU各个频率点的功率(mW)

Energy Model代码中通过如下公式来计算CPU每个频率点的功率:

P = C * V^2 * f,其中C是CPU的电容(可以从处理器的device tree文件中读取“dynamic-power-coefficient”获取到),V和f是一个OPP的电压和频率。

1.4 能效比

CPU每个频率点对应的power/capacity值越低,其能效比越好,同一CPU,低频率比高频率的能效比好。整体上来说,小核簇CPU的能效比优于大核簇CPU的能效比,大核簇CPU的能效比优于超大核簇CPU的能效比;但是小核簇CPU高频段能效比差于大核簇CPU低频段的能效比,大核簇CPU高频段的能效比差于超大核簇CPU低频段的能效比。

从上图的能效比曲线上,可以清楚地看出如下特点:

  1. 在同为200 util算力时,小核簇CPU比大核簇CPU更耗电,因此在系统负载不重时,可以让线程倾向性的运行在大核CPU的低频段,从而不让小核CPU的频率运行在高频率段,来到达到省电而不影响系统性能的目的。
  2. 超大核簇CPU比大核簇CPU的能效比差很多,超大核CPU能不用需尽量不要用。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

二、能量可感知的线程选核

EAS代替CFS的线程唤醒负载均衡代码(task wake-up balancing code

),利用CPU的Energy Model和PELT/WALT统计到的CPU、线程负载信息为唤醒线程选择一个最能省电的CPU来运行。

EAS为线程选运行CPU的代码流程如下:

2.1find_energy_efficient_cpu

find_energy_efficient_cpu()为唤醒任务找到最节能的目标CPU。在每个性能域中查找空闲算力最大的CPU,并将其作为线程运行的潜在候选CPU。然后,使用Energy Model来确定哪个CPU候选是最节能的。

一个性能域一般对应一个CPU簇,如果线程调度到性能域空闲算力最大的那个CPU上运行,能保证该簇的CPU能运行在需求的最低频率。

因为线程迁移的性能代价比较大(比如cache失效),只有选出的最节能CPU比线程当前运行的CPU节约能量大于6%时,线程才会迁移到该CPU运行。

下图列出了find_energy_efficient_cpu()中最核心的代码,并对代码进行了详细的注释。

2.2compute_energy

compute_energy()预估线程p迁移到dst_cpu运行时,性能域pd的能量消耗。compute_energy()预估线程p迁移后,pd里util最大的cpu的max

_util及所有cpu的util之和sum_util,并调用Energy Model提供的API em_cpu_energy()计算线程迁移到性能域pd时的能量消耗。

下图列出了compute_energy ()的代码,并对代码进行了详细的注释。

2.3em_cpu_energy

em_cpu_energy() 是Energy Model提供的估算性能域所有cpu的能量消耗之和的api。它有4个参数,@pd需要估算能量消耗的性能域;@max_util性能域中利用率最高的CPU的利用率,它决定了整个性能域CPU的运行频率;@sum_util性能域中所有CPU的利用率之和,用于估算整个性能域的能量消耗;@allowed_cpu_cap 性能域允许的CPU的最大算力(可能由于thermal的限制,比原始值小)。

em_cpu_energy()运行流程如下:

  1. 根据性能域中利用率最高的CPU的利用率max_util估算性能域CPU需要的最低运行频率,这里有两点需要注意,估算频率用的利用率是1.25倍max_util,同时预期的CPU调频Governor是Schedutil或者与其类似的CPU的频率遵循它的利用率的Governor。
  2. 在CPU能量模型中找到满足frequency需求的最低性能状态ps。
  3. 根据性能域中所有CPU的利用率之和sum_util,cpu的算力,性能状态ps中的cost变量,估算整个性能域的能量消耗。计算公式:

ps->cost * sum_util / cpu的算力,其中ps->cost = ps->power * cpu最大频率 / ps->frequency,其值在能量模型初始化CPU各个性能状态时已计算好。

下图列出了em_cpu_energy ()的代码,并对代码进行了详细的注释。

三、EAS与负载均衡

从一般的角度来看,EAS最能提供帮助的是那些轻中等CPU利用率的场景。当重载CPU-bound任务在运行时,它们需要尽可能多的CPU算力,EAS很难做到在不严重损害性能的情况下节约能量。为了避免EAS影响性能,一旦某个CPU的利用率超过其算力的80%,整个根域标记为‘overutilized’,EAS被禁用。当根域里所有CPU的利用率小于其算力的80%,负载均衡被禁用,EAS覆盖了唤醒负载均衡代码。在不影响系统性能时,EAS会选择最省电的CPU来运行。因此,负载均衡被禁用来阻止其对EAS选核规则的破坏。当系统没有overutilized时,这样做是安全的。因为低于80%临界点意味着:

  1. 所有cpu都有空闲时间,因此EAS使用的utilization信号可以准确地代表系统中各种任务的“大小”;
  2. 所有任务都被提供了足够的CPU算力,不管它们的nice值是多少;
  3. 因为有空闲CPU算力,所有任务能满足规律的blocking/sleeping,在唤醒时,做了足够的负载均衡。

一旦某个cpu的算力超过80%这个临界点,上面三个假设至少有一个是不正确的。在这种情况下,整个根域的overutilized标志被置为true,EAS被禁用,负载均衡被重新使能。

由于overutilization的概念很大程度上依赖于检测系统中是否有空闲时间,因此必须考虑由更高(比CFS)调度类(以及IRQ)“窃取”的CPU算力。因此,overutilization的检测不仅包括CFS任务使用的CPU算力,还包括其他调度类和IRQ使用的CPU算力。

四、小结

EAS只在系统负载不重时,即系统中每个CPU的利用率都低于其算力的80%时才被启用,而且选出的最节能CPU只有比线程当前运行的CPU节约能量大于6%时,线程才会迁移到该CPU运行。因此EAS为线程选择最节约能量的CPU来运行的前提条件是很苛刻的,针对重载场景(比如游戏),EAS的功能应该很少被使用起来,针对重载场景的功耗优化,这里可能是一个值得尝试的点。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/17655.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

疑难问题定位案例复盘(三)

今天我们分享一个数据库被异常改写的案例,通过该案例我们可以学习总结出常规的文件被改写问题定位思路。 问题现象 1、测试环境在进行特定压力测试时发现页面登陆异常,且调试日志多个进程持续打印“数据库打开失败”日志。 2、测试环境在进行多个压力测…

【机器学习】决策树(实战)

决策树(实战) 目录 一、准备工作(设置 jupyter notebook 中的字体大小样式等)二、树模型的可视化展示1、通过鸢尾花数据集构建一个决策树模型2、对决策树进行可视化展示的具体步骤3、概率估计 三、决策边界展示四、决策树的正则化…

PyCharm2023.1下载、安装、注册以及简单使用【全过程讲解】

在使用PyCharm IDE之前,请确保自己的计算机里面安装了Python解释器环境,若没有下载和安装可以看看我之前的文章>>>Python环境设置>>>或者还可以观看视频讲解。 注意:本文软件的配置方式仅供个人学习使用,如有侵…

02- 目标检测基础知识及优化思路汇总 (目标检测)

要点: 参考综述:深度学习目标检测最全综述 - 爱码网参考表达:https://www.cnblogs.com/xjxy/p/13588772.html 一 发展历程 分类网络是目标检测的基础,必须熟练掌握。 1.1 传统算法 V.J Detector 19年前,P. Viola 和 …

【java】Java 异常处理的十个建议

文章目录 前言一、尽量不要使用e.printStackTrace(),而是使用log打印。二、catch了异常,但是没有打印出具体的exception,无法更好定位问题三、不要用一个Exception捕捉所有可能的异常四、记得使用finally关闭流资源或者直接使用try-with-resource五、捕获…

全注解下的SpringIoc 续4-条件装配bean

Spring Boot默认启动时会加载bean,如果加载失败,则应用就会启动失败。但是部分场景下,我们希望某个bean只有满足一定的条件下,才允许Spring Boot加载,所以,这里就需要使用Conditional注解来协助我们达到这样…

Java面试题总结 | Java面试题总结10- Feign和设计模式模块(持续更新)

文章目录 Feign项目中如何进行通信Feign原理简述 设计模式spring用到的设计模式项目的场景中运用了哪些设计模式写单例的时候需要注意什么工厂模式的理解设计模式了解么工厂设计模式单例设计模式代理设计模式策略模式**模板方法模式**观察者模式**适配器模式**观察者模式**适配…

HNU-操作系统OS-实验Lab2

OS_Lab2_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 前言 实验一过后大家做出来了一个可以启动的系统,实验二主要涉及操作系统的物理内存管理。操作系统为了使用内存,还需高效地管理…

【算法与数据结构】顺序表

顺序表 数据结构 结构定义结构操作 顺序表:结构定义 一个数组,添加额外的几个属性:size, count等 size: 数组有多大 count: 数组中当前存储了多少元素 顺序表三部分: 一段连续的存储区:顺序表存储元素的地方整型…

利用css实现视差滚动和抖动效果

背景: 前端的设计效果,越来越炫酷,而这些炫酷的效果,利用css3的动画效果和js就可以实现,简单的代码就能实现非常炫酷的效果。 原理: 利用 js监控scrollTop的位置,通过 top定位图片的位置&#x…

HDOJ 1022 Train Problem Ⅰ 模拟栈操作

🍑 OJ专栏 🍑 HDOJ 1022 Train Problem Ⅰ 输入 3 123 321 3 123 312输出 Yes. in in in out out out FINISH No. FINISH🍑 思路 🍤 栈顶元素与目标元素不匹配就进栈,匹配就出栈 🍤 匹配完:y…

『python爬虫』10. 数据解析之xpath解析(保姆级图文)

目录 安装库xpath入门怎么快速得到xpath路径xpath节点的关系xpath方法小型实战总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 安装库 pip install lxmlxpath入门 怎么快速得到xpath路径 (相对路…

webpack plugin原理以及自定义plugin

通过插件我们可以拓展webpack,加入自定义的构建行为,使webpack可以执行更广泛的任务。 plugin工作原理: webpack工作就像是生产流水线,要通过一系列处理流程后才能将源文件转为输出结果,在不同阶段做不同的事&#x…

二、PEMFC基础之电化学与反应动力学

二、PEMFC基础之电化学与反应动力学 1.电流、电流密度2.反应速率常数3.交换电流密度4.电化学动力学奠基石B-V方程5.活化损失计算Tafel公式6.计算案例 1.电流、电流密度 由法拉第定律 i d Q d t n F d N d t i\frac{dQ}{dt}\frac{nFdN}{dt} idtdQ​dtnFdN​ j i A j\frac{…

【五一创作】ERP实施-委外业务-委外采购业务

委外业务主要有两种业务形态:委外采购和工序外协,委外采购主要是在MM模块中实现,工序外协主要由PP模块实现,工序外协中的采购订单创建和采购收货由MM模块实现。 委外采购概念 委外采购,有些企业也称为带料委外或者分包…

牛客刷SQL题Day5

SQL69 返回产品并且按照价格排序 select prod_name , prod_price from Products where prod_price between 3 and 6 select prod_name , prod_price from Products where 6>prod_price and prod_price >3 踩坑1: between......and.......包括边界。 踩坑2&am…

网卡丢失导致集群异常

假期晚上有个电话,说集群故障,应用无法连接,节点一可以ssh登录,节点二已无法正常登录了,在节点一上需要ssh 私网ip地址才可以登录节点二,虽不是重点客户,有问题还是需要积极处理。 首先看集群状…

Cartesi 2023 年 4 月回顾

查看你不想错过的更新 2023年5月1日,感谢Cartesi生态系统中所有了不起的构建者! 在一个激动人心的旅程之后,我们的首届全球线上黑客马拉松正式结束了!有超过200名注册建造者参加,见证了所有参与者展示的巨大才华和奉献…

有必要给孩子买台灯吗?分享四款高品质的护眼台灯

有必要使用护眼台灯,尤其是有近视现象的孩子们。 现在很多孩子小学就开始近视了,保护视力刻不容缓呀! 很多人不知道,其实劣质光线是最大的眼睛杀手 给孩子随便买便宜的台灯,看着一样能用,其实时间久了 对孩子眼睛的…

SpringCloud:ElasticSearch之RestClient查询文档

文档的查询同样适用RestHighLevelClient对象,基本步骤包括: 1)准备Request对象2)准备请求参数3)发起请求4)解析响应 1.快速入门 我们以match_all查询为例 1.1.发起查询请求 代码解读: 第一步…