内核领域-功耗机型的续航基线优化问题-技术调研报告-王井玉_20211216

内核领域-功耗机型的续航基线优化问题-技术调研报告_20211216

一. 问题

  • 软硬件环境

设备: Loongson Loongson-LS3A5000-7A1000-1w-V0.1-CRB (Loongson_SKU) Notebook
操作系统: UnionTech OS Desktop 20 Professional Linux version 4.19.0-loongson-3-desktop (uos@uos-PC) (Debian 8.3.0-6.lnd.vec.23) #4206 SMP Thu Nov 4 11:19:17 CST 2021
处理器: Loongson-3A5000M (四核 / 四逻辑处理器)
主板: Loongson-LS3A5000-7A1000-1w-V0.1-CRB
内存: 8GB(SCC08GS03H3F1C-32AA DDR4 3200MHz (0.3ns))
显示适配器: Oland [Radeon HD 8570 / R7 240/340 OEM]
音频适配器: HDA (High Definition Audio) Controller/Oland/Hainan/Cape Verde/Pitcairn HDMI Audio [Radeon HD 7000 Series]
存储设备: Silicon Motion Disk (256 GB)
电池: 电池
蓝牙: Intel Bluetooth Device
网络适配器: Wireless 7265/RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
鼠标: ImPS/2 Generic Wheel Mouse (ImPS/2 Generic Wheel Mouse)
键盘: AT Translated Set 2 keyboard (AT Translated Set 2 keyboard)
显示设备: LCD Monitor(13.9 英寸 (309x173 mm))
其他设备: FT9201Fingerprint.

  • 重现步骤

    各个模式下测试续航时间,当前检测仪器限制只能测试运行状态的续航时间。

  • 问题现象

    目前所有笔记本电池供电续航时间短。

  • 期望结果

    笔记本电池供电延长续航时间。

二. 现状

  笔记本不使用外部电源供电时,只使用内部电池供电维持正常使用和待机、休眠等模式,由于很难去更换,那么低功耗就显得尤为重要。目前笔记本功耗无基础数据、无优化方案,功耗相关的知识薄弱。

  Linux 作为一个偏重 server side 的操作系统,它效仿的对象主要是传统的 Unix。加上早期 Linus 等开发者使用的电脑一般都比较老旧,因此 Linux 一开始其目标主机就不是普通用户使用的台式机或者笔电,对硬件的向后兼容性也比较重视,而对个人电脑硬件上的新特性则支持不是那么优雅——当然,这也和不少硬件厂商既不愿意为 Linux 自行开发驱动程序也不愿意为 Linux 开发者提供足够技术资料的做法有关。一个对于个人电脑用户比较明显的影响,就是 Linux 对计算机的电源管理支持一直都不如 Windows,即算是经过个人电脑业中的老战士 Apple 基于 BSD 改造出来的 OS X,在自家的 iBook/PowerBook 上,表现出来的电源管理能力也不如采用 Windows 的笔电(而例如 Panasonic 的笔电,甚至可以提供最长15个小时的续航能力)。

三. 技术方案

