暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

CPU电源管理(P-state)

LinuxKernelStudy 2020-10-15
2296

背景

    计算机系统需要电力来执行各种活动,比如CPU需要从内存获取数据和应用程序、执行指令、显示输出结果,同时它也通过各种接口与用户通信,如使用网卡与网络上的其他计算机交互。这些功能是计算机系统中的各硬件部件协作来完成的,而每个部件都需要不同的电力去运作。


    据调查,一项数据中心的电力消耗研究表明,近50%的输入电力被空调和电力传输子系统消耗,而服务器本身占用了剩下的50%电力。试想一下,如此大的一个数据机房,一天要损耗多少电费??

    我们把计算机系统各个部件的损耗,进一步分解为下图所示的各个元素。

    可以看到,服务器中处理器所消耗的大约30%的电能,本文主要针对CPU部分相关的功耗管理技术。(其他部件暂不做分析讨论,其实我也没去研究过)


那么,如何让CPU不损失性能的情况下,达到功耗最小?


Demand Based Switching (DBS) 按需调节


    DBS是由Intel公司开发的一种电源管理技术,该技术将微处理器的电压和时钟速度保持在最低的必要水平,以实现所需操作的最佳性能。一个支持DBS的处理器会尽可能的让CPU处于一个较低的电压和时钟速度工作,直到系统需要更多的处理能力。


如何实现?

    这其实是通过监视应用程序级工作负载对处理器的使用来实现的,比如,在CPU空闲时就降低CPU速度,而在负载增加时提高CPU速度。该技术作为Intel®SpeedStep®技术引入服务器市场。通常,没有启用DBS的处理器总是以额定速度运行,并消耗相应的功率,与工作负载无关,即使处理器有能力以较低的工作电压和频率方式运行。因此,当工作负载级别较低时,我们就有机会降低功耗。


    在讨论DBS技术之前,需要了解一下intel的2个状态:C-state、p-state。


C-state:是CPU的idle状态。

    处理器c状态是处理器进入各种低功耗空闲状态的能力(具有不同的唤醒延迟)。基于Intel体系结构的处理器有几个c状态,表示可以关闭这些c状态以节省电能。特别的是C0是操作状态,意味着CPU正在做有用的工作。C1是第一个空闲状态,运行处理器的时钟是门控的;也就是说,时钟被阻止到达核心,时钟被关闭。C2是第二个空闲状态,外部I/O控制器集线器阻塞对处理器的中断。C3 C4 C5...等等。


P-state:是CPU的运行状态。

    P-state:处理器P-state是处理器在不同电压和/或频率级别下运行的能力。通常,P0是导致最大性能的最高状态,而P1、P2等将节省电能,但会对CPU性能造成一些损失。

    处理器性能状态(p -state)是一组预定义的CPU频率/电压,图2中表格给出了处理器不同p-state的例子,该处理器拥有5个P-state,P0-P5,每个P-state level定义了该level下对应的运行电压、运行频率及功耗。处理器可以在这些频率和电压组合下正确运行,但性能水平有所不同。频率越高,性能越好,但是为了达到这个目的,电压也需要更高,这就使得处理器消耗更多的电源(电力功耗与电压平方和工作频率的乘积成正比)。


    图2的流程图表示了处理器从P0状态到P4的变化过程。在DBS使能的情况下,不断观察当前CPU利用率,如果CPU利用率有所下降,那么对应降低CPU电压,下降过程中CPU freq不断降低,随之处理器温度也慢慢冷却,机房的冷却系统的耗电需求也随之下降。


    从数字上可以看到,当处理器以最低的性能状态运行时,相对比P0状态(最高性能),可以节省35瓦的电能。


为什么用P-state表示,而不是cpu frequency?

    在十几年前,单核,也没有超线程的世界,事情相对简单。你基本上可以将P状态映射到某个你会得到的“频率”上,就像销售告诉我们的,更高的频率意味着更高的性能。


    今天,事情变得复杂,intel 处理器一代又一代,发生着巨大的变化。与10年前不同……CPU有了C-state,无论您请求的是哪种P状态,当处理器处于空闲状态(C状态)时,其频率通常为0,CPU frequency是个变数...。

