Windows電源設(shè)置注釋

原則上不要修改默認(rèn)的平衡計劃和3個overlay的電源計劃類型。只有在很清楚自己在做什么的時候才修改默認(rèn)的平衡計劃和3個overlay的電源設(shè)置,盡量只修改自定義計劃。如果沒見到overlay,插電和離電下分別運(yùn)行一次Powercfg.exe /OverlaySetActive?OVERLAY_SCHEME_HIGH就有了。
overlay和電源計劃的 “電源計劃類型” 不一樣的時候就會禁用overlay,所以通用模板沒用平衡類型。

首先是頻率控制方面的,以下設(shè)置在自主模式生效的時候不會有任何作用,對應(yīng)的第一類處理器設(shè)置也一樣,還有些沒提到的設(shè)置應(yīng)該也沒有任何效果,不過那些不是很重要就不提了:
處理器性能提高閾值,處理器性能降低閾值,允許節(jié)流狀態(tài),處理器性能降低策略,處理器性能增強(qiáng)策略,處理器性能提升策略,處理器性能提升時間,處理器性能下降時間,停用已停用性能狀態(tài)的處理器性能核心

啟用自主模式后只需要用處理器能源性能首選項策略控制頻率基本就夠用了,從100開始逐漸減少到自己覺得不卡的數(shù)值為止。處理器自主活動時段填0,讓cpu自己決定。

還有別再用最大處理器狀態(tài)99%關(guān)睿頻了,正確的設(shè)置是處理器性能提升模式。處理器性能提升模式的那些反人類說明不用看,看這個表就行了。自主模式用的是CPPC behavior。
(有些機(jī)器調(diào)disabled以外的選項沒有任何區(qū)別,只有開和關(guān)有區(qū)別;銳龍的CPPC在插電下要關(guān)了睿頻才可以達(dá)到1.4GHz)


然后是這幾個跟性能檢查時間相關(guān)的設(shè)置:
處理器性能時間檢查間隔,處理器性能核心放置增加時間,處理器性能核心放置減少時間
目前用的設(shè)置參考了Windows默認(rèn)的30-90毫秒的quantum,過于頻繁的話也有可能對功耗造成負(fù)面影響,所以用Windows默認(rèn)的平衡計劃給的30毫秒算了。這幾個按需調(diào)整,可能提高一些會更省電。
按照Windows Internals的說法,桌面版Windows給線程單次使用30毫秒的cpu(服務(wù)器版是180毫秒,這個可以在虛擬內(nèi)存的上一級菜單里切換)。


處理器閑置時間檢查用了15毫秒,因為這是Windows在幾乎全部多核x86還有x64處理器的默認(rèn)計時器分辨率。
(以前有個文檔,Mobile Battery Solutions Guide for Windows Vista,說為了省電可以嘗試將處理器閑置時間檢查降低到30毫秒,實際測試?yán)锞W(wǎng)頁刷新測試?yán)?5毫秒對比30毫秒有一點點優(yōu)勢)
(其實計時器分辨率應(yīng)該是15.625毫秒,對應(yīng)的是64Hz,但是Windows不是實時系統(tǒng),沒必要糾結(jié)這0.625毫秒的區(qū)別,取整看著舒服一點)
處理器性能歷史計數(shù)可能是配合已被棄用的core parking設(shè)置的設(shè)置,具體見https://www.microsoftpressstore.com/articles/article.aspx?p=2201309&seqNum=7里面的DECREASE_FACTOR,我猜測歷史計數(shù)這個設(shè)置應(yīng)該已經(jīng)沒有作用了。
處理器忙閑度:原理見圖,就是利用c-state對有效頻率進(jìn)行pwm控制。


接下來是core parking相關(guān)的閾值設(shè)置。有必要再強(qiáng)調(diào)一下:core parking的原理是系統(tǒng)停止往核心發(fā)送負(fù)載,讓核心進(jìn)入c-state,就算不用core parking,cpu也會按照處理器閑置降級閾值&處理器閑置升級閾值的設(shè)置自動進(jìn)入c-state。所以別把core parking當(dāng)成萬能的東西。core parking這個東西會影響游戲性能,插電的時候可以關(guān)掉。
處理器性能核心放置最小核心數(shù)量:自己找個合適的數(shù),別最少只開1核,不然開彈幕的功耗會很難看。填100的話會關(guān)閉core parking。
第一類處理器的最大最小數(shù)量應(yīng)該是沒有作用,所有核心都由普通的最大最小數(shù)量控制,除非使用之前講過的方法用注冊表強(qiáng)行指定大小核順序,這樣的話第一類的最大最小才有作用。
處理器性能內(nèi)核休止并發(fā)閾值:簡單來說就是數(shù)值越高,系統(tǒng)越傾向于多核負(fù)載。填100時也會關(guān)閉core parking,所以最大應(yīng)該填99。具體作用看文檔:

