当前位置: 首页 > news >正文

一文介绍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的功能应该很少被使用起来,针对重载场景的功耗优化,这里可能是一个值得尝试的点。

 

相关文章:

一文介绍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 比亚迪海鸥&#xff0…...

【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、缓…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...