3.1 功耗是怎么产生的?功耗大小与哪些因素有关?

  低功耗的目的就是提高电池供电的电子产品的使用时间,分析功耗前先认识电量相关的基础知识。功耗(Power)和能量(Energy)是两个完全不同的概念,功耗是一个瞬时的概念,而能量是一个时间内的消耗。

  • 能量=功耗*时间
    内核领域-功耗机型的续航基线优化问题-技术调研报告-王井玉_20211216_第1张图片

  稍微分析一下就可以知道,比如PC笔电,能量越大(也就是电池越大),使用时间越长。同时如果功率越小,就显得越不耗电,使用时间就越长。当年高通骁龙820就是功耗没做好,输给了麒麟920,给了华为麒麟崛起的机会。现在华为手机电池耐用已经深入人心了。同时随着设备消耗能量,会产生热量。功耗越大,产生热量越快。如果不能及时散热,那么设备温度就会升高。温度升高可能导致设备不能正常工作甚至损坏。所以有些芯片会在温度升高时候,把频率降低,本来能跑2GHz的CPU,温度高了就只能跑1G,这个以前在用手机玩游戏的时候体验比较明显。可以看到,低功耗技术直接决定商业竞争的成败!低功耗对芯片的影响还有很多方面。

  现在笔记本已经非常普遍,人们如何增加计算机的续航已经成 为一个难题,比如不同场景下笔记本的功耗是不同的,玩游戏比看电影更费电,更多的是CPU功耗,对电池影响最大的是CPU的频率。当我插电时,我想要全速,但是当我拔掉插头时,我想要尽可能多的电池续航。其中CPU处理器的功耗过大时会产生大量的热量,如果散热条件跟不上,那就会因为温度过高而影响晶体管的稳定性。

  在一个系统中,数量最多的是设备,耗电最多的也是设备,因此设备的电源管理是Linux电源管理的核心内容。而设备电源管理最核心的操作就是:在合适的时机(如不再使用,如暂停使用),将设备置为合理的状态(如关闭,如睡眠)。电源管理模型包括:系统S3S4S5模型和Runtime电源管理模型。

  我们所说的笔记本续航,主要是总的耗电功率,功耗来源分析其包括以下主要设备的耗电功率:1.CPU,2.显卡,3.硬盘,4.主板,5.光驱,6.内存,7.网卡,8.声卡,9.电源的自身损耗,10.显示器等。系统低功延长续航时间的设计是在操作系统层实现。因为操作系统管理系统所有软硬件资源,并获取系统的各种状态信息,控制硬件设备的状态。以下是对各个设备功率的概述:

  1. CPU:CPU是计算机的心脏,也是计算机的主要耗能大户。CPU是SOC主控制器,工作时CPU一般都必须要打开,随着CPU频率越来越高,功耗也越来越大。所以现在的多核,大小核就比较流行,不同场景下用不同功耗的CPU核;现在INTEL的P4主流CPU功率最大不超过84W。对于影院等应用程序来说,软件解码场景使用CPU满负荷运行,硬解码使用GPU时CPU大部分时间在等待任务而且很少满负荷运行,CPU的使用率可以调频减少功耗。AMD和龙芯(mips、loongarch)的CPU由于制程限制,一般情况下消耗的功率要大一些。然而计算机是不断发展的,现在的最新型号的CPU使用环境的不同,处理任务的不同,相同型号的CPU功耗都不一样。对于一般的办公用计算机,由于处理的任务并不重,CPU绝大部分时间使用在非满负荷情况下,可调整部分较多续航优化空间较大。而对于那些需要经常做3D效果和喜爱打游戏的玩家,CPU需要在很高的负荷下运行,功率消耗也大,而且那些电脑都是高频电脑,很多人还爱超频,续航优化空间有线。
      考虑到以后发展的需要,尽量先调试出最大的续航时间,再根据使用环境的不同做适配。
  2. 显卡:显卡是计算机的图形处理中心,由于不同群体对显卡的要求不一样,所以显卡的耗电量也有很大的不同,从集成显卡到高端主流显卡都在被广泛应用。但即使是相同型号的显卡,使用环境不一样,其功率也有巨大的差异,比如2D图形和3D图形。
      下面是引用香港网站HKEPC发布的GeForce6800Ultra的评测:HKEPC采用的是普通的电流表进行测试,之后对功率进行大约计算。在2D模式下,5V的输入电流为1.86A,约为9.3W,而12V的电流为1.97A,约23.64W,合共32.94W。而在3D模式下,电流的波幅十分大,这全看GPU的工作量和其画面的复杂程度,我们利用3DMark03作测试,原来最复杂的工作并不是Game4的MotherNature,而是Fill-Rate(MutilTexture)。在这个测试项目中,5V的输入电流为3.01A,约为15.05W,而12V的电流为4.50A,约54W,合共70W。从以上数据可以看出,相同型号的GPU其在处理2D图形和3D图形时的差距达到一倍多。对于我们一般的办公用计算机,由于大部分使用的是集成显卡,功耗最大为十几瓦,一般不会超过15W即使使用的是非集成显卡,也是用的低端显卡,功率也不会超过20W的,建议取20W。而对于游戏为主的高级网卡,以及需要频繁做大量3D的计算机,功耗差异更大。
      为了将来的发展需要,建议先验证主流机型的各款显卡。
  3. 硬盘,硬盘(机械、固态等)使用时功率并不大,尤其笔记本并不会频繁地从硬盘中写入和读取数据,服务器优先性能不涉及功耗优化,所以平时硬盘大部分时间工作在空负荷情况下,由于将来大硬盘是发展趋势,所以考虑到发展需要,硬盘功耗优化过程中优先保证文件系统稳定。
  4. 主板,主板自身消耗涉及电路设计,需要修改固件,协调厂商获取硬件相关资料(原理图、PCB布线、datasheet等),逐个分析硬件设计方案是否有功耗优化空间,比如在系统休眠前后,如何设置GPIO管脚状态。考虑到将来的发展可联系整机厂商联调。
  5. 光驱,光驱的功率消耗,考虑到以后发展,笔记本计算机已经很少装有内置光驱,暂不考虑。
  6. 内存,网卡(有线、无线),声卡的耗电量,由于缺乏具体芯片数据,对于笔记本三者加起来功耗优化空间也很大,比如无线网卡在电池供电状态切换到节能模式以降低功耗,功耗不会下降太多,长时间来看可延长了设备的使用寿命。外置喇叭看电路设计可能也是耗电大户。
  7. 电源,电源是计算机运行所需的最关键的设备,缺了它或者它运行不正常时都会给电脑的运行带来不良影响甚至产生事故,也是我们重点关注的对象。电流在经过前级整流滤波电路后兵分两路。一路是常电,即输出为+5V,它是一个待机电压,供应给主板,也就是电源没有启动的时候输出到主板的,用来负责网络启动、键盘启动和软启动等。但我们平时很少使用那些功能,所以一般也就几乎不损耗功率。另一路是只有开机才能供电的电路,负责供电给CPU等上面提到的各个设备。还有,由于电源内部存在变压器和整形滤波电路,所以,当笔记本电脑工作的时候,只要电池电源接在电路上,就存在部分电能损耗。
      还有就是电脑电池电源的功率因素问题,是我们关心的一个非常重要的方面。对于计算机和其它一切靠直流电压工作的电子电路,离开无功功率是根本无法工作的。为了让计算机电路能正常工作,必须向其提供平滑了的直流电压。这个“平滑”工作必须由接在计算机电源整流器后面的滤波电容器C来完成。这个滤波器就像一个水库,电容器里面必须储存足够数量的电荷,在整流半波之间的空白时,使电路上的工作电压仍不间断,能保持正常电平。换句话说,即使在两个脉动半波之间无输入电能时,电压电平也无显著的变化,这个功能是靠电容器内的储能来实现的,储存在电容器内的这部分能量就是无功功率。所以说,计算机是靠无功功率的支持,才能保证电路正确运用有功功率实现正常运行的。
      因此可以说,笔记本电脑电池电源的电芯是功耗优化的重点!
  8. 屏幕显示器:屏幕显示器随着以后的发展,高分屏显示器会越来越普及,耗电量也会越高。
    此外,笔记本电脑的外设(usb hub、触控板等)的功率虽然优化空间小,但对最长续航时间还是有影响。降低显示器亮度,比如在做文字编辑时,将背景调暗些,节能的同时还可以保护视力、减轻眼睛的疲劳强度。当电脑在播放音乐、评书、小说等单一音频文件时,可以彻底关闭显示器等。

  综上所述,笔记本电脑的功率计算应该按照不同场合和不同要求来分开计算,不同情况的消耗功率是不同的,比如CPU是否全速运行、屏幕的亮度等。对于一般办公环境,电脑的功率大致为:CPU+显卡+硬盘+主板+光驱+内存等+电源+外设等+显示器=功耗,在目前的状况下办公电脑不涉及大量计算和游戏,而且目前的很多屏幕显示器,也支持节能功能。

  另外,电脑电源由于感性负荷较多,所以对外面设备产生感应电流和漏电的可能比较大。我们在拆开电脑的时候,通常会先洗手以释放身上的静电,以免对设备造成危害,但由于洗手后,人皮肤的电阻会减小。所以我们每次接触电脑的时候都会碰到强烈的漏电情况,而且漏电电流还比较大,手都会感到麻麻的感觉,所以我觉得电脑插座应该设置好保护线,最好还是安装漏电保护装置,尤其是对于那些小孩有可能接触到电脑机身的场合,更应该注意电脑的漏电保护。

  可参考Windows下续航优化,比如Overclockulator功耗测试软件。关机状态的耗电理论上应该为0W,耗电大小从小到大排序,S5关机

  Linux 内核的 PM 框架涉及众多组件,弄清楚这些组件之间的依赖关系,在合适的着眼点上进行优化,采用正确的方法进行 PM 的编程,对改善代码的质量、辅助功耗和性能测试都有极大的好处。 当然,这些方法的前提永远是芯片的功能要满足要求。功率再低,功能不满足的芯片和板砖有什么区别。芯片的功能要满足要求这个基础就决定了这些方法有一些限制,比如不可能把电压降到0,不可能让信号永远不翻转。这些都是前提。

  低功耗技术就是一系列的降低功耗的技术。在了解低功耗技术之前,我们必须先了解功耗的构成。现在几乎都从 PC 机换到了笔记本电脑了。但是使用笔记本有个问题,我们希望电池耐用,我们可以使用到每一点电量。所以,我们需要知道电量都去哪里了,是不是浪费了。

  • 一个设备的功耗由两部分组成:动态功耗和静态功耗。
  1. 动态功耗是设备运行时或者说信号改变时所消耗的功耗;
  2. 静态功耗是设备上电但是信号没有改变时所消耗的功耗;

  这里要注意的是:在设备运行时,也需要消耗静态功耗的,因为设备运行时也是上电状态。功耗分类把静态功耗单独拿出来,只是为了理论分析方便。

  无 AC 电源时达到硬件该有的性能和随时获得最长电池使用时间是相互冲突的,需要进行取舍。针对待机、休眠等模式,需要判断各个设备的工作状态以及电路板上是否还有其他的芯片在工作,可能它们仍然在消耗电量,所以我们在进入待机活或休眠前应该要把其他芯片给关闭(可以通过特定的指令或者片选线)。条件允许的可以直接切断它们的电源。

  进入待机、休眠模式后,只是各个设备中最耗电的内核部分被关了,而所有寄存器和内存中的值是保持不变的,所以它的外设还在消耗电量,所以我们要在进入待机、休眠模式之前把开启的外设给关了。这里要注意一点:外设开启时是先开时钟再设置寄存器,关闭时先清除寄存器再关闭时钟。理解为:操纵一个外设的寄存器肯定是需要时钟的,如果我们先把时钟给关了,那么还怎么操作寄存器呢,如果光关了时钟,不清寄存器的相应位,那么外设还处于“静态耗电”的状态。

  关于各个设备的IO口的电平,这个是非常重要的一点,和之前提到的外设一样,GPIO也是一种外设,但是特殊的是,这个外设是和芯片外部直接打交道的,如果GPIO外部接了个上拉电阻,而你在进入待机、休眠等模式之前设置的IO口是低电平的,那么电流不就通过电阻,流到IO口里来了,比如正常的说接了个10k的上拉电阻,接到3.3v电压上,那么电流就是330uA,这个值可不小呢,各个设备在进入待机、休眠后极限最小电流好像能达到几uA或者几十uA。那么这个电路就是因为这个电阻,停机电流比别人大了将近几十倍了,这还怎么比?所以IO口是绝对不能被忽视的。设备芯片复位以后所有引脚都是浮空输入模式,理论上悬浮空输入时IO口的状态为高阻态是最省电的,那么我们只要把所有IO都DeInit就可以了。但是事实上不是,我把没有用到的管脚全部推挽输出高电平或低电平,不用的外部晶振的引脚要改为上拉输入才省电,外部有上拉下拉电阻的引脚分别推挽输出高电平和低电平,一般电路中上拉电阻比较多(比如IIC的总线外部都有上拉的)。和外部芯片相连的引脚都推挽输出低电平,因为外部芯片断电后所有引脚都是高阻态或接地的吧,如果你弄个高电平,就可能会有电流流过去。另外,主板上是否带有稳压相关的芯片,这类芯片一般进入待机、休眠也会存在耗电。

  • 功耗的电量单位–电流单位,表明电流的大小

A:安
mA:毫安
uA:微安
1A=1000mA=1000*1000uA

  • 电池容量:电量的单位,常用来表明电池的容量,意即以多大的电流放电,能够持续提供多长时间的电流。