處理器性能內(nèi)核休止實用工具分配 & 處理器性能內(nèi)核休止分配閾值:看名字和注冊表的原文知道,名字里都有distribution,應(yīng)該是一起的設(shè)置,由于測試中沒發(fā)現(xiàn)有顯著作用,所以還是關(guān)了算了。這個東西的文檔也非常含糊:https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/power-performance-tuning#processor-performance-core-parking-utility-distribution。
處理器性能核心放置減小策略/處理器性能核心放置增加策略:懶得糾結(jié)這兩個了,都用理想,Windows覺得該用幾個核就用幾個核。
處理器性能核心放置過度利用閾值:測試發(fā)現(xiàn)用100的視頻功耗最低,波動最小。

處理器性能內(nèi)核休止并發(fā)空間閾值:已停止放置的核心多忙的時候允許啟用新的核心。填0,盡可能保證多核負(fù)載。
smt啟動策略:第2個選項在測試中有最積極的多核負(fù)載傾向。
模塊啟動策略:測試發(fā)現(xiàn)填順序的話功耗低一點,雖然這樣做會降低小核的多核性能。
延遲敏感度提示已離開的核心/程序包的最小數(shù)量:小于處理器性能核心放置最小核心數(shù)量的時候沒有任何作用;
延遲敏感度提示處理器性能:直接填0;
處理器性能內(nèi)核休止軟停止延遲:作用仍不明確,沒有任何文檔說明

