Windows电源设置注释

原则上不要修改默认的平衡计划和3个overlay的电源计划类型。只有在很清楚自己在做什么的时候才修改默认的平衡计划和3个overlay的电源设置,尽量只修改自定义计划。如果没见到overlay,插电和离电下分别运行一次Powercfg.exe /OverlaySetActive OVERLAY_SCHEME_HIGH就有了。
overlay和电源计划的 “电源计划类型” 不一样的时候就会禁用overlay,所以通用模板没用平衡类型。

首先是频率控制方面的,以下设置在自主模式生效的时候不会有任何作用,对应的第一类处理器设置也一样,还有些没提到的设置应该也没有任何效果,不过那些不是很重要就不提了:
处理器性能提高阈值,处理器性能降低阈值,允许节流状态,处理器性能降低策略,处理器性能增强策略,处理器性能提升策略,处理器性能提升时间,处理器性能下降时间,停用已停用性能状态的处理器性能核心

启用自主模式后只需要用处理器能源性能首选项策略控制频率基本就够用了,从100开始逐渐减少到自己觉得不卡的数值为止。处理器自主活动时段填0,让cpu自己决定。

还有别再用最大处理器状态99%关睿频了,正确的设置是处理器性能提升模式。处理器性能提升模式的那些反人类说明不用看,看这个表就行了。自主模式用的是CPPC behavior。
(有些机器调disabled以外的选项没有任何区别,只有开和关有区别;锐龙的CPPC在插电下要关了睿频才可以达到1.4GHz)


然后是这几个跟性能检查时间相关的设置:
处理器性能时间检查间隔,处理器性能核心放置增加时间,处理器性能核心放置减少时间
目前用的设置参考了Windows默认的30-90毫秒的quantum,过于频繁的话也有可能对功耗造成负面影响,所以用Windows默认的平衡计划给的30毫秒算了。这几个按需调整,可能提高一些会更省电。
按照Windows Internals的说法,桌面版Windows给线程单次使用30毫秒的cpu(服务器版是180毫秒,这个可以在虚拟内存的上一级菜单里切换)。


处理器闲置时间检查用了15毫秒,因为这是Windows在几乎全部多核x86还有x64处理器的默认计时器分辨率。
(以前有个文档,Mobile Battery Solutions Guide for Windows Vista,说为了省电可以尝试将处理器闲置时间检查降低到30毫秒,实际测试里网页刷新测试里15毫秒对比30毫秒有一点点优势)
(其实计时器分辨率应该是15.625毫秒,对应的是64Hz,但是Windows不是实时系统,没必要纠结这0.625毫秒的区别,取整看着舒服一点)
处理器性能历史计数可能是配合已被弃用的core parking设置的设置,具体见https://www.microsoftpressstore.com/articles/article.aspx?p=2201309&seqNum=7里面的DECREASE_FACTOR,我猜测历史计数这个设置应该已经没有作用了。
处理器忙闲度:原理见图,就是利用c-state对有效频率进行pwm控制。


接下来是core parking相关的阈值设置。有必要再强调一下:core parking的原理是系统停止往核心发送负载,让核心进入c-state,就算不用core parking,cpu也会按照处理器闲置降级阈值&处理器闲置升级阈值的设置自动进入c-state。所以别把core parking当成万能的东西。core parking这个东西会影响游戏性能,插电的时候可以关掉。
处理器性能核心放置最小核心数量:自己找个合适的数,别最少只开1核,不然开弹幕的功耗会很难看。填100的话会关闭core parking。
第一类处理器的最大最小数量应该是没有作用,所有核心都由普通的最大最小数量控制,除非使用之前讲过的方法用注册表强行指定大小核顺序,这样的话第一类的最大最小才有作用。
处理器性能内核休止并发阈值:简单来说就是数值越高,系统越倾向于多核负载。填100时也会关闭core parking,所以最大应该填99。具体作用看文档:

处理器性能内核休止实用工具分配 & 处理器性能内核休止分配阈值:看名字和注册表的原文知道,名字里都有distribution,应该是一起的设置,由于测试中没发现有显著作用,所以还是关了算了。这个东西的文档也非常含糊:https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/power-performance-tuning#processor-performance-core-parking-utility-distribution。
处理器性能核心放置减小策略/处理器性能核心放置增加策略:懒得纠结这两个了,都用理想,Windows觉得该用几个核就用几个核。
处理器性能核心放置过度利用阈值:测试发现用100的视频功耗最低,波动最小。

处理器性能内核休止并发空间阈值:已停止放置的核心多忙的时候允许启用新的核心。填0,尽可能保证多核负载。
smt启动策略:第2个选项在测试中有最积极的多核负载倾向。
模块启动策略:测试发现填顺序的话功耗低一点,虽然这样做会降低小核的多核性能。
延迟敏感度提示已离开的核心/程序包的最小数量:小于处理器性能核心放置最小核心数量的时候没有任何作用;
延迟敏感度提示处理器性能:直接填0;
处理器性能内核休止软停止延迟:作用仍不明确,没有任何文档说明

