一文介绍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低频段的能效比。
从上图的能效比曲线上,可以清楚地看出如下特点:
- 在同为200 util算力时,小核簇CPU比大核簇CPU更耗电,因此在系统负载不重时,可以让线程倾向性的运行在大核CPU的低频段,从而不让小核CPU的频率运行在高频率段,来到达到省电而不影响系统性能的目的。
- 超大核簇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()运行流程如下:
- 根据性能域中利用率最高的CPU的利用率max_util估算性能域CPU需要的最低运行频率,这里有两点需要注意,估算频率用的利用率是1.25倍max_util,同时预期的CPU调频Governor是Schedutil或者与其类似的CPU的频率遵循它的利用率的Governor。
- 在CPU能量模型中找到满足frequency需求的最低性能状态ps。
- 根据性能域中所有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%临界点意味着:
- 所有cpu都有空闲时间,因此EAS使用的utilization信号可以准确地代表系统中各种任务的“大小”;
- 所有任务都被提供了足够的CPU算力,不管它们的nice值是多少;
- 因为有空闲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的功能应该很少被使用起来,针对重载场景的功耗优化,这里可能是一个值得尝试的点。
相关文章:

一文介绍Linux EAS
能量感知调度(Energy Aware Scheduling,简称EAS)是目前Android手机中Linux线程调度器的基础功能,它使调度器能预测其决策对CPU能耗的影响。依靠CPU的能量模型(Energy Model,简称EM),…...

【五一创作】【Midjourney】Midjourney 连续性人物创作 ① ( 通过垫图方式生成类似图像 )
文章目录 一、Midjourney 生成图像二、通过垫图方式生成类似图像 一、Midjourney 生成图像 Midjourney 可以生成高质量的图像 , 但是 生成过程有很大的随机性 , 输入同样的提示词指令 , 其输出结果也存在很大的不同 ; 如果要 生成稳定的人物角色 , 场景 , 描述连贯的内容 , 这…...
牛客刷题错题记录【03】
链接:https://www.nowcoder.com/questionTerminal/8242fbf4b3a241219989b3e1d0ee82db 来源:牛客网 下列关于Vue和React的描述错误的是( Vue进行数据拦截/代理,对数据更敏感,数据驱动视图自更新,而React需…...

maven-gpg-plugin gpg禁用交互式输入密码 免密码输入 设置默认密码 关闭pinentry-qt输入 passphrase
一、问题描述 在使用maven-gpg-plugin打包jar时,默认情况下,每次都会弹出对话框要你输入密码: 这就有点烦,有啥办法可以设置默认方法没?网上找了一圈,通过搜索关键词“passphrase”,找到了一些教程&#x…...
急需国产化替代的重要的工程软件有哪些?
急需国产化替代的重要的工程软件有哪些? 软件一:AutoCAD等领域常用设计软件 AutoCAD由Autodesk公司开发的工程辅助设计软件,目前是设计领域 最重要的工程软件。在高端3D的CAD领域,国产软件几乎全军覆没,在中 低端还有…...

计算机组成原理 4.2.1存储芯片连接
连接原理 主存储器 通过数据总线、地址总线和控制总线和CPU相连数据总线的位数正比于数据传输率地址总线的位数决定可寻址的最大地址空间控制总线(读/写)指出总线周期的类型和本次输入/输出完成的时刻 但是实际中存储芯片往往很小难以满足地址和数据的位数需求,此…...
这份【互联网项目全流程表】,实在是泰裤辣!!!
互联网行业是一个快速变化的行业,作为半个互联网人。太明白用户和环境每天都在不停地变化是什么感受了。 从项目开始到项目结束,要经历立项、计划、执行、结项,项目一周一个,一周一个。(**的)为了省时间…...