18650电芯通常容量为2200mAh毫安时.
1号电池2.5Ah.
2号电池1.5Ah.
3号电池500mAh.
7号电池200mAh.

  • 电池容量的计算方法:

容量=放电电池(恒流)× 放电时间(小时)
反过来: 放电时间T=容量/放电电流(恒流)
比如一个电池用500MA(毫安)的恒定电流放了2 个小时,那么这个电池的容量就等于500MA*2H=1000MAH=1AH。
再如一个电池用5安的电流放了2个小时,那么该电池的容量就是10AH。

电脑主板纽扣电池CR2032:210mAh
内核领域-功耗机型的续航基线优化问题-技术调研报告-王井玉_20211216_第2张图片
  笔记本电池多数为锂电池,锂电池的电量大小,只看【mAh毫安时】并不够的,还需要看到【Wh瓦时】,这才是锂电池真正的能量容量,后续按照锂电池放电进行功耗优化。

3.2 电源管理

3.2.1 系统电源的组成和管理模型的四种状态

  在计算机系统依靠电能运行,Linux 系统中称作电源管理(Power Management),电源管理的核心思想只在需要设备功能时才给它供电。Linux内核提供了三种Suspend: Freeze、Standby和STR(Suspend to RAM),在用户空间向”/sys/power/state”文件分别写入”freeze”、”standby”和”mem”,即可触发它们。Linux电源管理中,相当多的部分是在处理Hibernate、Suspend、Runtime PM等功能。

  电源管理(Power Management)在Linux Kernel中,是一个比较庞大的子系统,涉及到供电(Power Supply)、充电(Charger)、时钟(Clock)、频率(Frequency)、电压(Voltage)、睡眠/唤醒(Suspend/Resume)等方方面面。内核中,Suspend及Resume过程涉及到PM Core、Device PM、各个设备的驱动、Platform dependent PM、CPU control等多个模块,涉及了console switch、process freeze、CPU hotplug、wakeup处理等过个知识点。系统suspend/resume的过程,要求设备也同步suspend/resume。系统hibernate及恢复的过程,要求设备在suspend/resume的基础上,增加poweroff的动作。系统reboot的过程,包括halt、power off、restart等,要求设备进入shutdown状态,以避免意外产生。

  传统的suspend/resume已经很明确了,无非是按照pm_domain—>device driver或者class—>device driver或者bus—>device driver的顺序,调用相应的回调函数。

  • 电源管理的核心思想
  1. 如果设备有省电模式,尽量用起来 – 联系整机厂商协调硬件原理图,确认芯片的供电是否可单独控制。芯片供电:需要指定机型的原理图,比如清华同方和L71的硬件原理图,分析芯片的供电是否可以单独控制,以便系统各个场景下更好的实现节省功耗,比如:不使用音频时卸载声卡驱动同时彻底关闭声卡供电。
  2. 实时的关闭暂时不使用的部分(可称作“工作状态到非工作状态的转移”)。例如人们使用PC在编辑excel时,声卡模块就没必要供电,硬件设计上声卡芯片如果能够关闭, 给它提供开关(比如单独供电)。
  3. 当需要重新使用那些已关闭部分时(可称作“非工作状态到工作状态的转移”),不能有太长时间的等待,且转移过程不能消耗太多的能量。
  • 系统电源管理模型的四种状态
  1. On – Working正常工作状态
    Runtime电源管理模型:指的是在On状态如何省电,包括:降低运行时钟、关闭无用的设备。linux内核仅提供电源管理的功能:包括电源管理框架和具体设备的电源管理(驱动),如何使用及合适使用由App决定(策略)。
  2. Standby – 空闲模式(CPU和RAM是上电的但是不执行程序了)
  3. Suspend to RAM – S3待机模式(RAM是上电的,并且running content(运行状态)是保存在RAM中)
  4. Suspend to Disk – S4休眠模式(All content保存在Disk硬盘或者flash上)
  • 启动待机休眠

启动 suspend to ram:(睡眠)//suspend to disk(休眠),echo mem > /sys/power/state //启动休眠的方法就是往/sys/power/state 写字符串,会调用state_store函数(还有个state_show是读的时候被调用 )。

3.2.2 S3S4S5电源管理模式功耗分析
  • S3S4S5电源管理模式功耗分析,驱动需要支持休眠和唤醒,比如suspend函数和resume函数
  1. 硬件更复杂:外接更多设备,这些设备也需要单独供电,休眠前可能需要单独设置
    休眠时:1、暂停应用程序(包括用户程序、后台服务、内核线程)
        2、暂停各类设备
        3、停止CPU
    唤醒时:1、启动CPU
        2、启动设备
        3、启动应用程序
  2. 软件更复杂:需要有统一的框架,唤醒后可能需要重新初始化
3.2.3 runtime电源管理模式(内核文档runtime_pm.txt有详细描述)

  runtime是在系统正常工作的时候单独控制某个设备休眠和唤醒,相比S3S4S5续航优化,比如系统睡眠模型是让整个系统休眠,runtime的场景更复杂也更难,需要在不影响使用设备功能的前提下尽可能让它省电。runtime PM 框架不需要用户程序的干涉,由Kernel统一调度,实时的关闭或打开设备,以便在使用性能和省电性能之间找到最佳的平衡等。

  怎样动态地打开或关闭设备的电源?最简单的方法,在驱动程序的open函数中打开电源,在close函数中关闭电源,上述方法有一个缺点: 多个应用同时访问设备时可能造成干扰。另外支持UEFI固件需要考虑固件参数的正确性。

3.2.4 进程冻结

  什么是进程冻结,进程冻结技术(freezing of tasks)是指在系统hibernate或者suspend的时候,将用户进程和部分内核线程置于“可控”的暂停状态。

  • 为什么需要冻结技术 – 假设没有冻结技术,进程可以在任意可调度的点暂停,而且直到cpu_down才会暂停并迁移。这会给系统带来很多问题:
  1. 有可能破坏文件系统。在系统创建hibernate image到cpu down之间,如果有进程还在修改文件系统的内容,这将会导致系统恢复之后无法完全恢复文件系统。
  2. 有可能导致创建hibernation image失败。创建hibernation image需要足够的内存空间,但是在这期间如果还有进程在申请内存,就可能导致创建失败。
  3. 有可能干扰设备的suspend和resume。在cpu down之前,device suspend期间,如果进程还在访问设备,尤其是访问竞争资源,就有可能引起设备suspend异常。
  4. 有可能导致进程感知系统休眠。系统休眠的理想状态是所有任务对休眠过程无感知,睡醒之后全部自动恢复工作,但是有些进程,比如某个进程需要所有cpu online才能正常工作,如果进程不冻结,那么在休眠过程中将会工作异常。

  冻结的对象是内核中可以被调度执行的实体,包括用户进程、内核线程和work_queue。用户进程默认是可以被冻结的,借用信号处理机制实现;内核线程和work_queue默认是不能被冻结的,少数内核线程和work_queue在创建时指定了freezable标志,这些任务需要对freeze状态进行判断,当系统进入freezing时,主动暂停运行。

  kernel threads可以通过调用kthread_freezable_should_stop来判断freezing状态,并主动调用__refrigerator进入冻结;work_queue通过判断max_active属性,如果max_active=0,则不能入队新的work,所有work延后执行。
  标记系统freeze状态的有三个重要的全局变量:pm_freezing、system_freezing_cnt和pm_nosig_freezing,如果全为0,表示系统未进入冻结;system_freezing_cnt>0表示系统进入冻结,pm_freezing=true表示冻结用户进程,pm_nosig_freezing=true表示冻结内核线程和workqueue。它们会在freeze_processes和freeze_kernel_threads中置位,在thaw_processes和thaw_kernel_threads中清零。
  fake_signal_wake_up函数巧妙的利用了信号处理机制,只设置任务的TIF_SIGPENDING位,但不传递任何信号,然后唤醒任务;这样任务在返回用户态时会进入信号处理流程,检查系统的freeze状态,并做相应处理。

任务主动调用try_to_freeze的代码如下:

static inline bool try_to_freeze_unsafe(void)
{
	if (likely(!freezing(current))) //检查系统是否处于freezing状态
		return false;
	return __refrigerator(false); //主动进入冻结
}
 
static inline bool freezing(struct task_struct *p)
{
	if (likely(!atomic_read(&system_freezing_cnt))) //系统总体进入freezing
		return false;
	return freezing_slow_path(p);
}
 