所以,事实上P状态是一个数字,是操作系统告诉硬件它希望在某个cpu上看到多少性能,P状态请求是具有前瞻性的。并不是设置了P-state就能看到对应性能,这跟当时的运行环境密切相关。另外要记住,CPU frequency是处理运行时的状态,如果CPU在睡觉,那么它没有频率。


    另外一方面,由于硬件原因,在当前的Intel处理器上,一个package中的所有核心共享相同的电压。而且,由于在一定电压下以低于可能的频率运行是低效的,所以所有核心在任何时候都将共享相同的时钟频率。


举一个一个简单的例子:

一个系统,两个CPU核心(核心a和核心B,它们最初都很忙)。Core A希望有一个在1Ghz频率的时钟,而Core B希望有一个在2Ghz频率的时钟。1Ghz和2Ghz的最大值是…2Ghz,因此Core A和Core B都将运行在2Ghz下,尽管Core A只要求1Ghz。


一段时间后,在X时刻,核心B处于空闲状态。因为一个空闲核的频率是0,而0和1Ghz的最大值是1Ghz……Core A现在运行的时钟频率为1Ghz。


这里的一个关键:核心A得到了一个可变的CPU运行行为,这和它所请求的CPU p-state级别无关,而是在于核心B在做什么。


换句话说,CPU上P-state的设定,似乎是一个期望值。实时的p-state状态和运行负载、硬件电压、兄弟核、温度等等都有一定联系。对于用户来说,我们熟知的CPU主频,同样也高度依赖系统各个内部部件。


CPU frequency driver

    硬件提供了动态变更CPU性能,对应到linux操作系统,是由CPU frequency driver来完成处理器performance动态变化的。linux中有一套通用的ACPI cpufreq driver,这种适用于大数平台及架构。


    而在linux-3.9内核中,intel为P-state引入了一个新的控制器驱动程序,原因很简单,因为之前的10多年的算法已经不再适用了,变化太大了。同时intel在自己硬件上做了特殊节能优化,Intel cpu通过MSR寄存器公开了很多power manager相关的状态信息,方便驱动程序访问。p-state驱动程序特定生成于intel CPU,同时实现了p-state选择策略和调优算法,据说比通用的算法做得更好(30%以上)。


    当然intel平台也同样支持使用通用的ACPI cpufreq driver。


    上面所描述很多东西在intel一代一代之间是有很大不同的……也许,在接下来的几年里,处理器将发生更大的变化。但我觉得这对于一些对PM感兴趣的人,理解一些基本概念已经足够……


再来介绍下turbo boost(超频)。

    turbo boost也是intel的一项性能提升技术,官方上也有一些描述文档。


    有些人称之为“超频”,但它并不是超频,它完全运行在硬件规格之内。Turbo之所以存在,是因为在多核系统中,单核的运行速度可能比购买处理器时盒子标签上的频率更快。这与你的电源功耗有关,当你买了一个35瓦的TDP cpu, cpu不应该使用超过35瓦。因此,如果你有4个核心,这意味着每个核心本身可以使用不到9瓦来满足。


    那如果处理器中单一核心被限制在9瓦,而不是完整的35W,那么即使其他核心是空闲的,active CPU也只能工作在9瓦范围内,许多潜在的性能没有被激发……。


    那么我想,你应该知道turbo技术是什么了吧,也就是单一核心可以超过9W运行,而不是局限在一个固定的平均值。所以当处理器中其他核心idle的情况下,某一个active cpu才可以发挥出更大的潜能(当然和当前的负载有关),那么这个时候,意味着CPU超频了……。


在我们的x86环境下,可以通过turbostat工具来看到cpu的turbostat boost能力:


    关注最后4行,当只有1个核是active的时候,那么这个核可以达到2.6Ghz;而当有3个active核时,这3个核可以达到2.5Ghz,那如果4个核或4个核以上active时,那么只能达到2.4Ghz。


    其中还可以看到最大turbo ratio limit等信息。


    turbostat很强大,是intel专门对自己硬件上做的性能监视工具,不仅可以看turbo,还可以看到CPU的各类性能状态,如C-state(进入C1、C2、C3的占用时间),cpu frequency,功耗,处理器温度等信息。


    说到最后,cpu frequency,p-state、c-state,一切为了节能,减少电费。同时电源管理对于移动设备更为重要(电池供电),一项好的powersave技术会变得非常有价值,这对于电子工程师来说,是很有挑战的,然而对消费者来说,当然你也可以先带着充电宝。


文章转载自LinuxKernelStudy,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论