粉丝:1888文章:52
关注
notion image
原则上不要修改默认的平衡计划和3个overlay的电源计划类型。只有在很清楚自己在做什么的时候才修改默认的平衡计划和3个overlay的电源设置,尽量只修改自定义计划。如果没在PSE里见到overlay,插电和离电下分别运行
Powercfg /OverlaySetActive OVERLAY_SCHEME_MAX 就有了。
overlay和电源计划的 “电源计划类型” 不一样的时候就会禁用overlay,通用模板为了方便部署所以没用平衡类型。
overlay还可以分别在AC和DC下运行
Powercfg /OverlaySetActive OVERLAY_SCHEME_NONE 禁用
注册表里这个路径可以确认AC和DC下最近使用的overlay是哪个:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\User\PowerSchemes
(AC和DC其中一个全是0的话,Power Settings Explorer就不会展示overlay的设置,所以最好同时禁用,而不是只在AC或DC下禁用)
powercfg /qh overlay_scheme_min powercfg /qh overlay_scheme_max powercfg /qh overlay_scheme_high 就能知道overlay里写入的设置,这些设置会覆盖电源计划里的设置。(如果overlay里没有写入某个设置,Power Settings Explorer会回落到展示电源计划的设置)
overlay是这个东西,生效时会部分覆盖电源计划的设置:
启用了modern standby的电脑,原则上不可以使用平衡以外的两种电源计划类型,实际上可以用,但是设置完成后不要切换电源计划,不然这个计划会消失,要重新设置。
https://learn.microsoft.com/en-us/windows/win32/power/power-policy-settings
使用PPKG部署更多设置的话必须使用平衡类型。
首先是频率控制方面的,以下设置在自主模式启用的时候不会有任何作用(适用于:英特尔酷睿6代及之后的CPU,并且启用了speedshift;AMD锐龙桌面端3000系及之后,锐龙移动端5000系及之后),对应的第一类处理器设置也一样:
处理器性能提高阈值,处理器性能降低阈值,处理器性能降低策略,处理器性能增强策略,处理器性能提升策略,处理器性能提升时间,处理器性能下降时间,停用已停用性能状态的处理器性能核心,延迟敏感度提示处理器性能
https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/processor-power-management-tuning#customized-tuning-suggestions
第一类处理器指的是大核,默认的第0类处理器是小核,以后还有更多核心种类的话,数字越小的核心相对更节能:
https://learn.microsoft.com/en-us/dotnet/api/microsoft.windows.eventtracing.power.iprocessorparkingconfiguration.maxefficiencyclass1unparkedprocessor?view=trace-processor-dotnet-1.0#remarks
启用自主模式后只需要用处理器能源性能首选项策略控制频率基本就够用了,从100开始逐渐减少到自己觉得不卡的数值为止。处理器自主活动时段填0,让CPU自己决定。
https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/08_Processor_Configuration_and_Control/declaring-processors.html#autonomous-activity-window-register
Intel® 64 and IA-32 Architectures Software Developer's Manual Vol. 3B 15-18~19
(出于不明原因,虽然英特尔的文档说了推荐填0,但是Windows一直是填30毫秒,有证据表明使用酷睿的Mac默认填的是0:https://www.tonymacx86.com/threads/skylake-hwp-enable.214915/#post-1441549)
自主模式,HWP和CPPC v2根据文档的描述是同一个东西,启用后系统不需要计算运行所需的性能,而是交给CPU处理:
https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/options-for-perf-state-engine-perfautonomousmode#values
任何情况下都不应该关闭自主模式,因为硬件控制性能就是比系统控制性能更快更精准。
https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/power-performance-tuning#intel-hardware-controlled-p-states-hwp
开和不开在响应速度这方面是云泥之别,移动端锐龙在5000系之前的所谓响应性能差也有这一原因。
https://www.anandtech.com/show/10959/intel-launches-7th-generation-kaby-lake-i7-7700k-i5-7600k-i3-7350k/3
还有别再用最大处理器状态99%关睿频了,正确的设置是处理器性能提升模式。处理器性能提升模式的那些反人类说明不用看,看这个表就行了。自主模式用的是CPPC behavior。
(有些CPU调disabled以外的选项没有任何区别,只有开和关有区别)
https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/power-performance-tuning#processor-performance-boost-mode
这是英特尔对性能提升模式中 “保证频率” 的说明,我认为从使用体验上来说不太需要在意这些区别:
Intel® 64 and IA-32 Architectures Software Developer's Manual Vol. 3B 15-8
似乎有证据表明高性能和高效率的区别只在于最高频率:
https://ertuil.github.io/post/tech/windows-powerplan/
允许节流状态:开启后可以降低最低频率,在部分cpu上测得英特尔的自动为启用,amd的自动为关闭,并且在一个7840h的机器上测得开启并限制频率后电压和空载功耗都上升,原因不明。
最小处理器状态&最大处理器状态:有魔霸用户反馈使用5/99/100这3个以外的数值会出现原因不明的死机。
然后是这几个跟检查时间相关的设置:
需要一些前置知识,Windows Internals说桌面版Windows给线程单次使用15*2=30毫秒的CPU(服务器版是15*12=180毫秒,这个可以在虚拟内存的上一级菜单里切换)。
Windows Internals 7th Part 1 p231
上图里选程序的话,前台进程自动得到90毫秒的quantum:
Windows Internals 7th Part 1 p236
以前有个文档,Mobile Battery Solutions Guide for Windows Vista,说为了省电可以尝试将处理器闲置时间检查降低到30毫秒,这样会更积极地进入较低的C-states,另一份文档Processor Power Management in Windows 7 and Windows Server 2008 R2说这个设置是指定每次评估之间的时间。
(Windows Vista可以给ACPI C1~C3分别设置升降级阈值和检查时间间隔,到了Windows 7就简化成一组设置了)
Mobile Battery Solutions Guide for Windows Vista
Processor Power Management in Windows 7 and Windows Server 2008 R2
处理器闲置时间检查:先从这个开始,假设在理想状态下一个线程能够完整地运行30毫秒,那么在这30毫秒内检查C-states升降是没意义的,所以选择用30毫秒,在极低的闲置升降级阈值下,这个时间间隔应该会失去作用:
(就算核心没赶上,系统的thread scheduler也会在核心没有运行任何线程的时候让核心进入C-states)
Windows Internals 7th Part 1 p263
处理器性能时间检查间隔:接下来是这个,每隔这么久时间,系统就会执行这些东西:
Windows Internals 6th Part 2 p117
注意到其中有一个叫做PpmCheckRecordAllUtility的步骤,猜测前文提到的闲置检查用到的上升下降阈值就来自于此,由此可以推断出闲置时间检查小于性能时间检查的话没有意义:
https://www.microsoftpressstore.com/articles/article.aspx?p=2201309&seqNum=7
处理器性能时间检查间隔也选择用30毫秒,更短的话没有必要,因为在启用了自主模式的CPU上,这个东西不负责控制频率,只有控制C-states升降还有core parking的用处,而这两者用30毫秒就够了;
(前面的图里已经提到了,处理器性能时间检查间隔最小是到15毫秒,也就是一个clock interval)
处理器性能核心放置增加时间:假设在理想状态下,一个线程正在排队等着用CPU,那么它最多可以等30毫秒,要么30毫秒后前面的线程用完CPU了,要么30毫秒后系统决定启用更多核心,而且性能时间检查间隔都是30毫秒了,核心增加时间就不能更短;
处理器性能核心放置减少时间:假设在理想状态下,有得到90毫秒的线程正在运行,那么在这90毫秒内检查能不能减少核心没有意义。
处理器性能历史计数可能是配合已被弃用的core parking设置的设置,具体见https://www.microsoftpressstore.com/articles/article.aspx?p=2201309&seqNum=7里面的DECREASE_FACTOR。首先处理器性能历史计数会积累一些数据,然后不同的decrease factor会异步地修改这些因素在core parking中的权重。猜测历史计数这个设置应该已经没有作用了。
处理器忙闲度:原理见图,就是利用C-states对有效频率进行PWM控制。只有英特尔在酷睿6代以及之后的CPU才有用。
https://www.anandtech.com/show/9582/intel-skylake-mobile-desktop-launch-architecture-analysis/7
接下来是core parking相关的阈值设置。有必要再强调一下:core parking的原理是系统停止往核心发送负载,让核心进入C-states。
https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/power-performance-tuning#processor-performance-core-parking-maximum-and-minimum-cores
https://learn.microsoft.com/en-us/troubleshoot/windows-server/deployment/default-core-parking-behavior-changes#more-information
Core parking只是影响了系统调度线程的行为,并不保证能省电。
Core parking只是影响了系统调度线程的行为,并不保证能省电。
Core parking只是影响了系统调度线程的行为,并不保证能省电。
所以别把core parking当成万能的东西。core parking这个东西会影响游戏性能,插电的时候可以关掉。
处理器性能核心放置最小核心数量:自己找个合适的数,别最少只开1核,不然开弹幕的功耗会很难看,因为多核负载可以提高能耗比。填100会关闭core parking。建议最少不要少于4个CPU线程,因为Windows会在最多4个CPU线程之间共享任务队列,少于4线程的话就太浪费多核性能了。
Windows Internals 7th Part 1 p229
英特尔的CPU调第一类处理器的最大最小数量应该是没有作用,所有核心都由普通的最大最小数量控制,除非使用之前讲过的方法用注册表强行指定大小核顺序,这样的话第一类的最大最小才有作用。
处理器性能内核休止并发阈值:简单来说就是数值越高,系统越倾向于多核负载。填100也会关闭core parking,所以最大应该填99。具体作用看文档:
https://learn.microsoft.com/en-us/dotnet/api/microsoft.windows.eventtracing.power.iprocessorparkingconfiguration.concurrencythreshold?view=trace-processor-dotnet-1.0#remarks
处理器性能内核休止实用工具分配 & 处理器性能内核休止分配阈值:看名字知道它们是一起的设置,由于测试中没发现有显著作用,所以还是关了算了。这个东西的文档也非常含糊:
https://learn.microsoft.com/en-us/windows-server/administration/performance-tuning/hardware/power/power-performance-tuning#processor-performance-core-parking-utility-distribution
处理器性能核心放置减小策略/处理器性能核心放置增加策略:懒得纠结这两个了,都用理想,Windows觉得该用几个核就用几个核。
处理器性能核心放置过度利用阈值:测试发现用100的视频功耗较低,波动较小。这个不太重要。WIndows选择park一个核心的时候,绑定了核心的线程仍然可以使用这个核心,所以Windows会有这个过度利用阈值来让这种核心unpark,允许其他没绑定核心的线程使用。使用100%的原因是在该核心的利用率达到100%前,绑定该核心的线程可以独占该核心。但是Windows比较阈值是大于而不是大于等于,100%是不能被超过的,所以最大值也理应是99%。
https://learn.microsoft.com/en-us/dotnet/api/microsoft.windows.eventtracing.power.iprocessorparkingconfiguration.overutilizationthreshold?view=trace-processor-dotnet-1.0#remarks
处理器性能内核休止并发空间阈值:已停止放置的核心多忙的时候允许启用新的核心。填0,尽可能保证多核负载。
https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/options-for-core-parking-cpheadroom
注意这3个core parking的设置不适用于大小核的大核:处理器性能内核休止并发阈值,处理器性能内核休止分配阈值,处理器性能内核休止并发空间阈值
https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/static-configuration-options-for-heterogeneous-power-scheduling
SMT启动策略:第2个选项在测试中有最积极的多核负载倾向,但是实际作用不太明确。
模块启动策略:测试发现填顺序的话功耗低一点,虽然这样做可能会降低小核的多核性能,因为4个小核共享了L2会发生阻塞。
处理器性能内核休止软停止延迟:作用仍不明确,没有任何文档说明;
第 1 (2)类处理器电源效率处理器计数会提高的处理器性能级别提升(降低)阈值:已经知道怎么用了,用法比较特殊,可能需要单独拿出来讲。
延迟敏感度提示已离开的核心/程序包的最小数量:小于处理器性能核心放置最小核心数量的时候没有任何作用,直接填0;
延迟敏感度提示处理器性能:直接填0;
latency sensitivity hint包含了鼠标放开按键,触控手势和键盘输入。性能填0就是系统在提升频率的时候不考虑 latency sensitivity hint:
(没什么用,因为在有自主模式的CPU上,系统并不控制频率)
https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/options-for-perf-state-engine-perflatencyhint
关于latency sensitivity hint的更多信息见这个资料:
https://djdallmann.github.io/GamingPCSetup/CONTENT/RESEARCH/WINSERVICES/
尽管这个资料说CSRSS会根据用户输入一直产生latency sensitive hint,但是测试中从来没发现过相关设置可以unpark更多核心:
https://djdallmann.github.io/GamingPCSetup/CONTENT/RESEARCH/WINSERVICES/
Windows存在一个叫做deadline的QoS level仅使用延迟敏感度提示处理器性能:
https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/configure-processor-power-management-options#quality-of-service
这个QoS level仅针对注册了MMCSS的程序:
Windows Internals 7th Part 1 p254
处理器闲置降级阈值&处理器闲置升级阈值:调得越低,系统越倾向于让核心进入C-states。设置的介绍是错的,并不是指定忙阈值,而是idleness(100%-忙阈值,前面的PpmCheckRecordAllUtility也是idleness而不是busyness)。
Processor Power Management in Windows 7 and Windows Server 2008 R2
从Vista的文档可知所谓的idleness其实是perfmon里读取的ACPI C1/C2/C3时间,从实验中发现将闲置升降级阈值降低后,perfmon显示C1和C2的时间为0,只有C3被使用,那就是说控制ACPI C1/C2/C3之间转换的处理器闲置时间检查应该失去作用:
Processor Power Management in Windows Vista and Windows Server 2008
处理器闲置阈值调整:根据文档的说法,这个东西应该是自动给处理器闲置升降级阈值自动乘以当前P-state相对于基础频率的百分比,以此实现低频下降低闲置升降级阈值,高频下提升闲置升降级阈值
(如果闲置升降级阈值都填0的话,感觉这个设置就没用了)
Processor Power Management in Windows Vista and Windows Server 2008
处理器空闲状态最大值:这个设置在2018年的某次更新后被废除,见https://social.msdn.microsoft.com/forums/windowshardware/en-US/39534389-a249-444d-9791-5d39bf68a2e5/disabling-cpu-idle-cstates-lowers-cpu-clock-frequency,现在没有任何作用,默认的0原本是不限制最低C-states,不知道为什么允许的最大值是20,下面这个文档说最大是14,然而现实中应该没有x86的CPU设计了低于C10的C-state;
https://devblogs.microsoft.com/sustainable-software/tuning-servers-for-energy-savings/
处理器闲置禁用:别手贱动这个,关了并不会提高性能,因为CPU怕过热,所以关了的话CPU会主动限制睿频,而且会导致任务管理器里显示CPU占用率100%。
C-states分ACPI C-states和hardware C-states,ACPI的是抽象概念,只有C0~C3,hardware的是CPU实际用的,芯片厂商和BIOS可以将不同的hardware C-states对应到ACPI C-states:
https://01.org/sites/default/files/page/powertop_users_guide_201406.pdf
AMD这个PPT就是一个例子,将hardware C-states对应到系统认的ACPI C-states:
https://www.anandtech.com/show/15624/amd-details-renoir-the-ryzen-mobile-4000-series-7nm-apu-uncovered/3
CPU也可以选择不对系统暴露更低的C-states,这时候CPU就会自行决定这些C-states的升降(如上图所示,数字越大就越低,越小就越高)(如上图所示,移动端锐龙从4000系开始可以动态地向系统暴露可用的C-states):
https://learn.microsoft.com/en-us/previous-versions/windows/desktop/xperf/p-states-and-c-states
CPU进出C-states需要的时间可以参考以下数据,锐龙移动端从初代开始,单个核心进出C6的时间是100微秒,package进出C6的时间是1.5毫秒:
https://www.anandtech.com/show/11964/ryzen-mobile-is-launched-amd-apus-for-laptops-with-vega-and-updated-zen/4
英特尔这边只找到了Xeon E3–1200 v5(Skylake架构)在Linux下的驱动报告的数据,比Zen架构差挺多:
https://metebalci.com/blog/a-minimum-complete-tutorial-of-cpu-power-management-c-states-and-p-states/
package C-states取决于最高的core C-states:
https://en.wikichip.org/wiki/acpi/c-states
异类线程调度策略 & 异类短运行线程调度策略:这里的高性能/高效处理器对英特尔的CPU来说指的不是大核和小核,是CPU认为的高性能/高效核心。选高效就行了,不要纠结负载跑在大核还是小核上。
生效的异类策略:不加注册表的时候应该只有策略0和策略4有区别,由于Windows的负载情况过于玄学,所以不想说有什么区别,用策略4就好了。加注册表的情况之前的专栏已经说过了,非异构CPU模拟大小核的话非常完美,但是真的大小核还是一堆thread director的玄学。
策略0和4的区别(策略123在英特尔的CPU上没有观察到明显区别,在模拟大小核上可以观察到明显区别):
https://www.intel.com/content/dam/develop/external/us/en/documents-tps/348851-optimizing-x86-hybrid-cpus.pdf
https://www.intel.com/content/dam/develop/external/us/en/documents-tps/348851-optimizing-x86-hybrid-cpus.pdf
从 “Windows 10 科学计算 CPU大小核调度策略试验与设置建议” 里面的测试结果来看,策略4相比策略0似乎具备某种感知缓存或者能耗比的能力:
https://zhuanlan.zhihu.com/p/660344272
短(长)时间运行线程的处理器体系结构上(下)限:不管在模拟大小核还是真机大小核都没发现明显作用;
英特尔的异构调度是这么工作的:
首先英特尔定义了4种类型的负载,两种是AVX相关的先别管,第0类是常规负载,第3类是瓶颈不在CPU上的负载(比如硬盘读写),英特尔的想法是让IPC高的大核专注于计算,瓶颈不在计算能力的负载就让小核去做;
https://www.anandtech.com/show/16959/intel-innovation-alder-lake-november-4th/3
然后thread director有个表,会动态更新每个核心应对不同负载时的performance capacity和efficiency capacity,系统要求使用高性能/高效核心的时候,thread director就会根据这个表把高性能/高效的核心提供给系统进行调度,所以说大核可以是高效核心,小核可以是高性能核心;
https://www.intel.com/content/www/us/en/developer/articles/guide/12th-gen-intel-core-processor-gamedev-guide.html
这些因素会间接地影响thread director的表,最后一项频率电压功耗限制应该是最重要的因素:
Intel® 64 and IA-32 Architectures Software Developer's Manual Vol. 3B 15-33
有证据表明异类线程调度策略对一些锐龙CPU也有用(需要在BIOS里开启CPPC preferred core):
https://www.techpowerup.com/review/1usmus-custom-power-plan-for-ryzen-3000-zen-2-processors/2.html
GPU 首选项策略并不是关于核显和独显的,有些只有核显的机器开了后可以观察到gpu跑分下降。实际原理不明,有可能应该是控制图形性能首选项的全局设置。
硬盘方面的设置其实没必要改,但是看着不爽的话还是可以改改。
在此时间后关闭硬盘 & 硬盘脉冲忽略时间:给机械硬盘用的设置,ssd不用关心。
AHCI Link Power Management - HIPM/DIPM:微软说没见过有接PCIe的AHCI SSD会给驱动使用lowest里的DEVSLP状态,选lowest就行了。HIPM/DIPM/DEVSLP之间的关系看文档,有证据表明选lowest确实比默认的HIPM-only更省电,HIPM-only可能会阻止CPU进入更低的C-states:https://www.tenforums.com/tutorials/72971-add-ahci-link-power-management-power-options-windows.html#post1338800
https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-sata
NVMe的电源状态基本分这些:
可操作的ps0,ps1,ps2;不可操作的ps3和ps4。
根据NVMe官网的说法,ps2的功耗大约是ps0的40%,但是延迟基本没影响(有也是微秒级的,日常使用感知不出来)。
https://nvmexpress.org/resources/nvm-express-technology-features/nvme-technology-power-features/
最大电量水平:控制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的延迟,可以用gsmartcontrol这个工具读取,注意单位是微秒,电源设置用的是毫秒。但是有可能实际延迟很可能比驱动里写的那个更久,并且实际延迟需要特殊硬件才能得到,具体例子看这个:http://www.ssdfans.com/?p=89713。
secondary idle timeout和secondary tolerance是可选的,只要之前的primary设置允许硬盘进入ps4,那secondary就没有什么意义了。其实ps3和ps4的功耗大概也就差小数点后2位的水平。
https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-nvme#runtime-device-power-management
Primary & secondary NVMe Power State Transition Latency Tolerance最好小于等于idle timeout,测试中发现如果tolerance很高的话会更加频繁地出现更高的硬盘利用率。
NVMe NOPPME:NVMe硬盘是否可以在ps3和ps4的时候使用更多的功耗完执行后台操作,仅适用于NVMe 1.3及之后的硬盘,应该是要关掉。
https://nvmexpress.org/wp-content/uploads/NVM-Express-1_3b-2018.05.04-ratified.pdf
AHCI Link Power Management - Adaptive
Primary & secondary NVMe Idle Timeout:
虽然AHCI和NVMe不是一个东西,但是一起讨论。这些数肯定是越小越省电,但是下限能填多少毫秒又是需要根据文档推测。
https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-sata
https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/power-management-for-storage-hardware-devices-nvme
根据常识推断,这几个切换状态之前的等待时间肯定需要一个计时器,那么只要知道驱动的计时器的最短过期时间就行了。
Windows的clock interval是15.625毫秒(64Hz),
Windows Internals 7th Part 2 p66
但是Windows不是实时系统,计时器最多可以晚一个clock interval才过期,
https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/timer-accuracy
从Windows Internals的这段表述可以知道,从Windows 10开始,所有驱动和应用的计时器过期都安排在28毫秒的倍数上,并非大约15毫秒。
Windows Internals 7th Part 2 p70
所以这些设置都填30毫秒算了,反正Windows不是实时系统,多给2毫秒没什么区别。
空闲复原(idle resiliency)的设置和modern standby有关,前面的表里modern standby的primary idle timeout指的可能是IO 合并超时时间这个设置。
可能可以改改执行要求的电源请求的超时时间,这个东西是给UWP用的,在不支持modern standby的机器上会转为system power request(https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-powersetrequest#parameters),填1秒就行了,0应该是不限制。
调这个没什么用,除了在S3睡眠的离开模式之外,其他power request在用户手动睡眠的时候会被终止。
https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ne-wdm-_power_request_type#remarks
https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-states?source=recommendations#summary-of-key-points
旧 RTC 迁移:打开,避免电脑从休眠中被RTC (real-time clock) 唤醒(虽然从来没见过有电脑从休眠自动唤醒,不过至少有个开关)
(这个肯定是人工翻译的,因为注册表的原文是mitigation,人工翻译看错成了migration才会翻译成迁移)
一些关于modern standby的设置
待机状态下的网络连接性:已被弃用,见https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/no-subgroup-settings-allow-networking-during-standby#applies-to。(powercfg /a返回的信息仍然是依照这个被弃用的设置,当然被弃用的设置理论上仍然可以有作用)
断开连接待机模式:不明确是否为前者的替代设置,没有任何文档说明。根据下面这个文档的说明,Windows 10 2004开始引入了自适应联网睡眠,远程桌面和UWP后台运行这两种事件会让系统在睡眠时联网,猜测该设置的正常和主动两个选项可能是针对UWP联网的。
https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-network-connectivity#adaptive-connected-standby
(反正这两个都关掉就好了)
状态感知电源操作的设置是关于睡眠期间耗电后自动休眠的,AC下没有任何作用,如果要使用这个功能,要打开休眠,并且在此时间后休眠必须是一个不为0的值
用户状态预测模式:2017年的时候被移除,这个原本是系统学习用户使用习惯自动休眠用的:
https://slideplayer.com/slide/12250080/
待机预算百分比:睡眠期间耗电多少后自动休眠;
待机预算宽限期:超过预算百分比后再等多久才休眠,直接填1秒,填0秒应该是禁用设置。
中断路由控制模式的各个选项可以用LatencyMon这个软件观察。不知道为什么选了任何启动的处理器,ISR仍然只会在前3个线程上处理,可能又是和驱动有关的玄学。选处理器0(1)就能观察到只有第0(1)个线程处理ISR。
选处理器1的话可能可以平衡第一个物理核心上2个线程的负载,这利用了一些Windows调度线程和CPU的特性(Windows调度线程时尽量跳过超线程核心的一个线程;
Windows Internals 7th Part 1 p277~278
CPU0更有可能比CPU1运行更多重要的线程;
中断会打断核心正在运行的线程;
https://en.wikipedia.org/wiki/Interrupt
每个线程可以独自处理中断;
https://en.wikipedia.org/wiki/Hyper-threading#Overview
用户使用输入设备的时候会产生需要立刻处理的ISR中断;所以CPU1比CPU0更适合处理ISR中断),核心越少效果应该越显著,在核心多的CPU上也没什么坏处。
当然也有测试指出提升目标负载(约等于将ISR尽量留在CPU0)有一些玄学效果,目前Windows在启用modern standby的机器上将所有timer的中断放在CPU0上,可能可以认为将中断尽量集中起来是更好的方法。
Windows Internals 7th Part 2 p73
目标负载:已知提高了会让ISR堆在CPU0上,降低了没什么影响,填0会蓝屏,也不知道为什么单位是千分之一,但是最大值可以填一万。
(中断路由控制模式选了处理器0或1,目标负载和已启动时间触发器就没用了)
无线适配器设置:唯一有用的微软文档来自:https://support.microsoft.com/en-us/topic/you-may-experience-connectivity-issues-or-performance-issues-when-you-connect-a-mobile-pc-that-is-running-windows-to-a-wireless-access-point-e9d8416f-34e9-6926-839e-0f5c728aa6c2。
更多资料可以去知乎搜802.11 power save mode。具体原理是无线网卡让接入点缓一缓再发数据过来,以便无线网卡能得到更久的休息时间。
IEEE上的一篇2012年的论文说这个东西没什么用:https://ieeexplore.ieee.org/document/6468366,这东西有没有用是要看无线网卡和接入点之间协商得怎样,所以模板还是填了中等节能。
路由器必须支持才会生效,可在 powercfg /energy 生成的报告查看:
电源计划的电源计划类型和overlay不一样的时候会禁用overlay,避免overlay覆盖电源计划的设置。有个玄学,即使处理器设置完全一样,高性能和平衡类型的功耗大于节能类型。
文档说设备自己的电源策略可以因为电源计划类型而改变,也就是说驱动层面可能会根据电源计划类型让设备产生不同的功耗。
https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/managing-device-performance-states#registering-to-be-notified-of-a-change-to-the-active-power-scheme-power-scheme-personality-or-power-source
(这个设置是唯一一个控制面板里不会展示的设置,所以只能用非常规方法修改)
节电模式会应用profile_constrained里的电源设置并覆盖电源计划/电源模式的部分设置,并且还有限制一些系统的自动行为,进一步避免通知把系统从睡眠中唤醒等等:
https://learn.microsoft.com/en-us/windows-hardware/customize/power-settings/configure-processor-power-management-options#power-profiles
https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/battery-saver
节能模式策略:虽然没有直接解释的文档,但是在UWP的开发文档里有这么一行,看起来节能模式策略的作用应该是影响UWP的行为
https://learn.microsoft.com/en-us/uwp/api/windows.applicationmodel.background.backgroundtaskcancellationreason?view=winrt-22621#fields
USB没什么好讲的,要省电就把外接设备拔掉。
Hub Selective Suspend Timeout就是USB 选择性暂停设置用的数值。
Setting IOC on all TDs里的IOC是Interrupt on Completion,TDs是Transfer Descriptors,关闭应该是比较省电的。见:https://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/extensible-host-controler-interface-usb-xhci.pdf
如果发现设置莫名其妙地还原回去了,这是某些东西还原了电源计划,解决方法:
管理员权限打开PSE,双击一个设置,这样会打开这个设置储存默认值的注册表路径。
从左边的路径进去DefaultPowerSchemeValues,自带的3个电源计划的GUID是这些:
https://learn.microsoft.com/en-us/windows/win32/power/power-policy-settings
修改里面的AC/DC index,最后到控制面板还原电源计划,此时用来还原的值就是手动修改的值。
如果是overlay的设置被还原了,建议别用,反正要手动切换的东西不太想用。
Loading...