bool freezing_slow_path(struct task_struct *p)
{
	if (p->flags & PF_NOFREEZE)  //当前进程是否允许冻结
		return false;
 
	if (pm_nosig_freezing || cgroup_freezing(p))  //系统冻结kernel threads
		return true;
 
	if (pm_freezing && !(p->flags & PF_KTHREAD)) //系统冻结用户进程
		return true;
 
	return false;
}

进入冻结状态直到恢复的主要函数:

bool __refrigerator(bool check_kthr_stop)
{
...
	for (;;) {
		set_current_state(TASK_UNINTERRUPTIBLE);  //设置进程为UNINTERRUPTIBLE状态
 
		spin_lock_irq(&freezer_lock);
		current->flags |= PF_FROZEN;  //设置已冻结状态
		if (!freezing(current) ||
		    (check_kthr_stop && kthread_should_stop())) //判断系统是否还处于冻结
			current->flags &= ~PF_FROZEN;  //如果系统已解冻,则取消冻结状态
		spin_unlock_irq(&freezer_lock);
 
		if (!(current->flags & PF_FROZEN))  //如果已取消冻结,跳出循环,恢复执行
			break;
		was_frozen = true;
		schedule();
	}
......
}
3.2.5 电源管理有关的Source code

  电源管理有关的Source code包括传统意义上的Power Management,如Power Off、Suspend to RAM、Suspend to Disk、Hibernate等,对I/O设备的运行时电源管理(运行时PM)的支持,以便在使用性能和省电性能之间找到最佳的平衡等。