JAVA医院管理云HIS统计报表子系统、系统管理字系统功能实现
一、统计报表子系统 统计报表子系统功能模块:包括门诊收入汇总、住院收入汇总、收费统计报表、收费明细报表、 缴款日报、门诊收费汇总、住院科室日志、住院结算汇总、医疗项目统计、检查项目统计、 检验项目统计、月末收支汇总、药品进销存统计。 (1…...
5.Java中抽象类和接口
抽象类与接口 相同不同先从抽象类说起再从接口说起 相同 1.两者都不能实例化,因为他们都不全。(例如可以实例化一个苹果,但是不能实例化水果) 2.一个类可以实现多个接口,但是只能继承一个抽象类 3.如果这个类实现了接…...

中国平安将在2023年出现转机,复苏才刚刚开始
来源:猛兽财经 作者:猛兽财经 在解封后股价出现短暂反弹之后,由于市场担忧中国平安(02318)人寿保险部门新业务NBV(用于衡量寿险公司新业务价值的一个重要指标,当一家保险公司的NBV指标越高,那么说明每新增…...
CUDA编程(六):代码分析与调试
CUDA编程(六):代码分析与调试 代码分析与调试方法使用printf打印变量信息使用CUDA的错误检查功能使用CUDA-GDB进行调试使用Nsight进行调试使用nvprof / nvvp工具 参考文献 代码分析与调试方法 CUDA代码的运行时可能会遇到内存溢出、内存非法…...

身份鉴别解读与技术实现分析(1)
6.1.4.1 身份鉴别 本项要求包括: a) 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; b) 应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施 在等级保护体系中,级别越高…...
为什么说7.38万的比亚迪海鸥比仰望更重要
出品 | 何玺 排版 | 叶媛 售价7.38万元起步、速度却能上130迈。注意看,这就是A0级轿车中的“新皇”—比亚迪海鸥。 出乎车圈事前的意料,海鸥这款A0级车型,在上海车展里获得的人气和追捧并不逊色于百万豪车仰望。 01 比亚迪海鸥࿰…...

【LLM】低成本部署大语言模型, 并且还能达到部署在GPU上差不多的效果
目录 前言 部署 效果 问题1:人类为什么需要睡觉? 问题2:世界上最高的山峰是什么? 前言 点进来看本文的应该都知道模型对硬件的要求很高, 那我也不废话了, 直接安排最近发现的一个开源项目, 它可以帮助我们降低部署模型的成…...

Doris(25):Doris的函数—Bitmap函数
1 BITMAP_AND(BITMAP lhs, BITMAP rhs) 计算两个输入bitmap的交集,返回新的bitmap. select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(2))) cnt; select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(1))) cnt; 2 BITMAP_CONTAINS(BITMAP bitmap, BIGINT input…...

简单分享微信小程序上的招聘链接怎么做
招聘小程序的主要用户就是企业招聘端和找工作人员的用户端,下面从这两个端来对招聘小程序开发的功能进行介绍。 企业端功能 1、岗位发布:企业根据自身岗位需求,在招聘app上发布招聘岗位及所需技能。 2.简历筛选:根据求职者提交的简历选择合适的简历,并对公开发布的简历进行筛…...

【英语】大学英语CET考试,翻译部分(修饰后置,定语从句,插入语,多动句,无主句)
文章目录 3大知识点与出题形式1、修饰后置(使用介词)2、修饰后置(定语从句(被逼无奈)/which(非限制性,加高级))3、修饰后置(插入语或同位语(只有1…...

设计模式——代理模式
导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线设计模式牛客面试题 目录 1、代理模式的基本介绍 2、静态代理 3、JDK动态代理 4、Cglib 代理 5、代理模式 的变体(应用场景) 1、…...

Shiro-721---漏洞复现
漏洞原理 Shiro rememberMe 反序列化远程代码执行漏洞 由于 Apache Shiro cookie 中通过 AES-128-CBC 模式加密的 rememberMe 字段存 在问题,用户可通过 Padding Oracle 加密生成的攻击代码来构造恶意的 rememberMe 字段,并重新请求网站,进…...

Linux【模拟实现C语言文件流】
✨个人主页: 北 海 🎉所属专栏: Linux学习之旅 🎃操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌇前言🏙️正文1、FILE 结构设计2、函数使用及分析3、文件打开 fopen4、文件关闭 fclose5、缓…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...