内核领域-功耗机型的续航基线优化问题-技术调研报告-王井玉_20211216
內(nèi)核領(lǐng)域-功耗機(jī)型的續(xù)航基線優(yōu)化問(wèn)題-技術(shù)調(diào)研報(bào)告_20211216
一. 問(wèn)題
- 軟硬件環(huán)境
設(shè)備: Loongson Loongson-LS3A5000-7A1000-1w-V0.1-CRB (Loongson_SKU) Notebook
操作系統(tǒng): 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
內(nèi)存: 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]
存儲(chǔ)設(shè)備: Silicon Motion Disk (256 GB)
電池: 電池
藍(lán)牙: Intel Bluetooth Device
網(wǎng)絡(luò)適配器: Wireless 7265/RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
鼠標(biāo): ImPS/2 Generic Wheel Mouse (ImPS/2 Generic Wheel Mouse)
鍵盤(pán): AT Translated Set 2 keyboard (AT Translated Set 2 keyboard)
顯示設(shè)備: LCD Monitor(13.9 英寸 (309x173 mm))
其他設(shè)備: FT9201Fingerprint.
-
重現(xiàn)步驟
各個(gè)模式下測(cè)試?yán)m(xù)航時(shí)間,當(dāng)前檢測(cè)儀器限制只能測(cè)試運(yùn)行狀態(tài)的續(xù)航時(shí)間。
-
問(wèn)題現(xiàn)象
目前所有筆記本電池供電續(xù)航時(shí)間短。
-
期望結(jié)果
筆記本電池供電延長(zhǎng)續(xù)航時(shí)間。
二. 現(xiàn)狀
??筆記本不使用外部電源供電時(shí),只使用內(nèi)部電池供電維持正常使用和待機(jī)、休眠等模式,由于很難去更換,那么低功耗就顯得尤為重要。目前筆記本功耗無(wú)基礎(chǔ)數(shù)據(jù)、無(wú)優(yōu)化方案,功耗相關(guān)的知識(shí)薄弱。
??Linux 作為一個(gè)偏重 server side 的操作系統(tǒng),它效仿的對(duì)象主要是傳統(tǒng)的 Unix。加上早期 Linus 等開(kāi)發(fā)者使用的電腦一般都比較老舊,因此 Linux 一開(kāi)始其目標(biāo)主機(jī)就不是普通用戶使用的臺(tái)式機(jī)或者筆電,對(duì)硬件的向后兼容性也比較重視,而對(duì)個(gè)人電腦硬件上的新特性則支持不是那么優(yōu)雅——當(dāng)然,這也和不少硬件廠商既不愿意為 Linux 自行開(kāi)發(fā)驅(qū)動(dòng)程序也不愿意為 Linux 開(kāi)發(fā)者提供足夠技術(shù)資料的做法有關(guān)。一個(gè)對(duì)于個(gè)人電腦用戶比較明顯的影響,就是 Linux 對(duì)計(jì)算機(jī)的電源管理支持一直都不如 Windows,即算是經(jīng)過(guò)個(gè)人電腦業(yè)中的老戰(zhàn)士 Apple 基于 BSD 改造出來(lái)的 OS X,在自家的 iBook/PowerBook 上,表現(xiàn)出來(lái)的電源管理能力也不如采用 Windows 的筆電(而例如 Panasonic 的筆電,甚至可以提供最長(zhǎng)15個(gè)小時(shí)的續(xù)航能力)。
三. 技術(shù)方案
3.1 功耗是怎么產(chǎn)生的?功耗大小與哪些因素有關(guān)?
??低功耗的目的就是提高電池供電的電子產(chǎn)品的使用時(shí)間,分析功耗前先認(rèn)識(shí)電量相關(guān)的基礎(chǔ)知識(shí)。功耗(Power)和能量(Energy)是兩個(gè)完全不同的概念,功耗是一個(gè)瞬時(shí)的概念,而能量是一個(gè)時(shí)間內(nèi)的消耗。
- 能量=功耗*時(shí)間
??稍微分析一下就可以知道,比如PC筆電,能量越大(也就是電池越大),使用時(shí)間越長(zhǎng)。同時(shí)如果功率越小,就顯得越不耗電,使用時(shí)間就越長(zhǎng)。當(dāng)年高通驍龍820就是功耗沒(méi)做好,輸給了麒麟920,給了華為麒麟崛起的機(jī)會(huì)?,F(xiàn)在華為手機(jī)電池耐用已經(jīng)深入人心了。同時(shí)隨著設(shè)備消耗能量,會(huì)產(chǎn)生熱量。功耗越大,產(chǎn)生熱量越快。如果不能及時(shí)散熱,那么設(shè)備溫度就會(huì)升高。溫度升高可能導(dǎo)致設(shè)備不能正常工作甚至損壞。所以有些芯片會(huì)在溫度升高時(shí)候,把頻率降低,本來(lái)能跑2GHz的CPU,溫度高了就只能跑1G,這個(gè)以前在用手機(jī)玩游戲的時(shí)候體驗(yàn)比較明顯??梢钥吹?#xff0c;低功耗技術(shù)直接決定商業(yè)競(jìng)爭(zhēng)的成敗!低功耗對(duì)芯片的影響還有很多方面。
??現(xiàn)在筆記本已經(jīng)非常普遍,人們?nèi)绾卧黾佑?jì)算機(jī)的續(xù)航已經(jīng)成 為一個(gè)難題,比如不同場(chǎng)景下筆記本的功耗是不同的,玩游戲比看電影更費(fèi)電,更多的是CPU功耗,對(duì)電池影響最大的是CPU的頻率。當(dāng)我插電時(shí),我想要全速,但是當(dāng)我拔掉插頭時(shí),我想要盡可能多的電池續(xù)航。其中CPU處理器的功耗過(guò)大時(shí)會(huì)產(chǎn)生大量的熱量,如果散熱條件跟不上,那就會(huì)因?yàn)闇囟冗^(guò)高而影響晶體管的穩(wěn)定性。
??在一個(gè)系統(tǒng)中,數(shù)量最多的是設(shè)備,耗電最多的也是設(shè)備,因此設(shè)備的電源管理是Linux電源管理的核心內(nèi)容。而設(shè)備電源管理最核心的操作就是:在合適的時(shí)機(jī)(如不再使用,如暫停使用),將設(shè)備置為合理的狀態(tài)(如關(guān)閉,如睡眠)。電源管理模型包括:系統(tǒng)S3S4S5模型和Runtime電源管理模型。
??我們所說(shuō)的筆記本續(xù)航,主要是總的耗電功率,功耗來(lái)源分析其包括以下主要設(shè)備的耗電功率:1.CPU,2.顯卡,3.硬盤(pán),4.主板,5.光驅(qū),6.內(nèi)存,7.網(wǎng)卡,8.聲卡,9.電源的自身?yè)p耗,10.顯示器等。系統(tǒng)低功延長(zhǎng)續(xù)航時(shí)間的設(shè)計(jì)是在操作系統(tǒng)層實(shí)現(xiàn)。因?yàn)椴僮飨到y(tǒng)管理系統(tǒng)所有軟硬件資源,并獲取系統(tǒng)的各種狀態(tài)信息,控制硬件設(shè)備的狀態(tài)。以下是對(duì)各個(gè)設(shè)備功率的概述:
??考慮到以后發(fā)展的需要,盡量先調(diào)試出最大的續(xù)航時(shí)間,再根據(jù)使用環(huán)境的不同做適配。
??下面是引用香港網(wǎng)站HKEPC發(fā)布的GeForce6800Ultra的評(píng)測(cè):HKEPC采用的是普通的電流表進(jìn)行測(cè)試,之后對(duì)功率進(jìn)行大約計(jì)算。在2D模式下,5V的輸入電流為1.86A,約為9.3W,而12V的電流為1.97A,約23.64W,合共32.94W。而在3D模式下,電流的波幅十分大,這全看GPU的工作量和其畫(huà)面的復(fù)雜程度,我們利用3DMark03作測(cè)試,原來(lái)最復(fù)雜的工作并不是Game4的MotherNature,而是Fill-Rate(MutilTexture)。在這個(gè)測(cè)試項(xiàng)目中,5V的輸入電流為3.01A,約為15.05W,而12V的電流為4.50A,約54W,合共70W。從以上數(shù)據(jù)可以看出,相同型號(hào)的GPU其在處理2D圖形和3D圖形時(shí)的差距達(dá)到一倍多。對(duì)于我們一般的辦公用計(jì)算機(jī),由于大部分使用的是集成顯卡,功耗最大為十幾瓦,一般不會(huì)超過(guò)15W即使使用的是非集成顯卡,也是用的低端顯卡,功率也不會(huì)超過(guò)20W的,建議取20W。而對(duì)于游戲?yàn)橹鞯母呒?jí)網(wǎng)卡,以及需要頻繁做大量3D的計(jì)算機(jī),功耗差異更大。
??為了將來(lái)的發(fā)展需要,建議先驗(yàn)證主流機(jī)型的各款顯卡。
??還有就是電腦電池電源的功率因素問(wèn)題,是我們關(guān)心的一個(gè)非常重要的方面。對(duì)于計(jì)算機(jī)和其它一切靠直流電壓工作的電子電路,離開(kāi)無(wú)功功率是根本無(wú)法工作的。為了讓計(jì)算機(jī)電路能正常工作,必須向其提供平滑了的直流電壓。這個(gè)“平滑”工作必須由接在計(jì)算機(jī)電源整流器后面的濾波電容器C來(lái)完成。這個(gè)濾波器就像一個(gè)水庫(kù),電容器里面必須儲(chǔ)存足夠數(shù)量的電荷,在整流半波之間的空白時(shí),使電路上的工作電壓仍不間斷,能保持正常電平。換句話說(shuō),即使在兩個(gè)脈動(dòng)半波之間無(wú)輸入電能時(shí),電壓電平也無(wú)顯著的變化,這個(gè)功能是靠電容器內(nèi)的儲(chǔ)能來(lái)實(shí)現(xiàn)的,儲(chǔ)存在電容器內(nèi)的這部分能量就是無(wú)功功率。所以說(shuō),計(jì)算機(jī)是靠無(wú)功功率的支持,才能保證電路正確運(yùn)用有功功率實(shí)現(xiàn)正常運(yùn)行的。
??因此可以說(shuō),筆記本電腦電池電源的電芯是功耗優(yōu)化的重點(diǎn)!
此外,筆記本電腦的外設(shè)(usb hub、觸控板等)的功率雖然優(yōu)化空間小,但對(duì)最長(zhǎng)續(xù)航時(shí)間還是有影響。降低顯示器亮度,比如在做文字編輯時(shí),將背景調(diào)暗些,節(jié)能的同時(shí)還可以保護(hù)視力、減輕眼睛的疲勞強(qiáng)度。當(dāng)電腦在播放音樂(lè)、評(píng)書(shū)、小說(shuō)等單一音頻文件時(shí),可以徹底關(guān)閉顯示器等。
??綜上所述,筆記本電腦的功率計(jì)算應(yīng)該按照不同場(chǎng)合和不同要求來(lái)分開(kāi)計(jì)算,不同情況的消耗功率是不同的,比如CPU是否全速運(yùn)行、屏幕的亮度等。對(duì)于一般辦公環(huán)境,電腦的功率大致為:CPU+顯卡+硬盤(pán)+主板+光驅(qū)+內(nèi)存等+電源+外設(shè)等+顯示器=功耗,在目前的狀況下辦公電腦不涉及大量計(jì)算和游戲,而且目前的很多屏幕顯示器,也支持節(jié)能功能。
??另外,電腦電源由于感性負(fù)荷較多,所以對(duì)外面設(shè)備產(chǎn)生感應(yīng)電流和漏電的可能比較大。我們?cè)诓痖_(kāi)電腦的時(shí)候,通常會(huì)先洗手以釋放身上的靜電,以免對(duì)設(shè)備造成危害,但由于洗手后,人皮膚的電阻會(huì)減小。所以我們每次接觸電腦的時(shí)候都會(huì)碰到強(qiáng)烈的漏電情況,而且漏電電流還比較大,手都會(huì)感到麻麻的感覺(jué),所以我覺(jué)得電腦插座應(yīng)該設(shè)置好保護(hù)線,最好還是安裝漏電保護(hù)裝置,尤其是對(duì)于那些小孩有可能接觸到電腦機(jī)身的場(chǎng)合,更應(yīng)該注意電腦的漏電保護(hù)。
??可參考Windows下續(xù)航優(yōu)化,比如Overclockulator功耗測(cè)試軟件。關(guān)機(jī)狀態(tài)的耗電理論上應(yīng)該為0W,耗電大小從小到大排序,S5關(guān)機(jī)<S4休眠<S3待機(jī)<runtime+電池供電+應(yīng)用程序。
??Linux 內(nèi)核的 PM 框架涉及眾多組件,弄清楚這些組件之間的依賴(lài)關(guān)系,在合適的著眼點(diǎn)上進(jìn)行優(yōu)化,采用正確的方法進(jìn)行 PM 的編程,對(duì)改善代碼的質(zhì)量、輔助功耗和性能測(cè)試都有極大的好處。 當(dāng)然,這些方法的前提永遠(yuǎn)是芯片的功能要滿足要求。功率再低,功能不滿足的芯片和板磚有什么區(qū)別。芯片的功能要滿足要求這個(gè)基礎(chǔ)就決定了這些方法有一些限制,比如不可能把電壓降到0,不可能讓信號(hào)永遠(yuǎn)不翻轉(zhuǎn)。這些都是前提。
??低功耗技術(shù)就是一系列的降低功耗的技術(shù)。在了解低功耗技術(shù)之前,我們必須先了解功耗的構(gòu)成?,F(xiàn)在幾乎都從 PC 機(jī)換到了筆記本電腦了。但是使用筆記本有個(gè)問(wèn)題,我們希望電池耐用,我們可以使用到每一點(diǎn)電量。所以,我們需要知道電量都去哪里了,是不是浪費(fèi)了。
- 一個(gè)設(shè)備的功耗由兩部分組成:動(dòng)態(tài)功耗和靜態(tài)功耗。
??這里要注意的是:在設(shè)備運(yùn)行時(shí),也需要消耗靜態(tài)功耗的,因?yàn)樵O(shè)備運(yùn)行時(shí)也是上電狀態(tài)。功耗分類(lèi)把靜態(tài)功耗單獨(dú)拿出來(lái),只是為了理論分析方便。
??無(wú) AC 電源時(shí)達(dá)到硬件該有的性能和隨時(shí)獲得最長(zhǎng)電池使用時(shí)間是相互沖突的,需要進(jìn)行取舍。針對(duì)待機(jī)、休眠等模式,需要判斷各個(gè)設(shè)備的工作狀態(tài)以及電路板上是否還有其他的芯片在工作,可能它們?nèi)匀辉谙碾娏?#xff0c;所以我們?cè)谶M(jìn)入待機(jī)活或休眠前應(yīng)該要把其他芯片給關(guān)閉(可以通過(guò)特定的指令或者片選線)。條件允許的可以直接切斷它們的電源。
??進(jìn)入待機(jī)、休眠模式后,只是各個(gè)設(shè)備中最耗電的內(nèi)核部分被關(guān)了,而所有寄存器和內(nèi)存中的值是保持不變的,所以它的外設(shè)還在消耗電量,所以我們要在進(jìn)入待機(jī)、休眠模式之前把開(kāi)啟的外設(shè)給關(guān)了。這里要注意一點(diǎn):外設(shè)開(kāi)啟時(shí)是先開(kāi)時(shí)鐘再設(shè)置寄存器,關(guān)閉時(shí)先清除寄存器再關(guān)閉時(shí)鐘。理解為:操縱一個(gè)外設(shè)的寄存器肯定是需要時(shí)鐘的,如果我們先把時(shí)鐘給關(guān)了,那么還怎么操作寄存器呢,如果光關(guān)了時(shí)鐘,不清寄存器的相應(yīng)位,那么外設(shè)還處于“靜態(tài)耗電”的狀態(tài)。
??關(guān)于各個(gè)設(shè)備的IO口的電平,這個(gè)是非常重要的一點(diǎn),和之前提到的外設(shè)一樣,GPIO也是一種外設(shè),但是特殊的是,這個(gè)外設(shè)是和芯片外部直接打交道的,如果GPIO外部接了個(gè)上拉電阻,而你在進(jìn)入待機(jī)、休眠等模式之前設(shè)置的IO口是低電平的,那么電流不就通過(guò)電阻,流到IO口里來(lái)了,比如正常的說(shuō)接了個(gè)10k的上拉電阻,接到3.3v電壓上,那么電流就是330uA,這個(gè)值可不小呢,各個(gè)設(shè)備在進(jìn)入待機(jī)、休眠后極限最小電流好像能達(dá)到幾u(yù)A或者幾十uA。那么這個(gè)電路就是因?yàn)檫@個(gè)電阻,停機(jī)電流比別人大了將近幾十倍了,這還怎么比?所以IO口是絕對(duì)不能被忽視的。設(shè)備芯片復(fù)位以后所有引腳都是浮空輸入模式,理論上懸浮空輸入時(shí)IO口的狀態(tài)為高阻態(tài)是最省電的,那么我們只要把所有IO都DeInit就可以了。但是事實(shí)上不是,我把沒(méi)有用到的管腳全部推挽輸出高電平或低電平,不用的外部晶振的引腳要改為上拉輸入才省電,外部有上拉下拉電阻的引腳分別推挽輸出高電平和低電平,一般電路中上拉電阻比較多(比如IIC的總線外部都有上拉的)。和外部芯片相連的引腳都推挽輸出低電平,因?yàn)橥獠啃酒瑪嚯姾笏幸_都是高阻態(tài)或接地的吧,如果你弄個(gè)高電平,就可能會(huì)有電流流過(guò)去。另外,主板上是否帶有穩(wěn)壓相關(guān)的芯片,這類(lèi)芯片一般進(jìn)入待機(jī)、休眠也會(huì)存在耗電。
- 功耗的電量單位–電流單位,表明電流的大小
A:安
mA:毫安
uA:微安
1A=1000mA=1000*1000uA
- 電池容量:電量的單位,常用來(lái)表明電池的容量,意即以多大的電流放電,能夠持續(xù)提供多長(zhǎng)時(shí)間的電流。
18650電芯通常容量為2200mAh毫安時(shí).
1號(hào)電池2.5Ah.
2號(hào)電池1.5Ah.
3號(hào)電池500mAh.
7號(hào)電池200mAh.
- 電池容量的計(jì)算方法:
容量=放電電池(恒流)× 放電時(shí)間(小時(shí))
反過(guò)來(lái): 放電時(shí)間T=容量/放電電流(恒流)
比如一個(gè)電池用500MA(毫安)的恒定電流放了2 個(gè)小時(shí),那么這個(gè)電池的容量就等于500MA*2H=1000MAH=1AH。
再如一個(gè)電池用5安的電流放了2個(gè)小時(shí),那么該電池的容量就是10AH。
電腦主板紐扣電池CR2032:210mAh
??筆記本電池多數(shù)為鋰電池,鋰電池的電量大小,只看【mAh毫安時(shí)】并不夠的,還需要看到【W(wǎng)h瓦時(shí)】,這才是鋰電池真正的能量容量,后續(xù)按照鋰電池放電進(jìn)行功耗優(yōu)化。
3.2 電源管理
3.2.1 系統(tǒng)電源的組成和管理模型的四種狀態(tài)
??在計(jì)算機(jī)系統(tǒng)依靠電能運(yùn)行,Linux 系統(tǒng)中稱(chēng)作電源管理(Power Management),電源管理的核心思想只在需要設(shè)備功能時(shí)才給它供電。Linux內(nèi)核提供了三種Suspend: Freeze、Standby和STR(Suspend to RAM),在用戶空間向”/sys/power/state”文件分別寫(xiě)入”freeze”、”standby”和”mem”,即可觸發(fā)它們。Linux電源管理中,相當(dāng)多的部分是在處理Hibernate、Suspend、Runtime PM等功能。
??電源管理(Power Management)在Linux Kernel中,是一個(gè)比較龐大的子系統(tǒng),涉及到供電(Power Supply)、充電(Charger)、時(shí)鐘(Clock)、頻率(Frequency)、電壓(Voltage)、睡眠/喚醒(Suspend/Resume)等方方面面。內(nèi)核中,Suspend及Resume過(guò)程涉及到PM Core、Device PM、各個(gè)設(shè)備的驅(qū)動(dòng)、Platform dependent PM、CPU control等多個(gè)模塊,涉及了console switch、process freeze、CPU hotplug、wakeup處理等過(guò)個(gè)知識(shí)點(diǎn)。系統(tǒng)suspend/resume的過(guò)程,要求設(shè)備也同步suspend/resume。系統(tǒng)hibernate及恢復(fù)的過(guò)程,要求設(shè)備在suspend/resume的基礎(chǔ)上,增加poweroff的動(dòng)作。系統(tǒng)reboot的過(guò)程,包括halt、power off、restart等,要求設(shè)備進(jìn)入shutdown狀態(tài),以避免意外產(chǎn)生。
??傳統(tǒng)的suspend/resume已經(jīng)很明確了,無(wú)非是按照pm_domain—>device driver或者class—>device driver或者bus—>device driver的順序,調(diào)用相應(yīng)的回調(diào)函數(shù)。
- 電源管理的核心思想
- 系統(tǒng)電源管理模型的四種狀態(tài)
Runtime電源管理模型:指的是在On狀態(tài)如何省電,包括:降低運(yùn)行時(shí)鐘、關(guān)閉無(wú)用的設(shè)備。linux內(nèi)核僅提供電源管理的功能:包括電源管理框架和具體設(shè)備的電源管理(驅(qū)動(dòng)),如何使用及合適使用由App決定(策略)。
- 啟動(dòng)待機(jī)休眠
啟動(dòng) suspend to ram:(睡眠)//suspend to disk(休眠),echo mem > /sys/power/state //啟動(dòng)休眠的方法就是往/sys/power/state 寫(xiě)字符串,會(huì)調(diào)用state_store函數(shù)(還有個(gè)state_show是讀的時(shí)候被調(diào)用 )。
3.2.2 S3S4S5電源管理模式功耗分析
- S3S4S5電源管理模式功耗分析,驅(qū)動(dòng)需要支持休眠和喚醒,比如suspend函數(shù)和resume函數(shù)
休眠時(shí):1、暫停應(yīng)用程序(包括用戶程序、后臺(tái)服務(wù)、內(nèi)核線程)
2、暫停各類(lèi)設(shè)備
3、停止CPU
喚醒時(shí):1、啟動(dòng)CPU
2、啟動(dòng)設(shè)備
3、啟動(dòng)應(yīng)用程序
3.2.3 runtime電源管理模式(內(nèi)核文檔runtime_pm.txt有詳細(xì)描述)
??runtime是在系統(tǒng)正常工作的時(shí)候單獨(dú)控制某個(gè)設(shè)備休眠和喚醒,相比S3S4S5續(xù)航優(yōu)化,比如系統(tǒng)睡眠模型是讓整個(gè)系統(tǒng)休眠,runtime的場(chǎng)景更復(fù)雜也更難,需要在不影響使用設(shè)備功能的前提下盡可能讓它省電。runtime PM 框架不需要用戶程序的干涉,由Kernel統(tǒng)一調(diào)度,實(shí)時(shí)的關(guān)閉或打開(kāi)設(shè)備,以便在使用性能和省電性能之間找到最佳的平衡等。
??怎樣動(dòng)態(tài)地打開(kāi)或關(guān)閉設(shè)備的電源?最簡(jiǎn)單的方法,在驅(qū)動(dòng)程序的open函數(shù)中打開(kāi)電源,在close函數(shù)中關(guān)閉電源,上述方法有一個(gè)缺點(diǎn): 多個(gè)應(yīng)用同時(shí)訪問(wèn)設(shè)備時(shí)可能造成干擾。另外支持UEFI固件需要考慮固件參數(shù)的正確性。
3.2.4 進(jìn)程凍結(jié)
??什么是進(jìn)程凍結(jié),進(jìn)程凍結(jié)技術(shù)(freezing of tasks)是指在系統(tǒng)hibernate或者suspend的時(shí)候,將用戶進(jìn)程和部分內(nèi)核線程置于“可控”的暫停狀態(tài)。
- 為什么需要凍結(jié)技術(shù) – 假設(shè)沒(méi)有凍結(jié)技術(shù),進(jìn)程可以在任意可調(diào)度的點(diǎn)暫停,而且直到cpu_down才會(huì)暫停并遷移。這會(huì)給系統(tǒng)帶來(lái)很多問(wèn)題:
??凍結(jié)的對(duì)象是內(nèi)核中可以被調(diào)度執(zhí)行的實(shí)體,包括用戶進(jìn)程、內(nèi)核線程和work_queue。用戶進(jìn)程默認(rèn)是可以被凍結(jié)的,借用信號(hào)處理機(jī)制實(shí)現(xiàn);內(nèi)核線程和work_queue默認(rèn)是不能被凍結(jié)的,少數(shù)內(nèi)核線程和work_queue在創(chuàng)建時(shí)指定了freezable標(biāo)志,這些任務(wù)需要對(duì)freeze狀態(tài)進(jìn)行判斷,當(dāng)系統(tǒng)進(jìn)入freezing時(shí),主動(dòng)暫停運(yùn)行。
??kernel threads可以通過(guò)調(diào)用kthread_freezable_should_stop來(lái)判斷freezing狀態(tài),并主動(dòng)調(diào)用__refrigerator進(jìn)入凍結(jié);work_queue通過(guò)判斷max_active屬性,如果max_active=0,則不能入隊(duì)新的work,所有work延后執(zhí)行。
??標(biāo)記系統(tǒng)freeze狀態(tài)的有三個(gè)重要的全局變量:pm_freezing、system_freezing_cnt和pm_nosig_freezing,如果全為0,表示系統(tǒng)未進(jìn)入凍結(jié);system_freezing_cnt>0表示系統(tǒng)進(jìn)入凍結(jié),pm_freezing=true表示凍結(jié)用戶進(jìn)程,pm_nosig_freezing=true表示凍結(jié)內(nèi)核線程和workqueue。它們會(huì)在freeze_processes和freeze_kernel_threads中置位,在thaw_processes和thaw_kernel_threads中清零。
??fake_signal_wake_up函數(shù)巧妙的利用了信號(hào)處理機(jī)制,只設(shè)置任務(wù)的TIF_SIGPENDING位,但不傳遞任何信號(hào),然后喚醒任務(wù);這樣任務(wù)在返回用戶態(tài)時(shí)會(huì)進(jìn)入信號(hào)處理流程,檢查系統(tǒng)的freeze狀態(tài),并做相應(yīng)處理。
任務(wù)主動(dòng)調(diào)用try_to_freeze的代碼如下:
static inline bool try_to_freeze_unsafe(void) {if (likely(!freezing(current))) //檢查系統(tǒng)是否處于freezing狀態(tài)return false;return __refrigerator(false); //主動(dòng)進(jìn)入凍結(jié) }static inline bool freezing(struct task_struct *p) {if (likely(!atomic_read(&system_freezing_cnt))) //系統(tǒng)總體進(jìn)入freezingreturn false;return freezing_slow_path(p); }bool freezing_slow_path(struct task_struct *p) {if (p->flags & PF_NOFREEZE) //當(dāng)前進(jìn)程是否允許凍結(jié)return false;if (pm_nosig_freezing || cgroup_freezing(p)) //系統(tǒng)凍結(jié)kernel threadsreturn true;if (pm_freezing && !(p->flags & PF_KTHREAD)) //系統(tǒng)凍結(jié)用戶進(jìn)程return true;return false; }進(jìn)入凍結(jié)狀態(tài)直到恢復(fù)的主要函數(shù):
bool __refrigerator(bool check_kthr_stop) { ...for (;;) {set_current_state(TASK_UNINTERRUPTIBLE); //設(shè)置進(jìn)程為UNINTERRUPTIBLE狀態(tài)spin_lock_irq(&freezer_lock);current->flags |= PF_FROZEN; //設(shè)置已凍結(jié)狀態(tài)if (!freezing(current) ||(check_kthr_stop && kthread_should_stop())) //判斷系統(tǒng)是否還處于凍結(jié)current->flags &= ~PF_FROZEN; //如果系統(tǒng)已解凍,則取消凍結(jié)狀態(tài)spin_unlock_irq(&freezer_lock);if (!(current->flags & PF_FROZEN)) //如果已取消凍結(jié),跳出循環(huán),恢復(fù)執(zhí)行break;was_frozen = true;schedule();} ...... }3.2.5 電源管理有關(guān)的Source code
??電源管理有關(guān)的Source code包括傳統(tǒng)意義上的Power Management,如Power Off、Suspend to RAM、Suspend to Disk、Hibernate等,對(duì)I/O設(shè)備的運(yùn)行時(shí)電源管理(運(yùn)行時(shí)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 測(cè)試場(chǎng)景覆蓋:關(guān)機(jī),待機(jī),休眠,典型工作狀態(tài),極限場(chǎng)景
??暫時(shí)只考慮常溫25°,不進(jìn)行低溫和高溫測(cè)試。筆記本電池的充放點(diǎn)曲線。
3.2.7 測(cè)量筆記本功耗
??筆記本不是額定功耗的電子產(chǎn)品,因?yàn)楣P記本有節(jié)能模式,比如處理器會(huì)動(dòng)態(tài)調(diào)節(jié)主頻,顯卡對(duì)功耗變化影響較大,硬盤(pán)等低功耗部件還有休眠功能。記錄所有支路的電流值和電壓值,整機(jī)功耗,計(jì)算出單板功耗和適配器效率。PC功耗是實(shí)時(shí)變化的,看視頻瀏覽網(wǎng)頁(yè)功耗都是不同的,功耗續(xù)航需要軟硬件一起調(diào)試。
??與筆記本廠商溝通確認(rèn)他們的測(cè)量功耗工具,【淘寶】https://m.tb.cn/h.fkcax28?sm=1a4148?tk=CfzR21PxsR9「ChargerLAB POWER-Z USB PD電壓電流紋波雙Type-C測(cè)試儀 KM001C」,公司采購(gòu)需要從京東購(gòu)買(mǎi)https://item.jd.com/31045469743.html,功耗測(cè)試步驟的詳細(xì)方法需要設(shè)備到了再驗(yàn)證。功耗工具補(bǔ)充,https://item.taobao.com/item.htm?spm=a230r.1.14.1.744961121eUhy4&id=574217991932&ns=1&abbucket=10#detail。
??需要協(xié)調(diào)筆記本整機(jī)的原理圖和PCB,分析整機(jī)的關(guān)機(jī)、待機(jī)、休眠、典型工作模式及極限工作模式,確認(rèn)硬件設(shè)計(jì)支持相應(yīng)的電源控制電路基礎(chǔ)上為后續(xù)的軟件功耗優(yōu)化提供解決方案,首先確認(rèn)整機(jī)采用了那些低功耗高效率的器件,比如在器件選型和硬件設(shè)計(jì)時(shí),器件是否支持低功耗模式和相應(yīng)的電源控制電路。散熱大的元件,如MCU,DDR,電源芯片等均勻分布,并遠(yuǎn)離熱敏元件。阻抗控制,合理的PCB布局,精確的阻抗控制,可以減小射頻路徑上的損耗。
3.3 功耗優(yōu)化方案
3.3.1 CPU功耗
??現(xiàn)代處理器上面有各種各樣的電源管理技術(shù),比較通行的一種辦法是將電源管理交由操作系統(tǒng)來(lái)負(fù)責(zé)。比如處理器廠商會(huì)為處理器定義多種電源狀態(tài),C-State和P-State就是兩種常見(jiàn)的用于描述處理器電源狀態(tài)的狀態(tài)值。其中C-State用于節(jié)能,P-State用于決定CPU在有負(fù)載情況下的電壓-頻率狀態(tài)。操作系統(tǒng)來(lái)根據(jù)當(dāng)前的負(fù)載情況來(lái)調(diào)整CPU的狀態(tài),這樣在檢測(cè)到有高負(fù)載任務(wù)時(shí),系統(tǒng)會(huì)將處理器調(diào)整到全速運(yùn)行狀態(tài);在輕負(fù)載時(shí),系統(tǒng)會(huì)讓處理器進(jìn)入低速狀態(tài),甚至將其部分關(guān)閉。
??另外處理器廠商還加入了很多軟硬件結(jié)合的節(jié)能技術(shù),像是Intel和AMD在很久以前就給CPU引入的SpeedStep/Cool’n’Quiet這些技術(shù)都可以讓CPU在不損失最大性能的同時(shí),盡可能的節(jié)約能耗?,F(xiàn)在則是有Speed Shift和Turbo Cove這樣的技術(shù)接手了。
??CPU 功耗CPU 的耗電大體符合以下公式: 功率 = 電容率 × 電壓的平方 × 頻率功率代表能耗(Power),而電容率(Capacitance),與 CPU 的制程和工藝等相關(guān),在 CPU 出廠時(shí)就已經(jīng)確定下來(lái)。那么我們能改變的只有電壓與頻率,而頻率與電壓成正相關(guān)。所以當(dāng) CPU 在很高的頻率上運(yùn)行時(shí),效能很高但耗電量很大。如果我們能在 CPU 運(yùn)算量不大時(shí),讓它降頻運(yùn)行,這樣我們就可以減少功率,同時(shí)我們可以降低電壓,節(jié)約能源,并減少發(fā)熱與風(fēng)扇噪音。 Linux 下調(diào)整 CPU 的模塊叫 CPU 調(diào)速器(Governor),Android 等基于 Linux 的嵌入式平臺(tái)都會(huì)使用 CPU 調(diào)速器達(dá)到省電的效果,同樣,Linux也能。
??cpu調(diào)頻策略–最佳性能、偏重性能、偏重省電、最佳省, 變頻技術(shù)是指CPU硬件本身支持在不同的頻率下運(yùn)行,系統(tǒng)運(yùn)行過(guò)程中可以根據(jù)隨時(shí)可能發(fā)生的系統(tǒng)負(fù)載情況動(dòng)態(tài)在這些不同的運(yùn)行頻率之間進(jìn)行切換,從而達(dá)到對(duì)性能和功耗做到而這兼顧的目的。
??處理器負(fù)荷,處理器負(fù)荷較輕時(shí),降低處理器的時(shí)鐘速度;在處理器沒(méi)有負(fù)載的時(shí)候,自動(dòng)進(jìn)入IDLE模式;在處理器長(zhǎng)時(shí)間不用時(shí),進(jìn)入sleep模式,將處理器所不需要的模塊關(guān)閉。
??cpufreq policy負(fù)責(zé)設(shè)定cpu調(diào)頻的一個(gè)大致范圍,而cpu的具體運(yùn)行頻率,則需要由相應(yīng)的cufreq governor決定(比如自行調(diào)節(jié)頻率的CPU)。那到底什么是cpufreq governor?它的運(yùn)行機(jī)制是什么?Android 平臺(tái)的 CPU 調(diào)速器使用經(jīng)驗(yàn),請(qǐng)不要試著直接限制 CPU 的頻率,那是在 ARM 平臺(tái)上才有效的做法,在 X86 平臺(tái)下對(duì)減輕能耗幫助甚微,龍芯mips和loongarch架構(gòu)待驗(yàn)證。
- 常用的 cpufreq governor – 為了管好CPU的功耗,CPU廠家也不斷為它引入新的電源管理特性
基于cpufreq governor的調(diào)頻思路(Documentation\cpu-freq\governors.txt)
3.3.1.1 CPU 電壓下探
對(duì)處理器的電壓進(jìn)行最大限度的下探,在挖掘 CPU 體質(zhì)的極限的同時(shí),起到既能降低發(fā)熱,又能最大限度保持性能的效果。
如果正常操作,降低電壓一般不會(huì)損害 CPU,一般建議從 50 毫伏進(jìn)行嘗試,每次降壓嘗試多增加 10 毫伏。只要確保在降低電壓前,系統(tǒng)中任務(wù)均被正確保存即可。
3.3.2 GPU功耗
- GPU功耗 - GPU是并行處理單元,由于其算力主要來(lái)自多個(gè)模塊并行計(jì)算,為了正常工作,通常需要很多模塊同時(shí)運(yùn)算,功耗也很大,所以很多雙顯卡默認(rèn)關(guān)掉獨(dú)顯。
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 硬盤(pán)功耗
??熱量控制,減少硬件發(fā)熱、降低電腦溫度。在AC模式下,硬盤(pán)處于高性能狀態(tài),磁頭不歸位,硬盤(pán)不減速,所以溫度比在XP下要高點(diǎn)。但是在用電池時(shí),硬盤(pán)為了減速節(jié)電,磁頭就會(huì)平凡歸位,溫度自然也會(huì)降下來(lái)了,但是磁頭歸位值就會(huì)像WIN7和XP系統(tǒng)下一樣非常高,對(duì)硬盤(pán)的壽命有一定的影響(a tradeoff)。
3.3.4 主板
??主板功耗需要整機(jī)的原理圖。
3.3.5 光驅(qū)
??筆記本計(jì)算機(jī)已經(jīng)很少裝有內(nèi)置光驅(qū),暫不考慮。
3.3.6 內(nèi)存
??內(nèi)存作為系統(tǒng)主存也需要時(shí)刻使用,也是功耗消耗的大戶。內(nèi)存泄露,檢測(cè)耗電高的程序是否存在內(nèi)存泄露。
3.3.7 網(wǎng)卡
- 有線網(wǎng)絡(luò)和無(wú)線網(wǎng)絡(luò)管理
3.3.8 聲卡
??系統(tǒng)在未使用聲卡時(shí)可以暫時(shí)關(guān)閉聲卡功能以減少功耗。
3.3.9 電源管理
- 電池管理 – 電池自身在反復(fù)使用過(guò)程中存在損耗,修復(fù)電池的方法有多種也是功耗測(cè)試的前提,在此推薦一個(gè)比較有好的手動(dòng)修復(fù)方法,操作步驟如下:
- 系統(tǒng)平臺(tái)級(jí)電源管理策略 APM電源管理策略 vs ACPI電源管理策略
利用Linux驅(qū)動(dòng)系統(tǒng)層面的共同特性,補(bǔ)充電源管理函數(shù),實(shí)現(xiàn)暫停,繼續(xù)等功能;利用各個(gè)驅(qū)動(dòng)所獨(dú)有的特性進(jìn)行優(yōu)化。利用Linux內(nèi)核的APM和ACPI機(jī)制,實(shí)現(xiàn)系統(tǒng)的掛起。
- 休眠喚醒時(shí)設(shè)備的notifier通知
??一些特殊設(shè)備驅(qū)動(dòng)的suspend和resume函數(shù)需要仔細(xì)商榷,如UART進(jìn)入待機(jī)后關(guān)閉電源在喚醒會(huì)丟失串口調(diào)試信息等。
- 查看 acpi 相關(guān)信息
- 查看筆記本laptop電源管理芯片(不同整機(jī)廠商) – drivers/platform/mips/
??acpi-call,sudo apt install acpi-call-dkms安裝對(duì)應(yīng)的acpi-call模塊,其中/usr/src/acpi-call-版本號(hào)/是你放置acpi_call源碼的位置),需要分析ACPI 電源管理是否有導(dǎo)致 CPU loadavg 負(fù)載虛高的現(xiàn)象。其中查找資料提到,每次通過(guò)apt-get dist-upgrade升級(jí)內(nèi)核后都需要重新編譯acpi_call,具體原因Kaijia會(huì)繼續(xù)研究,大家每次更新內(nèi)核后別忘了重新編譯模塊,待確認(rèn)。
3.3.10 顯示器
??系統(tǒng)處于運(yùn)行狀態(tài)并且屏幕顯示器打開(kāi)時(shí)的功耗和休眠時(shí)的功耗是有很大差異的。
3.3.11 外設(shè)(觸控板等)、GPIO、中斷等
??大多外設(shè)是usb接口,需要使USB模塊進(jìn)入待機(jī)休眠模式等。
??設(shè)置設(shè)備的喚醒源: 配置GPIO引腳工作于中斷功能, 設(shè)置它的觸發(fā)方式。有些中斷可以將系統(tǒng)從睡眠狀態(tài)中喚醒,我們稱(chēng)之“可以喚醒系統(tǒng)的中斷”,當(dāng)然,“可以喚醒系統(tǒng)的中斷”需要配置才能啟動(dòng)喚醒系統(tǒng)這樣的功能。這樣的中斷一般在工作狀態(tài)的時(shí)候就是作為普通I/O interrupt出現(xiàn),只要在準(zhǔn)備使能喚醒系統(tǒng)功能的時(shí)候,才會(huì)發(fā)起一些特別的配置和設(shè)定。如何suspend設(shè)備中斷(IRQ)?在從休眠中喚醒的過(guò)程中,如何resume設(shè)備IRQ?
??風(fēng)扇調(diào)速包含主板風(fēng)扇和顯卡風(fēng)扇等。
??時(shí)鐘樹(shù)功耗:時(shí)鐘樹(shù)的功耗通常占整個(gè)SOC功耗的40%左右,這是因?yàn)闀r(shí)鐘是一直在翻轉(zhuǎn)的信號(hào),所以動(dòng)態(tài)功耗特別大。所以門(mén)控時(shí)鐘技術(shù)就特別重要。
- 零、驅(qū)動(dòng)直接編譯進(jìn)內(nèi)核(靜態(tài)加載) vs. 編譯為模塊(動(dòng)態(tài)加載) – cat /proc/modules
手動(dòng)調(diào)試過(guò)程 – cat /etc/modprobe.d/blacklist.conf,將對(duì)應(yīng)模塊添加到黑名單
blacklist acer_wmi
blacklist btusb
blacklist bluetooth
blacklist uvcvideo
blacklist nvidia
blacklist nouveau
3.4 筆記本電源管理軟件
??在 Linux 上有很多功耗相關(guān)的實(shí)用工具,可以在命令行使用或者圖形。同時(shí),我們也可以查看電池模組名稱(chēng)、電源、廠商以及電池規(guī)格等。電源管理是在不使用時(shí)關(guān)閉電源或者切換系統(tǒng)的組件到低耗模式的一種功能。
- 功耗相關(guān)工具
3.4.1 TLP 筆記本電源管理軟件
-
TLP是什么?
??TLP 是一個(gè)一款免費(fèi)的、開(kāi)源的、功能豐富的 Linux 實(shí)用工具,適用于運(yùn)行Ubuntu和其他Linux發(fā)行版的筆記本電腦上的電池使用優(yōu)化,無(wú)需深入研究技術(shù)細(xì)節(jié)就能節(jié)省筆記本電池電量。有CLI和GUI版本,TLP 是高度可定制的,以滿足你的具體要求以方便使用。 TLP附帶一個(gè)默認(rèn)配置,可以為您的操作系統(tǒng)和底層機(jī)器進(jìn)行完美調(diào)整,TLP 的默認(rèn)設(shè)置已經(jīng)針對(duì)電池壽命進(jìn)行了優(yōu)化,所以你可以直接安裝并忘記它。您需要做的就是安裝并啟用該實(shí)用程序,您就可以開(kāi)始使用了。該實(shí)用程序的工作原理是在筆記本電腦使用電池運(yùn)行時(shí)優(yōu)化硬件設(shè)備使用的電量,而不是AC -
TLP的工作原理?
??TLP 的基本工作原理是調(diào)整影響功耗的內(nèi)核設(shè)置(kernel settings)。
什么是 kernel settings,首先內(nèi)核設(shè)置(kernel settings)是不穩(wěn)定的。它們的狀態(tài)在運(yùn)行時(shí)被保存在 RAM 中,內(nèi)核沒(méi)有為它們提供持久性。在啟動(dòng)時(shí),內(nèi)核創(chuàng)建了一個(gè)默認(rèn)的狀態(tài),每次啟動(dòng)時(shí)都必須通過(guò)用戶空間的工具重新應(yīng)用這些改變。TLP 就是這樣一個(gè)用戶空間的工具。
??在長(zhǎng)時(shí)間不操作的情況下,電腦進(jìn)入屏保,如果你設(shè)置了開(kāi)機(jī)密碼,好吧,每次看電影的時(shí)候你每隔個(gè)5分鐘就要?jiǎng)右幌码娔X,搞不好還要一直輸入開(kāi)機(jī)密碼,煩不煩。所以,需要簡(jiǎn)單地去改一下配置。TLp的配置文件位于/etc/default/tlp,需要Root權(quán)限
- TLP電池管理軟件,如果想要關(guān)閉TLP,vi /etc/default/tlp 將其中的"TLP_ENABLE=1"改為"TLP_ENABLE=0"即可。如果想要定制更多的東西,也可以去配置這個(gè)文件。
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處理器相關(guān)信息
/etc/default/tlp 分析tlp相關(guān)配置項(xiàng)含義
- CPU頻率
具體的配置文件在直流電源與電池供電情況下都使用 powersave 調(diào)速器。X86 平臺(tái)的 powersave 調(diào)速器不會(huì)限制你的最高頻率,只是更加謹(jǐn)慎地增加頻率,并在負(fù)載下降時(shí)更加積極的回到低頻率。TLP 的開(kāi)發(fā)者并不建議更改為其他調(diào)速器。
CPU_SCALING_GOVERNOR_ON_AC=powersave
CPU_SCALING_GOVERNOR_ON_BAT=powersave以下兩項(xiàng)配置決定了 CPU 的能源策略,在電池模式下省電,而在外部電源供電模式下偏向性能。
CPU_ENERGY_PERF_POLICY_ON_AC=balance_performance
CPU_ENERGY_PERF_POLICY_ON_BAT=power
使用以下兩項(xiàng)配置在電池供電時(shí)禁用自動(dòng)超頻,也就是關(guān)閉睿頻。
CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0以下兩項(xiàng)配置會(huì)在電池模式下根據(jù)負(fù)載自動(dòng)縮減 CPU 核心數(shù)。 SCHED_POWERSAVE_ON_AC=0
SCHED_POWERSAVE_ON_BAT=1 AMD 與舊款 IntelAMD 與舊款 Intel 使用 acpi-cpufreq 驅(qū)動(dòng),故部分設(shè)置與 Intel 不同。這里僅僅貼出配置文件內(nèi)容,建議閱讀 TLP 官方文檔以了解配置內(nèi)容含義。
- 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 自動(dòng)掛起設(shè)備TLP 利用內(nèi)核設(shè)置,自動(dòng)將不使用的 USB 設(shè)備掛起以節(jié)電。
/etc/tlp.d/02-usb.conf 中USB_AUTOSUSPEND=1;ACPI 高級(jí)電池管理基于內(nèi)核的 natacpi 模塊,部分筆記本(如部分 ThinkPad 系列與部分 Dell)電腦可以手動(dòng)管理電池充電百分比。無(wú)需安裝額外的 ACPI 模塊。 /etc/tlp.d/03-battery.conf
- 充放電閾值
START_CHARGE_THRESH_BAT0=80
開(kāi)始充電閾值
STOP_CHARGE_THRESH_BAT0=85
停止充電閾值
- TLP服務(wù)配置
啟動(dòng)服務(wù): sudo systemctl start tlp
檢查服務(wù)狀態(tài): sudo systemctl status tlp讓 TLP
開(kāi)機(jī)自啟動(dòng): sudo systemctl enable tlp
檢查是否成功: sudo systemctl is-enabled tlp
3.4.2 LMT筆記本電源管理軟件
??Laptop Mode Tools 是一個(gè) Linux 系統(tǒng)下的筆記本電源管理軟件。它是讓內(nèi)核開(kāi)啟筆記本電腦模式功能的主要方法,能讓硬盤(pán)降速、保護(hù)硬盤(pán)等。另外,它允許你通過(guò)一個(gè)簡(jiǎn)單的配置文件調(diào)整一些其他的節(jié)能相關(guān)的設(shè)置使你的筆電更省點(diǎn)。
??與 acpid 和 CPU frequency scaling 結(jié)合使用,LMT 提供給了大多數(shù)用戶一個(gè)完整的筆記本電腦電源管理方案。有關(guān)于 Laptop Mode 的詳細(xì)情況,可以用 man 命令查看 laptop_mode 和 laptop-mode.conf,其中包含了二者的詳細(xì)參數(shù)說(shuō)明。
- laptop_mode模式有何好處呢?
laptop方面專(zhuān)家能為你解釋關(guān)于laptop方面的電路和電源管理方面的硬件設(shè)計(jì)原理。當(dāng)前只能確認(rèn)進(jìn)入 laptop_mode模式后,系統(tǒng)會(huì)根據(jù)當(dāng)前系統(tǒng)負(fù)荷和電源使用情況來(lái)為系統(tǒng)作一些調(diào)整,如調(diào)整CPU運(yùn)行頻率,CPU風(fēng)扇運(yùn)行速度,硬盤(pán)驅(qū)動(dòng)器運(yùn)行狀態(tài)(state:active/idle/standby),閉合或開(kāi)啟LCD所執(zhí)行的命今,移到辦公時(shí)切換網(wǎng)絡(luò)環(huán)境時(shí)網(wǎng)卡自適應(yīng)性(此部分功能了解 laptop_netconf工具包),和一些其它硬件的ACPI控制(比如:光驅(qū)可在不用時(shí)就處于standby狀態(tài))等,最簡(jiǎn)單的講法就是動(dòng)態(tài)使用系統(tǒng)資源,盡可能的增長(zhǎng)電池的使用時(shí)間(你可能在想你的laptop時(shí)時(shí)刻刻都在用電源適配器供電,電池只當(dāng)UPS用而已,laptop_mode對(duì)你沒(méi)什么作用,這樣想可能是你忘記啦,laptop_mode可以根據(jù)當(dāng)前系統(tǒng)負(fù)何來(lái)動(dòng)態(tài)使用系統(tǒng)資源,你不想讓你的laptop壽命更長(zhǎng)些嗎?)。
- 要使用laptop_mode的必備條件是什么?
絕對(duì)要用系統(tǒng)支持ACPI,如果你的laptop只支持APM那就不要考慮啦,當(dāng)然必不可少laptop_mode_tools工具包,然后啟動(dòng)laptop_mode模式。
- LMT電池管理軟件
驗(yàn)證筆電是否確實(shí)進(jìn)入 Laptop Mode,如果返回值為0的話,表示系統(tǒng)還未進(jìn)入 Laptop Mode,如果返回的是其他正數(shù)值則表示系統(tǒng)成功進(jìn)入 Laptop Mode。
- LMT電池管理軟件調(diào)試
,另一個(gè)在sudo laptop_mode start后鍵入sudo laptop_mode status,看看在laptop_mode可以控制那些資源,資源使用情況有何不同。
- LMT方案相關(guān)問(wèn)題
3.4.3 PowerTOP
- 什么是 PowerTOP
PowerTOP PowerTOP 是一款開(kāi)源的命令行工具,用于診斷的功耗問(wèn)題,查看系統(tǒng)中軟件應(yīng)用的活躍程度。此外,它提供了用于試驗(yàn)的各種電源管理設(shè)置的交互方式,用于診斷電量消耗和電源管理的問(wèn)題。它是由 Intel 開(kāi)發(fā)的,可以在內(nèi)核、用戶空間和硬件中啟用各種節(jié)電模式。除了作為一個(gè)一個(gè)診斷工具之外,PowweTop 還有一個(gè)交互模式,可以讓你實(shí)驗(yàn) Linux 發(fā)行版沒(méi)有啟用的各種電源管理設(shè)置。它也能監(jiān)控進(jìn)程,并展示其中哪個(gè)正在使用 CPU,以及從休眠狀態(tài)頁(yè)將其喚醒,也可以找出電量消耗特別高的應(yīng)用程序。你可以使用 PowerTOP 工具來(lái)查看沒(méi)有接入電源線時(shí)電量都用在了何處。你需要在終端中使用超級(jí)用戶權(quán)限來(lái)運(yùn)行 PowerTOP 工具。它可以訪問(wèn)該電池硬件并測(cè)量電量使用情況。
- PowerTOP電池管理軟件
??powertop工具可以顯示特定進(jìn)程與設(shè)備的耗電量。用 tab 在不同的標(biāo)簽頁(yè)中切換。不過(guò) 不要 聽(tīng)從 PowerTOP 關(guān)于省電的建議,也不要在 systemd 上啟用他—— TLP 做的比他更好。同時(shí) tlp-stat 命令也會(huì)輸出有用的信息。
3.4.4 s-tui
??s-tui 是一個(gè)用于監(jiān)控計(jì)算機(jī)的終端 UI,監(jiān)控CPU溫度、頻率、功耗的工具。s-tui 可以在終端以圖形方式監(jiān)控 CPU 溫度、頻率、功率和使用率。此外,它還顯示由發(fā)熱量限制引起的性能下降,它需要很少的資源并且不需要 X 服務(wù)器。它是用 Python 編寫(xiě)的,需要 root 權(quán)限才能使用它。s-tui 是一個(gè)獨(dú)立的程序,可以開(kāi)箱即用,并且不需要配置文件就可以使用其基本功能。s-tui 使用 psutil 來(lái)探測(cè)你的一些硬件信息。如果不支持你的一些硬件,你可能看不到所有信息。
??以 root 身份運(yùn)行 s-tui 時(shí),當(dāng)壓測(cè)所有 CPU 核心時(shí),可以將 CPU 發(fā)揮到最大睿頻頻率。它在后臺(tái)使用 Stress 壓力測(cè)試工具,通過(guò)對(duì)系統(tǒng)施加某些類(lèi)型的計(jì)算壓力來(lái)檢查其組件的溫度是否超過(guò)其可接受的范圍。只要計(jì)算機(jī)穩(wěn)定并且其組件的溫度不超過(guò)其可接受的范圍,PC 超頻就沒(méi)問(wèn)題。有幾個(gè)程序可以通過(guò)壓力測(cè)試得到系統(tǒng)的穩(wěn)定性,從而評(píng)估超頻水平。
- s-tui 管理軟件
四.實(shí)驗(yàn)驗(yàn)證 – 機(jī)器數(shù)量和檢測(cè)儀器
4.1 電腦耗電量測(cè)試 – 判斷當(dāng)前獲取的電池放電相關(guān)信息是否正確
??放電時(shí)間的公式:毫安時(shí)(mAh)乘以工作電壓(V)再除以1000換算出瓦時(shí)(Wh)
mAh*V/1000=Wh 即 mAh=Wh*1000/V??通過(guò)放電公式計(jì)算毫安時(shí)mAh,和當(dāng)前的放電電流和剩余時(shí)間換算的毫安時(shí)進(jìn)行對(duì)比,如果兩個(gè)值只有微小偏差則證明當(dāng)前獲取的電池信息正確,進(jìn)行下一步工作。
注:電池放電為模擬放電過(guò)程,各個(gè)值存在微小偏差。
??通過(guò)相關(guān)工具或者系統(tǒng)節(jié)點(diǎn)查看筆記本電池狀態(tài)和等級(jí),同時(shí)記錄放電過(guò)程中的時(shí)間、電流、電量、電壓。目前編寫(xiě)腳本能夠記錄放電電流、電量百分比、電壓的變化,充放電狀態(tài)更新概率性異常,具體的還需要分析,先要證明當(dāng)前獲取電池放電的數(shù)據(jù)是正確的,再進(jìn)行下一步工作。
- 電池電量信息需要每分鐘記錄一次
- 通過(guò) upower 命令行工具,獲取當(dāng)前的放電信息,包括工作電壓V、剩余電量Wh、剩余工作時(shí)間等
- 功耗檢測(cè)工具
/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
禁用網(wǎng)卡eth0 – sudo ifconfig eth0 down
啟用網(wǎng)卡eth0 – sudo ifconfig eth0 up
4.2 屏幕功耗
??當(dāng)屏幕關(guān)閉狀態(tài)(關(guān)閉屏幕背光 – xset dpms force off),對(duì)于主機(jī)的耗電量幾乎沒(méi)有影響,耗電量會(huì)小幅降低,但是這個(gè)數(shù)值低到可以忽略。同樣環(huán)境下,若主機(jī)休眠,猜測(cè)屏幕與主機(jī)耗電量應(yīng)該會(huì)降到幾W,稍大于關(guān)機(jī)的耗電量,具體需要硬件儀器測(cè)量。
4.3 內(nèi)核模塊
??系統(tǒng)每次休眠喚醒后需要從新加載內(nèi)核模塊,確認(rèn)那些是有用的模塊,涉及具體的硬件。內(nèi)核模塊–make menuconfig all 后編譯。重啟 通過(guò)lsmod | awk ‘{if($3>0) print $_ }’ 找出used 大于0的驅(qū)動(dòng)模塊,并認(rèn)為是有用的模塊。
4.3 TLP電源管理軟件
??使用706筆記本測(cè)試TLP電池管理工具,其默認(rèn)配置提供了開(kāi)箱即用的優(yōu)化的節(jié)能設(shè)置,目前測(cè)試待機(jī)時(shí)長(zhǎng)沒(méi)有改善,默認(rèn)配置中需要acpi對(duì)相關(guān)耗電設(shè)備進(jìn)行控制,分析缺少相關(guān)模塊,比如電源管理模塊。
– dmesg報(bào)錯(cuò)
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模式
- cpu頻率問(wèn)題
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支持調(diào)頻和不支持調(diào)頻模式下的功耗差異
??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平臺(tái),在5000機(jī)器上使用s-tui工具,功耗項(xiàng)無(wú)法使用,分析中。
??分別使用支持調(diào)頻的固件和不支持調(diào)頻的固件,powertop軟件查看功耗狀態(tài)變化走勢(shì),測(cè)試場(chǎng)景:開(kāi)機(jī)3分鐘穩(wěn)定后的powertop功耗值。
- cpu頻率
五.小結(jié)
限制與測(cè)試設(shè)備數(shù)量和檢測(cè)儀器,S3S4S5暫時(shí)無(wú)法測(cè)試,運(yùn)行時(shí)的續(xù)航時(shí)間,之前使用一臺(tái)706筆記本測(cè)試暫未發(fā)現(xiàn)改善,后續(xù)使用規(guī)定筆記本機(jī)型驗(yàn)證。
功耗續(xù)航是電池放電的過(guò)程,同時(shí)需要關(guān)注關(guān)機(jī)、開(kāi)機(jī)狀態(tài)下的快速充電。
六.參考資料
TLP:一個(gè)可以延長(zhǎng) Linux 筆記本電池壽命的高級(jí)電源管理工具
干電池放電曲線分析
Linux下Power Management開(kāi)發(fā)總結(jié)
shell中記錄運(yùn)行時(shí)間的一種方法
使用腳本記錄 macbook 電池容量
從 Linux 終端查看筆記本電池狀態(tài)和等級(jí)的 5 個(gè)方法
https://01.org/linux-acpi/documentation/overriding-dsdt
鋰電池的電量單位 mAh Wh
淺談stm8l系列單片機(jī)的低功耗機(jī)制
手工編譯linux桌面內(nèi)核(一)——內(nèi)核總體設(shè)置和性能調(diào)優(yōu)
手工編譯linux桌面內(nèi)核(二)——硬件驅(qū)動(dòng)的配置 上篇
手工編譯linux桌面內(nèi)核(二)——硬件驅(qū)動(dòng)的配置 下篇
手工編譯linux桌面內(nèi)核(三)——網(wǎng)絡(luò)的配置
手工編譯linux桌面內(nèi)核(四)——電源的配置
https://pms.uniontech.com/zentao/bug-view-91428.html
安裝acpi-call-dkms時(shí)出現(xiàn)此錯(cuò)誤
ACPI 電源管理導(dǎo)致的 CPU loadavg 負(fù)載虛高
Laptop Mode Tools (簡(jiǎn)體中文)
用 Laptop Mode Tools 配置 Linux 下的電源管理屬性
Linux電源管理
[ZZ]Ubuntu電源管理問(wèn)題的說(shuō)明和解決方案
Ubuntu的啟動(dòng)與優(yōu)化
Ubuntu硬盤(pán)優(yōu)化,降低硬盤(pán)溫度(Acer V5 親測(cè)成功 )
TLP (簡(jiǎn)體中文)
PowerTOP – Monitors power usage and improve Laptop’s battery life in Linux
Improving Battery Life in Ubuntu with TLP
芯片設(shè)計(jì)進(jìn)階之路——低功耗深入理解(一)
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頻率和工作模式的獲取設(shè)置
PCIe功耗控制–ASPM
How to enable the Radeon dynamic power management feature?
硬件工程師必看 | 功耗測(cè)試思路與步驟詳解
測(cè)量誤區(qū),你真的會(huì)測(cè)待機(jī)功耗么?
總結(jié)
以上是生活随笔為你收集整理的内核领域-功耗机型的续航基线优化问题-技术调研报告-王井玉_20211216的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python怎么编写对称图案_pytho
- 下一篇: 架构学习——原型图