kernel/power/ *
drivers/power/
drivers/base/power/*
drivers/cpuidle/*
drivers/cpufreq/*
drivers/devfreq/*
include/linux/power_supply.h
include/linux/cpuidle.h
include/linux/cpufreq.h
include/linux/cpu_pm.h
include/linux/device.h
include/linux/pm.h
include/linux/pm_domain.h
include/linux/pm_runtime.h
include/linux/pm_wakeup.h
include/linux/suspend.h
Documentation/power/*.txt

3.2.6 测试场景覆盖:关机,待机,休眠,典型工作状态,极限场景

  暂时只考虑常温25°,不进行低温和高温测试。笔记本电池的充放点曲线。

3.2.7 测量笔记本功耗

  笔记本不是额定功耗的电子产品,因为笔记本有节能模式,比如处理器会动态调节主频,显卡对功耗变化影响较大,硬盘等低功耗部件还有休眠功能。记录所有支路的电流值和电压值,整机功耗,计算出单板功耗和适配器效率。PC功耗是实时变化的,看视频浏览网页功耗都是不同的,功耗续航需要软硬件一起调试。
  与笔记本厂商沟通确认他们的测量功耗工具,【淘宝】https://m.tb.cn/h.fkcax28?sm=1a4148?tk=CfzR21PxsR9「ChargerLAB POWER-Z USB PD电压电流纹波双Type-C测试仪 KM001C」,公司采购需要从京东购买https://item.jd.com/31045469743.html,功耗测试步骤的详细方法需要设备到了再验证。功耗工具补充,https://item.taobao.com/item.htm?spm=a230r.1.14.1.744961121eUhy4&id=574217991932&ns=1&abbucket=10#detail
  需要协调笔记本整机的原理图和PCB,分析整机的关机、待机、休眠、典型工作模式及极限工作模式,确认硬件设计支持相应的电源控制电路基础上为后续的软件功耗优化提供解决方案,首先确认整机采用了那些低功耗高效率的器件,比如在器件选型和硬件设计时,器件是否支持低功耗模式和相应的电源控制电路。散热大的元件,如MCU,DDR,电源芯片等均匀分布,并远离热敏元件。阻抗控制,合理的PCB布局,精确的阻抗控制,可以减小射频路径上的损耗。

3.3 功耗优化方案

3.3.1 CPU功耗

  现代处理器上面有各种各样的电源管理技术,比较通行的一种办法是将电源管理交由操作系统来负责。比如处理器厂商会为处理器定义多种电源状态,C-State和P-State就是两种常见的用于描述处理器电源状态的状态值。其中C-State用于节能,P-State用于决定CPU在有负载情况下的电压-频率状态。操作系统来根据当前的负载情况来调整CPU的状态,这样在检测到有高负载任务时,系统会将处理器调整到全速运行状态;在轻负载时,系统会让处理器进入低速状态,甚至将其部分关闭。

  另外处理器厂商还加入了很多软硬件结合的节能技术,像是Intel和AMD在很久以前就给CPU引入的SpeedStep/Cool’n’Quiet这些技术都可以让CPU在不损失最大性能的同时,尽可能的节约能耗。现在则是有Speed Shift和Turbo Cove这样的技术接手了。

  CPU 功耗CPU 的耗电大体符合以下公式: 功率 = 电容率 × 电压的平方 × 频率功率代表能耗(Power),而电容率(Capacitance),与 CPU 的制程和工艺等相关,在 CPU 出厂时就已经确定下来。那么我们能改变的只有电压与频率,而频率与电压成正相关。所以当 CPU 在很高的频率上运行时,效能很高但耗电量很大。如果我们能在 CPU 运算量不大时,让它降频运行,这样我们就可以减少功率,同时我们可以降低电压,节约能源,并减少发热与风扇噪音。 Linux 下调整 CPU 的模块叫 CPU 调速器(Governor),Android 等基于 Linux 的嵌入式平台都会使用 CPU 调速器达到省电的效果,同样,Linux也能。

  cpu调频策略–最佳性能、偏重性能、偏重省电、最佳省, 变频技术是指CPU硬件本身支持在不同的频率下运行,系统运行过程中可以根据随时可能发生的系统负载情况动态在这些不同的运行频率之间进行切换,从而达到对性能和功耗做到而这兼顾的目的。

  处理器负荷,处理器负荷较轻时,降低处理器的时钟速度;在处理器没有负载的时候,自动进入IDLE模式;在处理器长时间不用时,进入sleep模式,将处理器所不需要的模块关闭。

  cpufreq policy负责设定cpu调频的一个大致范围,而cpu的具体运行频率,则需要由相应的cufreq governor决定(比如自行调节频率的CPU)。那到底什么是cpufreq governor?它的运行机制是什么?Android 平台的 CPU 调速器使用经验,请不要试着直接限制 CPU 的频率,那是在 ARM 平台上才有效的做法,在 X86 平台下对减轻能耗帮助甚微,龙芯mips和loongarch架构待验证。

  • 常用的 cpufreq governor – 为了管好CPU的功耗,CPU厂家也不断为它引入新的电源管理特性
  1. Performance – 性能优先的governor,直接将cpu频率设置为policy->{min,max}中的最大值。
  2. Powersave – 功耗优先的governor,直接将cpu频率设置为policy->{min,max}中的最小值。
  3. Userspace – 由用户空间程序通过scaling_setspeed文件修改频率。
  4. Ondemand – 根据CPU的当前使用率,动态的调节CPU频率。
  5. Conservative --类似Ondemand,不过频率调节的会平滑一下,不会忽然调整为最大值,又忽然调整为最小值。
  6. watch grep “cpu MHz” /proc/cpuinfo – 通过/proc/cpuinfo 查看cpu频率

基于cpufreq governor的调频思路(Documentation\cpu-freq\governors.txt)

  1. 有两种类型的cpu:一种只需要给定调频范围,cpu会在该范围内自行确定运行频率;另一种需要软件指定具体的运行频率。
  2. 对第一种cpu,cpufreq policy中会指定频率范围policy->{min, max},之后通过setpolicy接口,使其生效即可。
  3. 对第二种cpu,cpufreq policy在指定频率范围的同时,会指明使用的governor。governor在启动后,会动态的(例如启动一个timer,监测系统运行情况,并根据负荷调整频率),或者静态的(直接设置为某一个合适的频率值),设定cpu运行频率。
3.3.1.1 CPU 电压下探

对处理器的电压进行最大限度的下探,在挖掘 CPU 体质的极限的同时,起到既能降低发热,又能最大限度保持性能的效果。
如果正常操作,降低电压一般不会损害 CPU,一般建议从 50 毫伏进行尝试,每次降压尝试多增加 10 毫伏。只要确保在降低电压前,系统中任务均被正确保存即可。

3.3.2 GPU功耗
  • GPU功耗 - GPU是并行处理单元,由于其算力主要来自多个模块并行计算,为了正常工作,通常需要很多模块同时运算,功耗也很大,所以很多双显卡默认关掉独显。
  1. 查看整机背光 – ls /sys/class/backlight/
  2. 关闭屏幕背光 – xset dpms force off ,dpms设置显示器的背光,笔记本EC芯片也可以调节显示器背光,笔记本屏幕背光会占用很大的功耗,比如EC芯片调节背光和显卡调节背光同时加载会占用很大的功耗。
  3. 笔电键盘背光 – Keyboard backlight,键盘背光只消耗很小的功耗,但是关闭它是很容易的。
  4. 查看显卡状态 – tlp-stat -g
  5. 双显卡切换方案 – bbswitch或者禁用独显。
  6. 桌面环境和电源管理相关–Gnome和KDE续航就比Xfce少一些。
  7. 显卡功耗相关信息 – sudo cat /sys/kernel/debug/dri/0/radeon_pm_info
  8. 显卡动态功耗 – echo parameter > /sys/class/drm/card0/device/power_dpm_state
    Where “parameter” can be:
    battery (a set of performance levels targeted for optimal operation on battery)
    balanced (a set of performance levels targeted for optimal every day use)
    performance (a set of performance levels targeted for the highest GPU performance)
3.3.3 硬盘功耗

  热量控制,减少硬件发热、降低电脑温度。在AC模式下,硬盘处于高性能状态,磁头不归位,硬盘不减速,所以温度比在XP下要高点。但是在用电池时,硬盘为了减速节电,磁头就会平凡归位,温度自然也会降下来了,但是磁头归位值就会像WIN7和XP系统下一样非常高,对硬盘的寿命有一定的影响(a tradeoff)。

3.3.4 主板

  主板功耗需要整机的原理图。

3.3.5 光驱

  笔记本计算机已经很少装有内置光驱,暂不考虑。

3.3.6 内存

  内存作为系统主存也需要时刻使用,也是功耗消耗的大户。内存泄露,检测耗电高的程序是否存在内存泄露。

3.3.7 网卡
  • 有线网络和无线网络管理
  1. 查看驱动信息 – modinfo iwlwifi | grep -v alias
  2. 查看节能选项 – modinfo iwlwifi | grep power_save
  3. 查看无线网络状态 – iwconfig,Power Management:on即节能模式是开启的
  4. 临时关闭节能模式eth0:iwconfig eth0 power off
  5. 禁用网卡eth0 – sudo ifconfig eth0 down
  6. 启用网卡eth0 – sudo ifconfig eth0 up
3.3.8 声卡

  系统在未使用声卡时可以暂时关闭声卡功能以减少功耗。

3.3.9 电源管理
  • 电池管理 – 电池自身在反复使用过程中存在损耗,修复电池的方法有多种也是功耗测试的前提,在此推荐一个比较有好的手动修复方法,操作步骤如下:
  1. 关机,插上电源适配器给电池充满电。若电池已是满格状态,可直接进行下一步。
  2. 拔下电源适配器,开机,让电池自动放电,直到电脑自动关机。期间,最好不做任何电脑操作。
  3. 插上电池适配器,将电池充满电,此过程开不开机都OK。
  4. 上述步骤为一循环,每每做上2~3次,效果会更佳。
  • 系统平台级电源管理策略 APM电源管理策略 vs ACPI电源管理策略
  1. APM电源管理策略,APM的全称是AdvancedPowerManagement(高级电源管理),它是一种基于BIOS的系统电源管理方案,它提供CPU和外设电源并通过设备工作超时设定来决定何时将设备切换到低功耗模式。
  2. ACPI电源管理策略,ACPI全称AdvancedConfigurationPowerInterface(高级配置电源接口),ACPI将现有的电源管理BIOS代码、APM应用编程接口、PNPBIOS应用编程接口、多处理器规范表格等集合成一种新的电源管理和配置接口规范,ACPI允许操作系统(不是BIOS)控制电源管理。
  3. 选择,Linux所支持的APM和ACPI针对APM和ACPI两种不同的标准,linux内核提供提供了两个不同的模块来实现电源管理功能,这就是apm和acpi.需要注意,apm和acpi是互相冲突的两个模块,用户在同一时间内只能加载其中之一,如果当他们在加载的时候发现二者之一已经加载,就会自动退出。在官方发布的内核中APM是较为成熟的电源管理方式,可以完成在Windows下ACPI所能完成的大部分功能。由于官方内核中ACPI的功能比较有限,目前还处于开发版状态。所以当前的大多数distribution,如红帽子默认就使用了apm作为电源管理方式。如在ARM体系结构下,有功耗管理模块的平台,有些没有配置管理策略,有的都会采用APM功耗管理,并不会采用ACPI。mips架构不支持ACPI电源管理策略,loongarch架构支持电源管理策略。
  4. 各个芯片设备的电源管理(涉及内核、固件)及ACPI
    利用Linux驱动系统层面的共同特性,补充电源管理函数,实现暂停,继续等功能;利用各个驱动所独有的特性进行优化。利用Linux内核的APM和ACPI机制,实现系统的挂起。
  • 休眠唤醒时设备的notifier通知
  1. 在冻结应用程序之前,使用pm_notifier_call_chain(PM_SUSPEND_PREPARE)来通知驱动程序,在重启应用程序之后,使用pm_notifier_call_chain(PM_POST_SUSPEND)来通知驱动程序。如果驱动程序有事情在上述时机要处理,可以使用register_pm_notifier注册一个notifier
  2. 添加suspend, resume函数(驱动休眠必须发生在APP冻结之后,否则如果驱动休眠了,APP使用驱动就会出错,所有驱动休眠放在suspend中)

  一些特殊设备驱动的suspend和resume函数需要仔细商榷,如UART进入待机后关闭电源在唤醒会丢失串口调试信息等。

  • 查看 acpi 相关信息
  1. acpidump -o acpidump.out
  • 查看笔记本laptop电源管理芯片(不同整机厂商) – drivers/platform/mips/
  1. dmesg | grep laptop
  2. sudo evtest

  acpi-call,sudo apt install acpi-call-dkms安装对应的acpi-call模块,其中/usr/src/acpi-call-版本号/是你放置acpi_call源码的位置),需要分析ACPI 电源管理是否有导致 CPU loadavg 负载虚高的现象。其中查找资料提到,每次通过apt-get dist-upgrade升级内核后都需要重新编译acpi_call,具体原因Kaijia会继续研究,大家每次更新内核后别忘了重新编译模块,待确认。

3.3.10 显示器

  系统处于运行状态并且屏幕显示器打开时的功耗和休眠时的功耗是有很大差异的。

3.3.11 外设(触控板等)、GPIO、中断等

  大多外设是usb接口,需要使USB模块进入待机休眠模式等。
  设置设备的唤醒源: 配置GPIO引脚工作于中断功能, 设置它的触发方式。有些中断可以将系统从睡眠状态中唤醒,我们称之“可以唤醒系统的中断”,当然,“可以唤醒系统的中断”需要配置才能启动唤醒系统这样的功能。这样的中断一般在工作状态的时候就是作为普通I/O interrupt出现,只要在准备使能唤醒系统功能的时候,才会发起一些特别的配置和设定。如何suspend设备中断(IRQ)?在从休眠中唤醒的过程中,如何resume设备IRQ?

  风扇调速包含主板风扇和显卡风扇等。
  时钟树功耗:时钟树的功耗通常占整个SOC功耗的40%左右,这是因为时钟是一直在翻转的信号,所以动态功耗特别大。所以门控时钟技术就特别重要。

  • 零、驱动直接编译进内核(静态加载) vs. 编译为模块(动态加载) – cat /proc/modules

手动调试过程 – cat /etc/modprobe.d/blacklist.conf,将对应模块添加到黑名单
blacklist acer_wmi
blacklist btusb
blacklist bluetooth
blacklist uvcvideo
blacklist nvidia
blacklist nouveau

3.4 笔记本电源管理软件

  在 Linux 上有很多功耗相关的实用工具,可以在命令行使用或者图形。同时,我们也可以查看电池模组名称、电源、厂商以及电池规格等。电源管理是在不使用时关闭电源或者切换系统的组件到低耗模式的一种功能。

  • 功耗相关工具
  1. upower:是一个命令行工具,其提供了罗列系统中电源的接口。
  2. acpi:显示来自 /proc 或者 /sys 文件系统中的一些信息,例如电池状态或者热量信息。
  3. batstat:是一个为 Linux 打印电池状态的命令行工具。
  4. class file:这个 sysfs 文件系统是一个提供了内核数据结构接口的伪文件系统。
  5. tlp:可以为你带来更高级的电源管理,而无需修改任何配置。
  6. Laptop Mode Tools 是一个 Linux 系统下的笔记本电源管理软件。
  7. PowerTOP 是一个 Linux 工具,用于诊断电量消耗和电源管理的问题。
  8. s-tui:Linux下监控CPU温度、频率、功耗的工具。
3.4.1 TLP 笔记本电源管理软件
  • TLP是什么?
      TLP 是一个一款免费的、开源的、功能丰富的 Linux 实用工具,适用于运行Ubuntu和其他Linux发行版的笔记本电脑上的电池使用优化,无需深入研究技术细节就能节省笔记本电池电量。有CLI和GUI版本,TLP 是高度可定制的,以满足你的具体要求以方便使用。 TLP附带一个默认配置,可以为您的操作系统和底层机器进行完美调整,TLP 的默认设置已经针对电池寿命进行了优化,所以你可以直接安装并忘记它。您需要做的就是安装并启用该实用程序,您就可以开始使用了。该实用程序的工作原理是在笔记本电脑使用电池运行时优化硬件设备使用的电量,而不是AC

  • TLP的工作原理?
      TLP 的基本工作原理是调整影响功耗的内核设置(kernel settings)。
    什么是 kernel settings,首先内核设置(kernel settings)是不稳定的。它们的状态在运行时被保存在 RAM 中,内核没有为它们提供持久性。在启动时,内核创建了一个默认的状态,每次启动时都必须通过用户空间的工具重新应用这些改变。TLP 就是这样一个用户空间的工具。

  在长时间不操作的情况下,电脑进入屏保,如果你设置了开机密码,好吧,每次看电影的时候你每隔个5分钟就要动一下电脑,搞不好还要一直输入开机密码,烦不烦。所以,需要简单地去改一下配置。TLp的配置文件位于/etc/default/tlp,需要Root权限

  • TLP电池管理软件,如果想要关闭TLP,vi /etc/default/tlp 将其中的"TLP_ENABLE=1"改为"TLP_ENABLE=0"即可。如果想要定制更多的东西,也可以去配置这个文件。
  1. 安装TLP命令行界面 – sudo apt install tlp
  2. 开始使用 – sudo tlp start,启动TLP 在第一次安装后,如果不想重启,就可以使用这个命令启动TLP
  3. 只显示电池信息 – sudo tlp start -b
  4. 检查状态 – sudo tlp stat 或者 tlp-stat 查看 tlp 相关信息
  5. usb设备状态 – tlp-usblist
  6. pci设备状态 – tlp-pcilist
  7. 只显示配置信息 – sudo tlp stat -c 相当于 sudo tlp-stat --config
  8. 显示无线设备的状态信息 – sudo tlp stat -r 相当于 sudo tlp-stat -rfkill
  9. 只显示温度和风扇转速 – sudo tlp stat -t 相当于 sudo tlp-stat --temp
  10. 显示debug信息 – sudo tlp stat -T (/var/log/debug)
  11. 卸载TLP – sudo apt-get remove --autoremove tlp
  12. 开启交流电源模式 – sudo tlp ac 类似于windows中的性能模式) 相当于sudo tlp false
  13. 开启电池模式(节能模式) – sudo tlp bat 相当于 sudo tlp true
  14. 将连接的USB设备空闲时自动挂起或关闭 – sudo tlp usb
  15. 查看磁盘的id型号 – sudo tlp diskid
  16. 安装TLP用户界面实用程序 – sudo apt-get install tlpui,对于更多进入UI的人来说,TLP实用程序有一个用户界面,配置”选项卡允许您查看和编辑TLP设置,“统计”选项卡可让您查看系统和电池使用统计信息,这里最重要的按钮是TLP_ENABLE滑块On和Off按钮。通过此按钮,您可以根据您的配置通过TLP启用/禁用电池优化。当前系统中并没有这个软件包。
  17. 查看tlp状态信息 – tlp-stat -h
    Usage: tlp-stat [ -b | --battery | -c | --config |
    -d | --disk | -e | --pcie |
    -g | --graphics | -p | --processor |
    -r | --rfkill | -s | --system |
    -t | --temp | -u | --usb |
    -w | --warn | -v | --verbose |
    -P | --pev | | --psup |
    -T | --trace ]
  • tlp-stat -p – 查看CPU处理器相关信息
uos@uos-PC:~$ sudo tlp-stat -p 
--- TLP 1.1 --------------------------------------------

+++ Processor
CPU model      = Loongson-3A5000M

/sys/devices/system/cpu/cpufreq/boost                  = (not available)

x86_energy_perf_policy: program not installed.

/sys/module/workqueue/parameters/power_efficient       = N
/proc/sys/kernel/nmi_watchdog                          = (not available)

+++ Undervolting
PHC kernel not available.

/etc/default/tlp 分析tlp相关配置项含义

  • CPU频率

具体的配置文件在直流电源与电池供电情况下都使用 powersave 调速器。X86 平台的 powersave 调速器不会限制你的最高频率,只是更加谨慎地增加频率,并在负载下降时更加积极的回到低频率。TLP 的开发者并不建议更改为其他调速器。
CPU_SCALING_GOVERNOR_ON_AC=powersave
CPU_SCALING_GOVERNOR_ON_BAT=powersave以下两项配置决定了 CPU 的能源策略,在电池模式下省电,而在外部电源供电模式下偏向性能。
CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
CPU_ENERGY_PERF_POLICY_ON_BAT=power
使用以下两项配置在电池供电时禁用自动超频,也就是关闭睿频。
CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0以下两项配置会在电池模式下根据负载自动缩减 CPU 核心数。 SCHED_POWERSAVE_ON_AC=0
SCHED_POWERSAVE_ON_BAT=1 AMD 与旧款 IntelAMD 与旧款 Intel 使用 acpi-cpufreq 驱动,故部分设置与 Intel 不同。这里仅仅贴出配置文件内容,建议阅读 TLP 官方文档以了解配置内容含义。

  • cpu配置

/etc/tlp.d/01-cpu.conf
CPU_SCALING_GOVERNOR_ON_AC=ondemand
CPU_SCALING_GOVERNOR_ON_BAT=ondemand
CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0
SCHED_POWERSAVE_ON_AC=0
SCHED_POWERSAVE_ON_BAT=1

  • USB 自动挂起设备TLP 利用内核设置,自动将不使用的 USB 设备挂起以节电。

/etc/tlp.d/02-usb.conf 中USB_AUTOSUSPEND=1;ACPI 高级电池管理基于内核的 natacpi 模块,部分笔记本(如部分 ThinkPad 系列与部分 Dell)电脑可以手动管理电池充电百分比。无需安装额外的 ACPI 模块。 /etc/tlp.d/03-battery.conf

  • 充放电阈值

START_CHARGE_THRESH_BAT0=80
开始充电阈值
STOP_CHARGE_THRESH_BAT0=85
停止充电阈值

  • TLP服务配置

启动服务: sudo systemctl start tlp
检查服务状态: sudo systemctl status tlp让 TLP
开机自启动: sudo systemctl enable tlp
检查是否成功: sudo systemctl is-enabled tlp

3.4.2 LMT笔记本电源管理软件

  Laptop Mode Tools 是一个 Linux 系统下的笔记本电源管理软件。它是让内核开启笔记本电脑模式功能的主要方法,能让硬盘降速、保护硬盘等。另外,它允许你通过一个简单的配置文件调整一些其他的节能相关的设置使你的笔电更省点。

  与 acpid 和 CPU frequency scaling 结合使用,LMT 提供给了大多数用户一个完整的笔记本电脑电源管理方案。有关于 Laptop Mode 的详细情况,可以用 man 命令查看 laptop_mode 和 laptop-mode.conf,其中包含了二者的详细参数说明。

  • laptop_mode模式有何好处呢?

laptop方面专家能为你解释关于laptop方面的电路和电源管理方面的硬件设计原理。当前只能确认进入 laptop_mode模式后,系统会根据当前系统负荷和电源使用情况来为系统作一些调整,如调整CPU运行频率,CPU风扇运行速度,硬盘驱动器运行状态(state:active/idle/standby),闭合或开启LCD所执行的命今,移到办公时切换网络环境时网卡自适应性(此部分功能了解 laptop_netconf工具包),和一些其它硬件的ACPI控制(比如:光驱可在不用时就处于standby状态)等,最简单的讲法就是动态使用系统资源,尽可能的增长电池的使用时间(你可能在想你的laptop时时刻刻都在用电源适配器供电,电池只当UPS用而已,laptop_mode对你没什么作用,这样想可能是你忘记啦,laptop_mode可以根据当前系统负何来动态使用系统资源,你不想让你的laptop寿命更长些吗?)。

  • 要使用laptop_mode的必备条件是什么?

绝对要用系统支持ACPI,如果你的laptop只支持APM那就不要考虑啦,当然必不可少laptop_mode_tools工具包,然后启动laptop_mode模式。

  • LMT电池管理软件
  1. 确认是否安装 – which laptop_mode
  2. 安装 – sudo apt install laptop-mode-tools
  3. 验证笔电LMT状态 – cat /proc/sys/vm/laptop_mode
    验证笔电是否确实进入 Laptop Mode,如果返回值为0的话,表示系统还未进入 Laptop Mode,如果返回的是其他正数值则表示系统成功进入 Laptop Mode。
  4. 查看 laptop_mode 报告的详细状态 – sudo laptop_mode status
  5. 停用laptop_mode模式? – sudo laptop_mode stop
  6. 重启laptop_mode模式? – sudo laptop_mode restart
  • LMT电池管理软件调试
  1. laptop_mode启动后都作了什么?怎样查看laptop_mode信息? – 强列建意你打开两个Gnome Terminal,一个Terminal在启用laptop_mode信息前,键入sudo laptop_mode status
    ,另一个在sudo laptop_mode start后键入sudo laptop_mode status,看看在laptop_mode可以控制那些资源,资源使用情况有何不同。
  2. 怎样进一步微调laptop_mode对系统资源的使用? – 安装laptop_mode工具包的默认配置文件为/etc/laptop-mode/laptop-mode.conf,强烈建意你在对其文件作了改动前,先保留一个原件副本。 因为laptop-mode.conf很多设置和系统硬件相关,如果你不太熟悉自已系统的硬件和其ACPI支持情况就请用默认配置吧。
  • LMT方案相关问题
  1. Debian启用Laptop Mode Tools鼠标开机断电问题解决
3.4.3 PowerTOP
  • 什么是 PowerTOP

PowerTOP PowerTOP 是一款开源的命令行工具,用于诊断的功耗问题,查看系统中软件应用的活跃程度。此外,它提供了用于试验的各种电源管理设置的交互方式,用于诊断电量消耗和电源管理的问题。它是由 Intel 开发的,可以在内核、用户空间和硬件中启用各种节电模式。除了作为一个一个诊断工具之外,PowweTop 还有一个交互模式,可以让你实验 Linux 发行版没有启用的各种电源管理设置。它也能监控进程,并展示其中哪个正在使用 CPU,以及从休眠状态页将其唤醒,也可以找出电量消耗特别高的应用程序。你可以使用 PowerTOP 工具来查看没有接入电源线时电量都用在了何处。你需要在终端中使用超级用户权限来运行 PowerTOP 工具。它可以访问该电池硬件并测量电量使用情况。

  • PowerTOP电池管理软件
  1. 安装 – sudo apt install powertop,对于 Debian/Ubuntu 系统,使用 APT-GET 命令 或 APT 命令 来安装 PowerTOP。
  2. 使用 – sudo powertop,PowerTOP 需要超级用户权限,所以在 Linux 系统中以 root 身份运行 PowerTOP 工具。默认情况下其显示 “概览” 页,在这里我们可以看到所有设备的电量消耗情况,也可以看到系统的唤醒秒数。在你的机器上由于硬件不同会稍有不同。它的显示有很多页,你可以使用 Tab 和 Shift+Tab 在它们之间切换。
  3. 空闲状态页 – 它会显示处理器的各种信息。
  4. 频率状态页 – 它会显示 CPU 的主频。
  5. 设备状态页 – 它仅针对设备显示其电量使用信息。
  6. 可调整状态页 – 这个页面是个重要区域,可以为你的笔记本电池优化提供建议。
  7. 生成 PowerTop 的 HTML 报告 – sudo powertop --html=powertop.html。
  8. 自动调整模式 – 这个功能可以将所有可调整选项从 BAD 设置为 GOOD,这可以提升 Linux 中的笔记本电池寿命。
  9. 卸载 – sudo apt-get remove powertop

  powertop工具可以显示特定进程与设备的耗电量。用 tab 在不同的标签页中切换。不过 不要 听从 PowerTOP 关于省电的建议,也不要在 systemd 上启用他—— TLP 做的比他更好。同时 tlp-stat 命令也会输出有用的信息。

3.4.4 s-tui

  s-tui 是一个用于监控计算机的终端 UI,监控CPU温度、频率、功耗的工具。s-tui 可以在终端以图形方式监控 CPU 温度、频率、功率和使用率。此外,它还显示由发热量限制引起的性能下降,它需要很少的资源并且不需要 X 服务器。它是用 Python 编写的,需要 root 权限才能使用它。s-tui 是一个独立的程序,可以开箱即用,并且不需要配置文件就可以使用其基本功能。s-tui 使用 psutil 来探测你的一些硬件信息。如果不支持你的一些硬件,你可能看不到所有信息。

  以 root 身份运行 s-tui 时,当压测所有 CPU 核心时,可以将 CPU 发挥到最大睿频频率。它在后台使用 Stress 压力测试工具,通过对系统施加某些类型的计算压力来检查其组件的温度是否超过其可接受的范围。只要计算机稳定并且其组件的温度不超过其可接受的范围,PC 超频就没问题。有几个程序可以通过压力测试得到系统的稳定性,从而评估超频水平。

  • s-tui 管理软件
  1. 安装 – sudo apt install s-tui,对于 Debian/Ubuntu 系统,使用 APT-GET 命令 或 APT 命令 来安装 PowerTOP。
  2. 使用 – sudo s-tui,需要 root 权限才能从系统获取所有信息。
  3. Stress 选项 – 启用硬件监控并选择 “Stress” 选项以对系统执行压力测试。
  4. 要查看其他选项,请到帮助页面查看 – s-tui --help。

四.实验验证 – 机器数量和检测仪器

4.1 电脑耗电量测试 – 判断当前获取的电池放电相关信息是否正确

  放电时间的公式:毫安时(mAh)乘以工作电压(V)再除以1000换算出瓦时(Wh)

mAh*V/1000=Wh 即 mAh=Wh*1000/V

  通过放电公式计算毫安时mAh,和当前的放电电流和剩余时间换算的毫安时进行对比,如果两个值只有微小偏差则证明当前获取的电池信息正确,进行下一步工作。
注:电池放电为模拟放电过程,各个值存在微小偏差。

ex:
current_now=1734mA
time to empty=0.5小时
毫安时:1734mA*0.5h=867mAh
energy=12.6392Wh
V=14.589V
毫安时:12.6392*1000/14.589=866.35mAh
说明获取电池信息正确,进行下一步工作。

  通过相关工具或者系统节点查看笔记本电池状态和等级,同时记录放电过程中的时间、电流、电量、电压。目前编写脚本能够记录放电电流、电量百分比、电压的变化,充放电状态更新概率性异常,具体的还需要分析,先要证明当前获取电池放电的数据是正确的,再进行下一步工作。

  • 电池电量信息需要每分钟记录一次
通过 sysfs 文件系统获取当前的放电电流
current_now(mA->uA)
uos@uos-PC:~$ cat /sys/class/power_supply/BAT0/current_now 
1657000
  • 通过 upower 命令行工具,获取当前的放电信息,包括工作电压V、剩余电量Wh、剩余工作时间等
#current_time=`date +"%Y-%m-%d %H:%M:%S"`
#upower --dump | grep --color=never -E "state|to\ full|to\ empty|percentage"
#battery=`upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep -i "state\|percentage\|time to empty"`
battery=`upower -i /org/freedesktop/UPower/devices/battery_BAT0`
echo "F00160 $battery \n"
echo "F00160 $battery \n" >> time.log
F00160   native-path:          BAT0
  vendor:               ZY
  model:                LoongsonM
  power supply:         yes
  updated:              2021年11月24日 星期三 15时31分18秒 (5 seconds ago)
  has history:          yes
  has statistics:       yes
  battery
    present:             yes
    rechargeable:        yes
    state:               fully-charged  `充放电状态更新:dischanging、charging、fully-charged`
    warning-level:       none
    energy:              76.3994 Wh		``
    energy-empty:        0 Wh
    energy-full:         76.3994 Wh    `不变`
    energy-full-design:  70.994 Wh		`不变`
    energy-rate:         22.5764 W		``
    voltage:             17.121 V		``
    percentage:          100%			``
    capacity:            100%			`不变`
    technology:          lithium-ion
    icon-name:          'battery-full-charged-symbolic' 
  • 功耗检测工具
  1. s-tui检测的功耗和powertop检测的功耗有差异,以哪个为准,如何判断。
  2. powertop检测有2个Display backlight,是否都需要。
    内核领域-功耗机型的续航基线优化问题-技术调研报告-王井玉_20211216_第3张图片
    /sys/class/backlight/
    ├── loongson_laptop -> …/…/devices/virtual/backlight/loongson_laptop
    └── radeon_bl0 -> …/…/devices/pci0000:00/0000:00:13.0/0000:06:00.0/drm/card0/card0-eDP-1/radeon_bl0
  3. 使用无线网卡时禁用有线网卡 – 判断功耗是否降低
    禁用网卡eth0 – sudo ifconfig eth0 down
    启用网卡eth0 – sudo ifconfig eth0 up
4.2 屏幕功耗

  当屏幕关闭状态(关闭屏幕背光 – xset dpms force off),对于主机的耗电量几乎没有影响,耗电量会小幅降低,但是这个数值低到可以忽略。同样环境下,若主机休眠,猜测屏幕与主机耗电量应该会降到几W,稍大于关机的耗电量,具体需要硬件仪器测量。

4.3 内核模块

  系统每次休眠唤醒后需要从新加载内核模块,确认那些是有用的模块,涉及具体的硬件。内核模块–make menuconfig all 后编译。重启 通过lsmod | awk ‘{if($3>0) print $_ }’ 找出used 大于0的驱动模块,并认为是有用的模块。

4.3 TLP电源管理软件

  使用706笔记本测试TLP电池管理工具,其默认配置提供了开箱即用的优化的节能设置,目前测试待机时长没有改善,默认配置中需要acpi对相关耗电设备进行控制,分析缺少相关模块,比如电源管理模块。

– dmesg报错

 1225.942252] do_page_fault(): sending SIGSEGV to dde-lowpower for invalid read access from 000000000002cc20
[ 1225.951876] epc = 000000000002cc20 in dde-lowpower[120000000+10000]
[ 1225.958113] ra  = 000000fff08c92f4 in libdtkgui.so.5.4.6[fff0888000+78000]
4.4 cpu-powersave模式
  1. Powersave – 功耗优先的governor,直接将cpu频率设置为policy->{min,max}中的最小值;CPU会固定工作在其支持的最低频率上,以追求最低的功耗。
  • cpu频率问题
  1. 清华同方笔电没有/sys/devices/system/cpu/cpufreq/目录内容是空的,不支持动态调频,需要更新固件支持。
  2. 706笔电
    root@uos-PC:/sys/devices/system/cpu/cpufreq# tree -L 2
    .
    ├── boost
    ├── policy0
    │ ├── affected_cpus
    │ ├── cpuinfo_max_freq
    │ ├── cpuinfo_min_freq
    │ ├── cpuinfo_transition_latency
    │ ├── related_cpus
    │ ├── scaling_available_frequencies
    │ ├── scaling_available_governors
    │ ├── scaling_boost_frequencies
    │ ├── scaling_cur_freq
    │ ├── scaling_driver
    │ ├── scaling_governor
    │ ├── scaling_max_freq
    │ ├── scaling_min_freq
    │ └── scaling_setspeed
    ├── policy1
    │ ├── affected_cpus
    │ ├── cpuinfo_max_freq
    │ ├── cpuinfo_min_freq
    │ ├── cpuinfo_transition_latency
    │ ├── related_cpus
    │ ├── scaling_available_frequencies
    │ ├── scaling_available_governors
    │ ├── scaling_boost_frequencies
    │ ├── scaling_cur_freq
    │ ├── scaling_driver
    │ ├── scaling_governor
    │ ├── scaling_max_freq
    │ ├── scaling_min_freq
    │ └── scaling_setspeed
    ├── policy2
    │ ├── affected_cpus
    │ ├── cpuinfo_max_freq
    │ ├── cpuinfo_min_freq
    │ ├── cpuinfo_transition_latency
    │ ├── related_cpus
    │ ├── scaling_available_frequencies
    │ ├── scaling_available_governors
    │ ├── scaling_boost_frequencies
    │ ├── scaling_cur_freq
    │ ├── scaling_driver
    │ ├── scaling_governor
    │ ├── scaling_max_freq
    │ ├── scaling_min_freq
    │ └── scaling_setspeed
    └── policy3
    ├── affected_cpus
    ├── cpuinfo_max_freq
    ├── cpuinfo_min_freq
    ├── cpuinfo_transition_latency
    ├── related_cpus
    ├── scaling_available_frequencies
    ├── scaling_available_governors
    ├── scaling_boost_frequencies
    ├── scaling_cur_freq
    ├── scaling_driver
    ├── scaling_governor
    ├── scaling_max_freq
    ├── scaling_min_freq
    └── scaling_setspeed
    4 directories, 57 files
4.5 cpu支持调频和不支持调频模式下的功耗差异

  AIDA64 is not available for Linux but there are plenty of alternatives that runs on Linux with similar functionality. The best Linux alternative is s-tui, which is both free and Open Source.
  AIDA64不支持linux平台,在5000机器上使用s-tui工具,功耗项无法使用,分析中。
  分别使用支持调频的固件和不支持调频的固件,powertop软件查看功耗状态变化走势,测试场景:开机3分钟稳定后的powertop功耗值。

  • cpu频率
  1. 4.1是没有调频的
  2. 4.3是调频的
  3. sudo cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq VS cat /proc/cpuinfo | grep “cpu MHz”

五.小结

限制与测试设备数量和检测仪器,S3S4S5暂时无法测试,运行时的续航时间,之前使用一台706笔记本测试暂未发现改善,后续使用规定笔记本机型验证。
功耗续航是电池放电的过程,同时需要关注关机、开机状态下的快速充电。

六.参考资料

TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具
干电池放电曲线分析
Linux下Power Management开发总结
shell中记录运行时间的一种方法
使用脚本记录 macbook 电池容量
从 Linux 终端查看笔记本电池状态和等级的 5 个方法
https://01.org/linux-acpi/documentation/overriding-dsdt
锂电池的电量单位 mAh Wh
浅谈stm8l系列单片机的低功耗机制
手工编译linux桌面内核(一)——内核总体设置和性能调优
手工编译linux桌面内核(二)——硬件驱动的配置 上篇
手工编译linux桌面内核(二)——硬件驱动的配置 下篇
手工编译linux桌面内核(三)——网络的配置
手工编译linux桌面内核(四)——电源的配置
https://pms.uniontech.com/zentao/bug-view-91428.html
安装acpi-call-dkms时出现此错误
ACPI 电源管理导致的 CPU loadavg 负载虚高
Laptop Mode Tools (简体中文)
用 Laptop Mode Tools 配置 Linux 下的电源管理属性
Linux电源管理
[ZZ]Ubuntu电源管理问题的说明和解决方案
Ubuntu的启动与优化
Ubuntu硬盘优化,降低硬盘温度(Acer V5 亲测成功 )
TLP (简体中文)
PowerTOP – Monitors power usage and improve Laptop’s battery life in Linux
Improving Battery Life in Ubuntu with TLP
芯片设计进阶之路——低功耗深入理解(一)
powertop
[SOLVED] Display backlight consumes too much battery power
http://www.wowotech.net/linux_kenrel/suspend_and_resume.html
http://www.wowotech.net/linux_kenrel/std_str_func.html
kenrel document: freezing-of-tasks.txt
高通—GPU&CPU频率和工作模式的获取设置
PCIe功耗控制–ASPM
How to enable the Radeon dynamic power management feature?
硬件工程师必看 | 功耗测试思路与步骤详解
测量误区,你真的会测待机功耗么?

你可能感兴趣的:(专业技术,debian,linux,unix)