揭秘EcoQoS和效率模式的原理

Windows 11 22H2新增的EcoQoS和效率模式让不少人以为微软搞出了什么很神奇的优化魔法,我一直说这些东西没用,纯属图一乐。下面就详细讲讲这些东西到底做了什么。

微软有两个关于EcoQoS和效率模式的文章:
https://devblogs.microsoft.com/performance-diagnostics/introducing-ecoqos/
https://devblogs.microsoft.com/performance-diagnostics/reduce-process-interference-with-task-manager-efficiency-mode/
先从第二个的效率模式开始,该文明确提到了效率模式有两个行为:将进程的基础优先级改为low,把QoS改为EcoQoS。

如果使用了能源之星这种软件的话,基础优先级会被改为idle,因为代码就是这么写的。

于是很多人就以为这样做就可以做到所谓的 “限制软件后台行为”。没什么好说的,但凡给跑分软件打开效率模式再跑分,看看cpu占用率就知道这种说法是站不住脚的。
一个非实时操作系统一般是这么调度的:所有线程按照优先级排序,优先级高的先用cpu,用完了再给优先级低的线程用,优先级低的线程使用cpu的过程可以被高优先级的线程打断,以便快速响应。所有线程加起来该用多久cpu就会用多久cpu,不会因为某些线程的优先级被改低了就少用cpu。
桌面端Windows在默认情况下给线程单次最多使用30毫秒的cpu时间(一个quantum),并且会自动为前台线程多分配两个quantum以保证响应速度。

Windows会自动提升前台进程的优先级:

从这个实验来看,一般情况下Windows会给有用户输入的前台进程提高4个优先级:

而且Windows每秒会检查一次有哪些正在排队等着用cpu却因为优先级不够高而一直无法使用cpu的线程,然后把这些线程的优先级提高,并且给三个quantum。所以手动调低大部分进程的优先级在绝大多数情况下是自作聪明的行为。

微软说效率模式可以提高响应能力基本是睁眼说瞎话。

然后来看EcoQoS,文章里提到

第一个问题,这个东西需不需要软件适配?文章下面的api文档里面的说法是:

归类是什么意思?任务管理器里手动打开效率模式是归类(见图1),能源之星也可以给别的进程启用PROCESS_POWER_THROTTLING_EXECUTION_SPEED,就算什么都不做,Windows自己就会归类,所以这个东西根本不需要任何软件适配。

第二个问题,也是最重要的问题,微软说的 “系统将尝试通过降低CPU频率或使用更节能的内核等策略来提高电源效率” 是怎么回事?
我不信微软有什么优化魔法,直接注册表打开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Profile\Events\{54533251-82be-4824-96c1-47b60b740d00},
EcoQoS的GUID是336c7511-f109-4172-bb3a-3ea51f815ada,然后把这个GUID拿去全局搜索就知道EcoQoS的葫芦里卖什么药了。
全新安装的Windows 11 22H2的默认值是这些:插电最大频率2GHz,离电最大频率1.8GHz,插电异类短运行线程调度策略自动

没什么好说的,微软声称的最大能节约90%的cpu功耗是不是在全核锁5GHz而且为了编译Windows所以cpu占用率90%以上的台式机上测的?这个限制频率纯属搞笑,1.8GHz已经大于等于所有12代u系列cpu的大核的基础频率了,后台进程能用到1.8GHz还谈什么省电?但凡把处理器能源性能首选项策略改成和modern standby用的QoS level一样的100都算微软努力过了。
另外一个调度到高效核心上等于异类线程调度策略选高效处理器或首选高效处理器,我的评价是,我都可以用电源计划全局应用这个设置了,为什么要用EcoQoS?


至于效率模式为什么要求移动端酷睿10代以上和移动端锐龙5000系以上,原因很简单:这些cpu支持自主模式控制和分核心控制频率。
酷睿从6代开始支持自主模式控制,但是移动端的分核心控制频率直到10代才有。

移动端锐龙一开始就支持分核心控制频率,但是自主模式控制直到5000系才有。

自主模式控制是为了当有不同QoS level的线程在一个核心上轮转时,核心可以尽快确定不同QoS level所需的性能。
分核心控制频率是为了让多核cpu同时处理不同QoS level的线程。如果没有这个功能,有一个限制了核心频率的线程在一个核心上,而其他核心的频率较高,那相当于没限制住频率。

综上所述,EcoQoS和效率模式基本上就是微软宣传部门混kpi的产物,没活可以咬打火机。

附录:关于EcoQoS的测试结果
平衡计划下,给跑分软件手动打开EcoQoS并测试单核,频率基本维持在EcoQoS的的限制左右,会出现高一些的情况,原因不明,也懒得知道;
平衡计划下,手动将最大频率限制为和EcoQoS一样的设置,单核跑分时的频率比用EcoQoS限制时的低一点,所以EcoQoS连限制最高频率都不如电源计划的全局设置;
电源计划类型为节能的自定义计划下,给跑分软件手动打开EcoQoS并测试单核,频率和平衡计划没有区别,说明包括EcoQoS在内的所有power profile和QoS level即使默认设置仅写入了默认的平衡计划,在非平衡类型的电源计划上仍然生效;
同样的自定义计划下,禁用所有power profile和QoS level,给跑分软件手动打开EcoQoS并测试单核,频率仍然能达到最高频率。
往EcoQoS里写入最大频率1GHz的设置,启用所有power profile和QoS level,然后开一个跑分软件测试,最大频率是2GHz出头,差不多是AMD给的设置;电源计划里限制最大频率1GHz就没问题,和AMD的设置一样用2GHz的话,频率还比EcoQoS稍低。
要禁用所有power profile和QoS level的话到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power,把EventProcessorEnabled改为0,重启。这样做是为了避免所有power profile和QoS level在任何情况下覆盖自己用的电源设置。

彩蛋:AMD的chipset driver里的电源设置,拷打EcoQoS的最有力证据
