设备: 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个小时的续航能力)。
低功耗的目的就是提高电池供电的电子产品的使用时间,分析功耗前先认识电量相关的基础知识。功耗(Power)和能量(Energy)是两个完全不同的概念,功耗是一个瞬时的概念,而能量是一个时间内的消耗。
稍微分析一下就可以知道,比如PC笔电,能量越大(也就是电池越大),使用时间越长。同时如果功率越小,就显得越不耗电,使用时间就越长。当年高通骁龙820就是功耗没做好,输给了麒麟920,给了华为麒麟崛起的机会。现在华为手机电池耐用已经深入人心了。同时随着设备消耗能量,会产生热量。功耗越大,产生热量越快。如果不能及时散热,那么设备温度就会升高。温度升高可能导致设备不能正常工作甚至损坏。所以有些芯片会在温度升高时候,把频率降低,本来能跑2GHz的CPU,温度高了就只能跑1G,这个以前在用手机玩游戏的时候体验比较明显。可以看到,低功耗技术直接决定商业竞争的成败!低功耗对芯片的影响还有很多方面。
现在笔记本已经非常普遍,人们如何增加计算机的续航已经成 为一个难题,比如不同场景下笔记本的功耗是不同的,玩游戏比看电影更费电,更多的是CPU功耗,对电池影响最大的是CPU的频率。当我插电时,我想要全速,但是当我拔掉插头时,我想要尽可能多的电池续航。其中CPU处理器的功耗过大时会产生大量的热量,如果散热条件跟不上,那就会因为温度过高而影响晶体管的稳定性。
在一个系统中,数量最多的是设备,耗电最多的也是设备,因此设备的电源管理是Linux电源管理的核心内容。而设备电源管理最核心的操作就是:在合适的时机(如不再使用,如暂停使用),将设备置为合理的状态(如关闭,如睡眠)。电源管理模型包括:系统S3S4S5模型和Runtime电源管理模型。
我们所说的笔记本续航,主要是总的耗电功率,功耗来源分析其包括以下主要设备的耗电功率:1.CPU,2.显卡,3.硬盘,4.主板,5.光驱,6.内存,7.网卡,8.声卡,9.电源的自身损耗,10.显示器等。系统低功延长续航时间的设计是在操作系统层实现。因为操作系统管理系统所有软硬件资源,并获取系统的各种状态信息,控制硬件设备的状态。以下是对各个设备功率的概述:
综上所述,笔记本电脑的功率计算应该按照不同场合和不同要求来分开计算,不同情况的消耗功率是不同的,比如CPU是否全速运行、屏幕的亮度等。对于一般办公环境,电脑的功率大致为:CPU+显卡+硬盘+主板+光驱+内存等+电源+外设等+显示器=功耗,在目前的状况下办公电脑不涉及大量计算和游戏,而且目前的很多屏幕显示器,也支持节能功能。
另外,电脑电源由于感性负荷较多,所以对外面设备产生感应电流和漏电的可能比较大。我们在拆开电脑的时候,通常会先洗手以释放身上的静电,以免对设备造成危害,但由于洗手后,人皮肤的电阻会减小。所以我们每次接触电脑的时候都会碰到强烈的漏电情况,而且漏电电流还比较大,手都会感到麻麻的感觉,所以我觉得电脑插座应该设置好保护线,最好还是安装漏电保护装置,尤其是对于那些小孩有可能接触到电脑机身的场合,更应该注意电脑的漏电保护。
可参考Windows下续航优化,比如Overclockulator功耗测试软件。关机状态的耗电理论上应该为0W,耗电大小从小到大排序,S5关机 Linux 内核的 PM 框架涉及众多组件,弄清楚这些组件之间的依赖关系,在合适的着眼点上进行优化,采用正确的方法进行 PM 的编程,对改善代码的质量、辅助功耗和性能测试都有极大的好处。 当然,这些方法的前提永远是芯片的功能要满足要求。功率再低,功能不满足的芯片和板砖有什么区别。芯片的功能要满足要求这个基础就决定了这些方法有一些限制,比如不可能把电压降到0,不可能让信号永远不翻转。这些都是前提。 低功耗技术就是一系列的降低功耗的技术。在了解低功耗技术之前,我们必须先了解功耗的构成。现在几乎都从 PC 机换到了笔记本电脑了。但是使用笔记本有个问题,我们希望电池耐用,我们可以使用到每一点电量。所以,我们需要知道电量都去哪里了,是不是浪费了。 这里要注意的是:在设备运行时,也需要消耗静态功耗的,因为设备运行时也是上电状态。功耗分类把静态功耗单独拿出来,只是为了理论分析方便。 无 AC 电源时达到硬件该有的性能和随时获得最长电池使用时间是相互冲突的,需要进行取舍。针对待机、休眠等模式,需要判断各个设备的工作状态以及电路板上是否还有其他的芯片在工作,可能它们仍然在消耗电量,所以我们在进入待机活或休眠前应该要把其他芯片给关闭(可以通过特定的指令或者片选线)。条件允许的可以直接切断它们的电源。 进入待机、休眠模式后,只是各个设备中最耗电的内核部分被关了,而所有寄存器和内存中的值是保持不变的,所以它的外设还在消耗电量,所以我们要在进入待机、休眠模式之前把开启的外设给关了。这里要注意一点:外设开启时是先开时钟再设置寄存器,关闭时先清除寄存器再关闭时钟。理解为:操纵一个外设的寄存器肯定是需要时钟的,如果我们先把时钟给关了,那么还怎么操作寄存器呢,如果光关了时钟,不清寄存器的相应位,那么外设还处于“静态耗电”的状态。 关于各个设备的IO口的电平,这个是非常重要的一点,和之前提到的外设一样,GPIO也是一种外设,但是特殊的是,这个外设是和芯片外部直接打交道的,如果GPIO外部接了个上拉电阻,而你在进入待机、休眠等模式之前设置的IO口是低电平的,那么电流不就通过电阻,流到IO口里来了,比如正常的说接了个10k的上拉电阻,接到3.3v电压上,那么电流就是330uA,这个值可不小呢,各个设备在进入待机、休眠后极限最小电流好像能达到几uA或者几十uA。那么这个电路就是因为这个电阻,停机电流比别人大了将近几十倍了,这还怎么比?所以IO口是绝对不能被忽视的。设备芯片复位以后所有引脚都是浮空输入模式,理论上悬浮空输入时IO口的状态为高阻态是最省电的,那么我们只要把所有IO都DeInit就可以了。但是事实上不是,我把没有用到的管脚全部推挽输出高电平或低电平,不用的外部晶振的引脚要改为上拉输入才省电,外部有上拉下拉电阻的引脚分别推挽输出高电平和低电平,一般电路中上拉电阻比较多(比如IIC的总线外部都有上拉的)。和外部芯片相连的引脚都推挽输出低电平,因为外部芯片断电后所有引脚都是高阻态或接地的吧,如果你弄个高电平,就可能会有电流流过去。另外,主板上是否带有稳压相关的芯片,这类芯片一般进入待机、休眠也会存在耗电。 A:安 18650电芯通常容量为2200mAh毫安时. 容量=放电电池(恒流)× 放电时间(小时) 电脑主板纽扣电池CR2032:210mAh 在计算机系统依靠电能运行,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的顺序,调用相应的回调函数。 启动 suspend to ram:(睡眠)//suspend to disk(休眠),echo mem > /sys/power/state //启动休眠的方法就是往/sys/power/state 写字符串,会调用state_store函数(还有个state_show是读的时候被调用 )。 runtime是在系统正常工作的时候单独控制某个设备休眠和唤醒,相比S3S4S5续航优化,比如系统睡眠模型是让整个系统休眠,runtime的场景更复杂也更难,需要在不影响使用设备功能的前提下尽可能让它省电。runtime PM 框架不需要用户程序的干涉,由Kernel统一调度,实时的关闭或打开设备,以便在使用性能和省电性能之间找到最佳的平衡等。 怎样动态地打开或关闭设备的电源?最简单的方法,在驱动程序的open函数中打开电源,在close函数中关闭电源,上述方法有一个缺点: 多个应用同时访问设备时可能造成干扰。另外支持UEFI固件需要考虑固件参数的正确性。 什么是进程冻结,进程冻结技术(freezing of tasks)是指在系统hibernate或者suspend的时候,将用户进程和部分内核线程置于“可控”的暂停状态。 冻结的对象是内核中可以被调度执行的实体,包括用户进程、内核线程和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延后执行。 任务主动调用try_to_freeze的代码如下: 进入冻结状态直到恢复的主要函数: 电源管理有关的Source code包括传统意义上的Power Management,如Power Off、Suspend to RAM、Suspend to Disk、Hibernate等,对I/O设备的运行时电源管理(运行时PM)的支持,以便在使用性能和省电性能之间找到最佳的平衡等。 kernel/power/ * 暂时只考虑常温25°,不进行低温和高温测试。笔记本电池的充放点曲线。 笔记本不是额定功耗的电子产品,因为笔记本有节能模式,比如处理器会动态调节主频,显卡对功耗变化影响较大,硬盘等低功耗部件还有休眠功能。记录所有支路的电流值和电压值,整机功耗,计算出单板功耗和适配器效率。PC功耗是实时变化的,看视频浏览网页功耗都是不同的,功耗续航需要软硬件一起调试。 现代处理器上面有各种各样的电源管理技术,比较通行的一种办法是将电源管理交由操作系统来负责。比如处理器厂商会为处理器定义多种电源状态,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的调频思路(Documentation\cpu-freq\governors.txt) 对处理器的电压进行最大限度的下探,在挖掘 CPU 体质的极限的同时,起到既能降低发热,又能最大限度保持性能的效果。 热量控制,减少硬件发热、降低电脑温度。在AC模式下,硬盘处于高性能状态,磁头不归位,硬盘不减速,所以温度比在XP下要高点。但是在用电池时,硬盘为了减速节电,磁头就会平凡归位,温度自然也会降下来了,但是磁头归位值就会像WIN7和XP系统下一样非常高,对硬盘的寿命有一定的影响(a tradeoff)。 主板功耗需要整机的原理图。 笔记本计算机已经很少装有内置光驱,暂不考虑。 内存作为系统主存也需要时刻使用,也是功耗消耗的大户。内存泄露,检测耗电高的程序是否存在内存泄露。 系统在未使用声卡时可以暂时关闭声卡功能以减少功耗。 一些特殊设备驱动的suspend和resume函数需要仔细商榷,如UART进入待机后关闭电源在唤醒会丢失串口调试信息等。 acpi-call, 系统处于运行状态并且屏幕显示器打开时的功耗和休眠时的功耗是有很大差异的。 大多外设是usb接口,需要使USB模块进入待机休眠模式等。 风扇调速包含主板风扇和显卡风扇等。 手动调试过程 – cat /etc/modprobe.d/blacklist.conf,将对应模块添加到黑名单 在 Linux 上有很多功耗相关的实用工具,可以在命令行使用或者图形。同时,我们也可以查看电池模组名称、电源、厂商以及电池规格等。电源管理是在不使用时关闭电源或者切换系统的组件到低耗模式的一种功能。 TLP是什么? TLP的工作原理? 在长时间不操作的情况下,电脑进入屏保,如果你设置了开机密码,好吧,每次看电影的时候你每隔个5分钟就要动一下电脑,搞不好还要一直输入开机密码,烦不烦。所以,需要简单地去改一下配置。TLp的配置文件位于 具体的配置文件在直流电源与电池供电情况下都使用 powersave 调速器。X86 平台的 powersave 调速器不会限制你的最高频率,只是更加谨慎地增加频率,并在负载下降时更加积极的回到低频率。TLP 的开发者并不建议更改为其他调速器。 /etc/tlp.d/01-cpu.conf /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 启动服务: sudo systemctl start tlp Laptop Mode Tools 是一个 Linux 系统下的笔记本电源管理软件。它是让内核开启笔记本电脑模式功能的主要方法,能让硬盘降速、保护硬盘等。另外,它允许你通过一个简单的配置文件调整一些其他的节能相关的设置使你的笔电更省点。 与 acpid 和 CPU frequency scaling 结合使用,LMT 提供给了大多数用户一个完整的笔记本电脑电源管理方案。有关于 Laptop Mode 的详细情况,可以用 man 命令查看 laptop_mode 和 laptop-mode.conf,其中包含了二者的详细参数说明。 laptop方面专家能为你解释关于laptop方面的电路和电源管理方面的硬件设计原理。当前只能确认进入 laptop_mode模式后,系统会根据当前系统负荷和电源使用情况来为系统作一些调整,如调整CPU运行频率,CPU风扇运行速度,硬盘驱动器运行状态(state:active/idle/standby),闭合或开启LCD所执行的命今,移到办公时切换网络环境时网卡自适应性(此部分功能了解 laptop_netconf工具包),和一些其它硬件的ACPI控制(比如:光驱可在不用时就处于standby状态)等,最简单的讲法就是动态使用系统资源,尽可能的增长电池的使用时间(你可能在想你的laptop时时刻刻都在用电源适配器供电,电池只当UPS用而已,laptop_mode对你没什么作用,这样想可能是你忘记啦,laptop_mode可以根据当前系统负何来动态使用系统资源,你不想让你的laptop寿命更长些吗?)。 绝对要用系统支持ACPI,如果你的laptop只支持APM那就不要考虑啦,当然必不可少laptop_mode_tools工具包,然后启动laptop_mode模式。 PowerTOP PowerTOP 是一款开源的命令行工具,用于诊断的功耗问题,查看系统中软件应用的活跃程度。此外,它提供了用于试验的各种电源管理设置的交互方式,用于诊断电量消耗和电源管理的问题。它是由 Intel 开发的,可以在内核、用户空间和硬件中启用各种节电模式。除了作为一个一个诊断工具之外,PowweTop 还有一个交互模式,可以让你实验 Linux 发行版没有启用的各种电源管理设置。它也能监控进程,并展示其中哪个正在使用 CPU,以及从休眠状态页将其唤醒,也可以找出电量消耗特别高的应用程序。你可以使用 PowerTOP 工具来查看没有接入电源线时电量都用在了何处。你需要在终端中使用超级用户权限来运行 PowerTOP 工具。它可以访问该电池硬件并测量电量使用情况。 powertop工具可以显示特定进程与设备的耗电量。用 tab 在不同的标签页中切换。不过 不要 听从 PowerTOP 关于省电的建议,也不要在 systemd 上启用他—— TLP 做的比他更好。同时 tlp-stat 命令也会输出有用的信息。 s-tui 是一个用于监控计算机的终端 UI,监控CPU温度、频率、功耗的工具。s-tui 可以在终端以图形方式监控 CPU 温度、频率、功率和使用率。此外,它还显示由发热量限制引起的性能下降,它需要很少的资源并且不需要 X 服务器。它是用 Python 编写的,需要 root 权限才能使用它。s-tui 是一个独立的程序,可以开箱即用,并且不需要配置文件就可以使用其基本功能。s-tui 使用 psutil 来探测你的一些硬件信息。如果不支持你的一些硬件,你可能看不到所有信息。 以 root 身份运行 s-tui 时,当压测所有 CPU 核心时,可以将 CPU 发挥到最大睿频频率。它在后台使用 Stress 压力测试工具,通过对系统施加某些类型的计算压力来检查其组件的温度是否超过其可接受的范围。只要计算机稳定并且其组件的温度不超过其可接受的范围,PC 超频就没问题。有几个程序可以通过压力测试得到系统的稳定性,从而评估超频水平。 放电时间的公式:毫安时(mAh)乘以工作电压(V)再除以1000换算出瓦时(Wh) 通过放电公式计算毫安时mAh,和当前的放电电流和剩余时间换算的毫安时进行对比,如果两个值只有微小偏差则证明当前获取的电池信息正确,进行下一步工作。 通过相关工具或者系统节点查看笔记本电池状态和等级,同时记录放电过程中的时间、电流、电量、电压。目前编写脚本能够记录放电电流、电量百分比、电压的变化,充放电状态更新概率性异常,具体的还需要分析,先要证明当前获取电池放电的数据是正确的,再进行下一步工作。 当屏幕关闭状态(关闭屏幕背光 – 系统每次休眠唤醒后需要从新加载内核模块,确认那些是有用的模块,涉及具体的硬件。内核模块–make menuconfig all 后编译。重启 通过lsmod | awk ‘{if($3>0) print $_ }’ 找出used 大于0的驱动模块,并认为是有用的模块。 使用706笔记本测试TLP电池管理工具,其默认配置提供了开箱即用的优化的节能设置,目前测试待机时长没有改善,默认配置中需要acpi对相关耗电设备进行控制,分析缺少相关模块,比如电源管理模块。 – dmesg报错 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. 限制与测试设备数量和检测仪器,S3S4S5暂时无法测试,运行时的续航时间,之前使用一台706笔记本测试暂未发现改善,后续使用规定笔记本机型验证。 TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具
mA:毫安
uA:微安
1A=1000mA=1000*1000uA
1号电池2.5Ah.
2号电池1.5Ah.
3号电池500mAh.
7号电池200mAh.
反过来: 放电时间T=容量/放电电流(恒流)
比如一个电池用500MA(毫安)的恒定电流放了2 个小时,那么这个电池的容量就等于500MA*2H=1000MAH=1AH。
再如一个电池用5安的电流放了2个小时,那么该电池的容量就是10AH。
笔记本电池多数为锂电池,锂电池的电量大小,只看【mAh毫安时】并不够的,还需要看到【Wh瓦时】,这才是锂电池真正的能量容量,后续按照锂电池放电进行功耗优化。3.2 电源管理
3.2.1 系统电源的组成和管理模型的四种状态
如果设备有省电模式,尽量用起来
– 联系整机厂商协调硬件原理图,确认芯片的供电是否可单独控制。芯片供电:需要指定机型的原理图,比如清华同方和L71的硬件原理图,分析芯片的供电是否可以单独控制,以便系统各个场景下更好的实现节省功耗,比如:不使用音频时卸载声卡驱动同时彻底关闭声卡供电。
Runtime电源管理模型:指的是在On状态如何省电,包括:降低运行时钟、关闭无用的设备。linux内核仅提供电源管理的功能:包括电源管理框架和具体设备的电源管理(驱动),如何使用及合适使用由App决定(策略)。
3.2.2 S3S4S5电源管理模式功耗分析
休眠时:1、暂停应用程序(包括用户程序、后台服务、内核线程)
2、暂停各类设备
3、停止CPU
唤醒时:1、启动CPU
2、启动设备
3、启动应用程序3.2.3 runtime电源管理模式(内核文档runtime_pm.txt有详细描述)
3.2.4 进程冻结
标记系统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状态,并做相应处理。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
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/*.txt3.2.6 测试场景覆盖:关机,待机,休眠,典型工作状态,极限场景
3.2.7 测量笔记本功耗
与笔记本厂商沟通确认他们的测量功耗工具,【淘宝】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功耗
3.3.1.1 CPU 电压下探
如果正常操作,降低电压一般不会损害 CPU,一般建议从 50 毫伏进行尝试,每次降压尝试多增加 10 毫伏。只要确保在降低电压前,系统中任务均被正确保存即可。3.3.2 GPU功耗
ls /sys/class/backlight/
。xset dpms force off
,dpms设置显示器的背光,笔记本EC芯片也可以调节显示器背光,笔记本屏幕背光会占用很大的功耗,比如EC芯片调节背光和显卡调节背光同时加载会占用很大的功耗。tlp-stat -g
。
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 硬盘功耗
3.3.4 主板
3.3.5 光驱
3.3.6 内存
3.3.7 网卡
3.3.8 声卡
3.3.9 电源管理
利用Linux驱动系统层面的共同特性,补充电源管理函数,实现暂停,继续等功能;利用各个驱动所独有的特性进行优化。利用Linux内核的APM和ACPI机制,实现系统的挂起。
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、中断等
设置设备的唤醒源: 配置GPIO引脚工作于中断功能, 设置它的触发方式。有些中断可以将系统从睡眠状态中唤醒,我们称之“可以唤醒系统的中断”,当然,“可以唤醒系统的中断”需要配置才能启动唤醒系统这样的功能。这样的中断一般在工作状态的时候就是作为普通I/O interrupt出现,只要在准备使能唤醒系统功能的时候,才会发起一些特别的配置和设定。如何suspend设备中断(IRQ)?在从休眠中唤醒的过程中,如何resume设备IRQ?
时钟树功耗:时钟树的功耗通常占整个SOC功耗的40%左右,这是因为时钟是一直在翻转的信号,所以动态功耗特别大。所以门控时钟技术就特别重要。
cat /proc/modules
blacklist acer_wmi
blacklist btusb
blacklist bluetooth
blacklist uvcvideo
blacklist nvidia
blacklist nouveau3.4 笔记本电源管理软件
3.4.1 TLP 笔记本电源管理软件
TLP 是一个一款免费的、开源的、功能丰富的 Linux 实用工具,适用于运行Ubuntu和其他Linux发行版的笔记本电脑上的电池使用优化,无需深入研究技术细节就能节省笔记本电池电量。有CLI和GUI版本,TLP 是高度可定制的,以满足你的具体要求以方便使用。 TLP附带一个默认配置,可以为您的操作系统和底层机器进行完美调整,TLP 的默认设置已经针对电池寿命进行了优化,所以你可以直接安装并忘记它。您需要做的就是安装并启用该实用程序,您就可以开始使用了。该实用程序的工作原理是在笔记本电脑使用电池运行时优化硬件设备使用的电量,而不是AC
TLP 的基本工作原理是调整影响功耗的内核设置(kernel settings)。
什么是 kernel settings,首先内核设置(kernel settings)是不稳定的。它们的状态在运行时被保存在 RAM 中,内核没有为它们提供持久性。在启动时,内核创建了一个默认的状态,每次启动时都必须通过用户空间的工具重新应用这些改变。TLP 就是这样一个用户空间的工具。/etc/default/tlp
,需要Root权限
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 ]
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_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_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
开始充电阈值
STOP_CHARGE_THRESH_BAT0=85
停止充电阈值
检查服务状态: sudo systemctl status tlp让 TLP
开机自启动: sudo systemctl enable tlp
检查是否成功: sudo systemctl is-enabled tlp3.4.2 LMT笔记本电源管理软件
laptop_mode模式有何好处呢?
要使用laptop_mode的必备条件是什么?
验证笔电是否确实进入 Laptop Mode,如果返回值为0的话,表示系统还未进入 Laptop Mode,如果返回的是其他正数值则表示系统成功进入 Laptop Mode。
,另一个在sudo laptop_mode start后键入sudo laptop_mode status,看看在laptop_mode可以控制那些资源,资源使用情况有何不同。
3.4.3 PowerTOP
什么是 PowerTOP
可调整状态页
– 这个页面是个重要区域,可以为你的笔记本电池优化提供建议。从 BAD 设置为 GOOD
,这可以提升 Linux 中的笔记本电池寿命。3.4.4 s-tui
四.实验验证 – 机器数量和检测仪器
4.1 电脑耗电量测试 – 判断当前获取的电池放电相关信息是否正确
mAh*V/1000=Wh 即 mAh=Wh*1000/V
注:电池放电为模拟放电过程,各个值存在微小偏差。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'
/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
禁用网卡eth0 – sudo ifconfig eth0 down
启用网卡eth0 – sudo ifconfig eth0 up4.2 屏幕功耗
xset dpms force off
),对于主机的耗电量几乎没有影响,耗电量会小幅降低,但是这个数值低到可以忽略。同样环境下,若主机休眠,猜测屏幕与主机耗电量应该会降到几W,稍大于关机的耗电量,具体需要硬件仪器测量。4.3 内核模块
4.3 TLP电源管理软件
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模式
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 files4.5 cpu支持调频和不支持调频模式下的功耗差异
AIDA64不支持linux平台,在5000机器上使用s-tui工具,功耗项无法使用,分析中。
分别使用支持调频的固件和不支持调频的固件,powertop软件查看功耗状态变化走势,测试场景:开机3分钟稳定后的powertop功耗值。
五.小结
功耗续航是电池放电的过程,同时需要关注关机、开机状态下的快速充电。六.参考资料
干电池放电曲线分析
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?
硬件工程师必看 | 功耗测试思路与步骤详解
测量误区,你真的会测待机功耗么?