閑置降級閾值&處理器閑置升級閾值:沒什么好說的,調(diào)得越低,系統(tǒng)越傾向于讓核心進(jìn)入越省電的c-state。設(shè)置的介紹是錯的,并不是指定忙閾值,而是idleness(100%-忙閾值)。
處理器閑置閾值調(diào)整:注冊表說根據(jù)performance state調(diào)整,Windows Internals說根據(jù)promote/demote percentage調(diào)整(https://www.microsoftpressstore.com/articles/article.aspx?p=2201309&seqNum=7里的PpmScaleIdleStateValues),那有可能是根據(jù)處理器性能提高/降低閾值調(diào)整。不想管這個。
處理器空閑狀態(tài)最大值:已被棄用,自己試試看就知道了;
處理器閑置禁用:別手賤動這個;

異類線程調(diào)度策略/異類短運(yùn)行線程調(diào)度策略:這里的高性能/高效處理器指的不是大核和小核,是cpu認(rèn)為的高性能/高效核心。選高效就行了,不要糾結(jié)負(fù)載跑在大核還是小核上。
生效的異類策略:不加注冊表的時候應(yīng)該只有策略0和策略4有區(qū)別,由于Windows的負(fù)載情況過于玄學(xué),所以不想說有什么區(qū)別,用策略4就好了。加注冊表的情況之前的專欄已經(jīng)說過了,非異構(gòu)cpu模擬大小核的話非常完美,但是真的大小核還是一堆thread director玄學(xué)。

GPU 首選項策略并不是關(guān)于核顯和獨顯的,有些只有核顯的機(jī)器開了后可以觀察到gpu跑分下降。

硬盤方面的設(shè)置其實沒必要改,但是看著不爽的話還是可以改改。
在此時間后關(guān)閉硬盤 & 硬盤脈沖忽略時間:給機(jī)械硬盤用的設(shè)置,ssd不用關(guān)心。
AHCI Link Power Management - HIPM/DIPM:微軟說沒見過有ssd會給驅(qū)動使用lowest里的DEVSLP狀態(tài),但是一些文檔說一些ssd是支持的,選lowest就行了。
AHCI Link Power Management - Adaptive:給sata用的,nvme不用關(guān)心,可以填個15毫秒,idling是驅(qū)動控制的,驅(qū)動的計時器分辨率也是15毫秒。

nvme的電源狀態(tài)基本分這些:
可操作的ps0,ps1,ps2;不可操作的ps3和ps4。
根據(jù)nvme官網(wǎng)的說法,ps2的功耗大約是ps0的40%,但是延遲基本沒影響(有也是微秒級的,日常使用感知不出來)。

控制nvme硬盤使用ps0,ps1還是ps2的設(shè)置是最大電量水平,默認(rèn)的100%會讓W(xué)indows決定只要硬盤不過熱就使用ps0,改成0%應(yīng)該就可以讓硬盤始終使用ps2。具體計算方法在這:https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-nvme#active-power-management。
根據(jù)這兩個測試,大部分ssd的ps1和ps2的能耗比起ps0都大幅降低了,因為讀寫性能的下降幅度大于功耗下降的幅度,而且空載功耗幾乎不存在區(qū)別。
https://www.sohu.com/a/242637356_505795
https://www.sohu.com/a/232301481_505795
nvme硬盤切換電源狀態(tài)的順序是這樣的:
ps0/ps1/ps2
??|
primary?idle?timeout
??|
primary?tolerance(ps3或ps4)
??|
secondary?idle?timeout(可選設(shè)置)
??|
secondary?tolerance(可選設(shè)置)
也就是說primary idle timeout越小,從ps0/ps1/ps2轉(zhuǎn)換到ps3或ps4的時間越小,所以越省電。
primary?tolerance應(yīng)該用多少取決于硬盤驅(qū)動報告的進(jìn)出ps3或ps4的延遲。不需要關(guān)心這個,一方面是懶得解釋怎么讀取這個延遲,一方面是實際延遲很可能比驅(qū)動里寫的那個更久,實際延遲需要特殊硬件才能得到,具體例子看這個:http://www.ssdfans.com/?p=89713。
secondary idle timeout和secondary tolerance是可選的,只要之前的primary設(shè)置允許硬盤進(jìn)入ps4,那secondary就沒有什么意義了。

Primary & secondary NVMe Idle Timeout填15毫秒,idling是驅(qū)動控制的,驅(qū)動的計時器分辨率也是15毫秒;Primary & secondary NVMe Power State Transition Latency Tolerance隨便填很大的數(shù)字。
NVMe NOPPME:應(yīng)該是要關(guān)掉。

空閑復(fù)原(idle resiliency)的設(shè)置應(yīng)該和modern standby有關(guān),上面的表里modern standby的primary idle timeout指的應(yīng)該是IO 合并超時時間這個設(shè)置。
可能可以改改執(zhí)行要求的電源請求的超時時間,這個東西是給UWP用的,在不支持modern standby的機(jī)器上會轉(zhuǎn)為system power request(https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ne-wdm-_power_request_type?redirectedfrom=MSDN#remarks),DC填1秒就行了,0應(yīng)該是不限制。

舊 RTC 遷移:打開,避免電腦從休眠被喚醒(雖然我從來沒見過有電腦從休眠自動喚醒,不過至少有個開關(guān))
(這個肯定是人工翻譯的,因為注冊表的原文是mitigation,人工翻譯看錯成了migration才會翻譯成遷移)

一些關(guān)于modern standby的設(shè)置
待機(jī)狀態(tài)下的網(wǎng)絡(luò)連接性:已被棄用,見https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/no-subgroup-settings-allow-networking-during-standby#applies-to。替代的設(shè)置為斷開連接待機(jī)模式。
狀態(tài)感知電源操作的設(shè)置是關(guān)于睡眠期間耗電后自動休眠的,AC下沒有任何作用,如果要使用這個功能,在此時間后休眠必須是一個不為0的值,而且要打開休眠
用戶狀態(tài)預(yù)測模式:已被棄用,這個原本是系統(tǒng)學(xué)習(xí)用戶使用習(xí)慣自動休眠用的,見https://slideplayer.com/slide/12250080/72/images/25/Adaptive+Hibernate+Updates.jpg;
待機(jī)預(yù)算百分比:睡眠期間耗電多少后自動休眠;
待機(jī)預(yù)算寬限期:超過預(yù)算百分比后再等多久才休眠

中斷路由控制模式的各個選項可以用LatencyMon這個軟件觀察。不知道為什么選了任何啟動的處理器,ISR仍然只會在前3個線程上處理,可能又是和驅(qū)動有關(guān)的玄學(xué)。選處理器0(1)就能觀察到只有第1(2)個線程處理ISR。
選處理器1的話可能可以平衡第一個物理核心上2個線程的負(fù)載,這利用了一些Windows調(diào)度線程的特性,核心越少效果應(yīng)該越顯著,在核心多的cpu上也沒什么壞處。
目標(biāo)負(fù)載:具體作用不明,我也不知道為什么單位是千分之一,但是最大值可以填一萬。
目前沒有確切證據(jù)表明關(guān)于中斷的設(shè)置會顯著影響功耗。

電源計劃類型改成節(jié)能/高性能的時候會禁用overlay,避免overlay覆蓋電源計劃的設(shè)置。有個玄學(xué),即使處理器設(shè)置完全一樣,高性能和平衡類型的功耗大于節(jié)能類型。

如果發(fā)現(xiàn)設(shè)置莫名其妙地還原回去了,這是某些東西還原了電源計劃,解決方法:
管理員權(quán)限打開PSE,雙擊一個設(shè)置,這樣會打開這個設(shè)置儲存默認(rèn)值的注冊表路徑。
從左邊的路徑進(jìn)去DefaultPowerSchemeValues,381是平衡,8c5是高性能,a18是節(jié)能。
修改里面的ac/dc index,最后到控制面板還原電源計劃,此時用來還原的值就是手動修改的值。