闲置降级阈值&处理器闲置升级阈值:没什么好说的,调得越低,系统越倾向于让核心进入越省电的c-state。设置的介绍是错的,并不是指定忙阈值,而是idleness(100%-忙阈值)。
处理器闲置阈值调整:注册表说根据performance state调整,Windows Internals说根据promote/demote percentage调整(https://www.microsoftpressstore.com/articles/article.aspx?p=2201309&seqNum=7里的PpmScaleIdleStateValues),那有可能是根据处理器性能提高/降低阈值调整。不想管这个。
处理器空闲状态最大值:已被弃用,自己试试看就知道了;
处理器闲置禁用:别手贱动这个;

异类线程调度策略/异类短运行线程调度策略:这里的高性能/高效处理器指的不是大核和小核,是cpu认为的高性能/高效核心。选高效就行了,不要纠结负载跑在大核还是小核上。
生效的异类策略:不加注册表的时候应该只有策略0和策略4有区别,由于Windows的负载情况过于玄学,所以不想说有什么区别,用策略4就好了。加注册表的情况之前的专栏已经说过了,非异构cpu模拟大小核的话非常完美,但是真的大小核还是一堆thread director玄学。

GPU 首选项策略并不是关于核显和独显的,有些只有核显的机器开了后可以观察到gpu跑分下降。

硬盘方面的设置其实没必要改,但是看着不爽的话还是可以改改。
在此时间后关闭硬盘 & 硬盘脉冲忽略时间:给机械硬盘用的设置,ssd不用关心。
AHCI Link Power Management - HIPM/DIPM:微软说没见过有ssd会给驱动使用lowest里的DEVSLP状态,但是一些文档说一些ssd是支持的,选lowest就行了。
AHCI Link Power Management - Adaptive:给sata用的,nvme不用关心,可以填个15毫秒,idling是驱动控制的,驱动的计时器分辨率也是15毫秒。

nvme的电源状态基本分这些:
可操作的ps0,ps1,ps2;不可操作的ps3和ps4。
根据nvme官网的说法,ps2的功耗大约是ps0的40%,但是延迟基本没影响(有也是微秒级的,日常使用感知不出来)。

控制nvme硬盘使用ps0,ps1还是ps2的设置是最大电量水平,默认的100%会让Windows决定只要硬盘不过热就使用ps0,改成0%应该就可以让硬盘始终使用ps2。具体计算方法在这:https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-nvme#active-power-management。
根据这两个测试,大部分ssd的ps1和ps2的能耗比起ps0都大幅降低了,因为读写性能的下降幅度大于功耗下降的幅度,而且空载功耗几乎不存在区别。
https://www.sohu.com/a/242637356_505795
https://www.sohu.com/a/232301481_505795
nvme硬盘切换电源状态的顺序是这样的:
ps0/ps1/ps2
|
primary idle timeout
|
primary tolerance(ps3或ps4)
|
secondary idle timeout(可选设置)
|
secondary tolerance(可选设置)
也就是说primary idle timeout越小,从ps0/ps1/ps2转换到ps3或ps4的时间越小,所以越省电。
primary tolerance应该用多少取决于硬盘驱动报告的进出ps3或ps4的延迟。不需要关心这个,一方面是懒得解释怎么读取这个延迟,一方面是实际延迟很可能比驱动里写的那个更久,实际延迟需要特殊硬件才能得到,具体例子看这个:http://www.ssdfans.com/?p=89713。
secondary idle timeout和secondary tolerance是可选的,只要之前的primary设置允许硬盘进入ps4,那secondary就没有什么意义了。

Primary & secondary NVMe Idle Timeout填15毫秒,idling是驱动控制的,驱动的计时器分辨率也是15毫秒;Primary & secondary NVMe Power State Transition Latency Tolerance随便填很大的数字。
NVMe NOPPME:应该是要关掉。

空闲复原(idle resiliency)的设置应该和modern standby有关,上面的表里modern standby的primary idle timeout指的应该是IO 合并超时时间这个设置。
可能可以改改执行要求的电源请求的超时时间,这个东西是给UWP用的,在不支持modern standby的机器上会转为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应该是不限制。

旧 RTC 迁移:打开,避免电脑从休眠被唤醒(虽然我从来没见过有电脑从休眠自动唤醒,不过至少有个开关)
(这个肯定是人工翻译的,因为注册表的原文是mitigation,人工翻译看错成了migration才会翻译成迁移)

一些关于modern standby的设置
待机状态下的网络连接性:已被弃用,见https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/no-subgroup-settings-allow-networking-during-standby#applies-to。替代的设置为断开连接待机模式。
状态感知电源操作的设置是关于睡眠期间耗电后自动休眠的,AC下没有任何作用,如果要使用这个功能,在此时间后休眠必须是一个不为0的值,而且要打开休眠
用户状态预测模式:已被弃用,这个原本是系统学习用户使用习惯自动休眠用的,见https://slideplayer.com/slide/12250080/72/images/25/Adaptive+Hibernate+Updates.jpg;
待机预算百分比:睡眠期间耗电多少后自动休眠;
待机预算宽限期:超过预算百分比后再等多久才休眠

中断路由控制模式的各个选项可以用LatencyMon这个软件观察。不知道为什么选了任何启动的处理器,ISR仍然只会在前3个线程上处理,可能又是和驱动有关的玄学。选处理器0(1)就能观察到只有第1(2)个线程处理ISR。
选处理器1的话可能可以平衡第一个物理核心上2个线程的负载,这利用了一些Windows调度线程的特性,核心越少效果应该越显著,在核心多的cpu上也没什么坏处。
目标负载:具体作用不明,我也不知道为什么单位是千分之一,但是最大值可以填一万。
目前没有确切证据表明关于中断的设置会显著影响功耗。

电源计划类型改成节能/高性能的时候会禁用overlay,避免overlay覆盖电源计划的设置。有个玄学,即使处理器设置完全一样,高性能和平衡类型的功耗大于节能类型。

如果发现设置莫名其妙地还原回去了,这是某些东西还原了电源计划,解决方法:
管理员权限打开PSE,双击一个设置,这样会打开这个设置储存默认值的注册表路径。
从左边的路径进去DefaultPowerSchemeValues,381是平衡,8c5是高性能,a18是节能。
修改里面的ac/dc index,最后到控制面板还原电源计划,此时用来还原的值就是手动修改的值。