前言

性能优化大师Brendan Gregg曾说:“性能问题可能来源于任何中央,包含零碎中因你无所不知而未曾查看的中央”,CPU电源治理就是在性能优化过程中常常被疏忽的中央。在这篇文章中,咱们从一个简略的ping提早登程,以小见大,一起理解CPU电源治理。

之前在我的项目中观测到一个奇怪的景象(如下图所示),在测试网络提早时,从服务器A ping服务器B延时只有0.04ms左右,然而从服务器B ping服务器A提早确有0.12ms左右,后果相差三倍多!而两台服务器是直连的,两头也没有通过路由器或交换机,那么延时差到底是怎么产生的呢?

在剖析此问题时,咱们将ping时延做一个简略的拆分,它包含了在链路中的流传时延和在服务器端的解决时延。咱们首先判断下网络情况是否良好,用tcpdump别离在收发两端抓包,没有发现丢包、乱序等问题,速率也没有问题,网络状态良好。既然网络传输没有问题,那就重点剖析下解决时延。

再来剖析下抓到的ping报文,次要剖析在两台服务器收到ICMP报文后发送回复报文的时间差,发现服务器A的回复工夫更长。再应用ftrace剖析代码层的执行工夫,图1是服务器A的解决工夫,图2是服务器B的解决工夫,比照可见,服务器A的ICMP reply执行工夫比服务器B要长。那什么会影响函数执行的工夫呢?是CPU。


图1


图2

在察看服务器B ping服务器A的输入(图3)时发现,延时的变动范畴很大,有时延时也很短。


图3

如图4所示,CPU的频率也是变动的,那么CPU频率是怎么变的又是因何而变,跟提早的变动有关系吗?咱们是否管制CPU频率的这种变动呢?要理解这些咱们首先要晓得CPU的变频和电源治理方面的常识。


图4

CPU的变频和电源治理

OS会依据工作负载抉择工作频率和电压,当负载较低时(例如此问题的ping报文收发),会对CPU进行降压降频以节俭用电。在大部分场景下,CPU并不需要7X24小时满负荷工作,为了省电和缩短CPU的使用寿命就有了各种变频省电技术。其中常见的有以下几种:

■C states (Power states)

  1. 在闲暇状态时,通过敞开不同子系统(时钟或者缓存等)达到不同省电状态。 敞开的组件越多,耗电量越低,但复原工作就越慢。
  1. 罕用的有以下几个状态

    C0: 工作状态,没有组件敞开。

    C1: 应用HLT或MWAIT指令进入该状态,C1状态会敞开外部时钟,然而能够立即回到C0状态。

    C3: 应用MWAIT指令进入该状态,会将L1和L2缓存刷到LLC/L3缓存,并进一步敞开了PLL,但仍处于供电状态。(C1,C3状态下,Cache一致性是失去保障的,从而复原现场速度也很快)

    C6: 应用MWAIT指令进入该状态,外部设施的上下文信息(Context)被封存和解冻,Catch被清空和敞开,电压也被降为0。复原现场会更耗时。

    (idle_intel 驱动可能在Cstates敞开时,仍使core进入省电状态。)


图5

■P states (Performance states)

  1. 依据处理器负载主动调节电压和频率,以缩小耗电量和发热量,大大减少了CPU在低工作量的能耗。(只有在C-states状态为C0时才会无效,因为必须为其供电能力执行指令)
  • OS管制的P-states

    OS设定特定的P-states,即抉择工作频率,处理器再依据频率计算电压。 

  • 硬件管制的P-states

    OS只给出负载,由硬件抉择对应的P-states,并设置电压和频率。

  • Intel_pstate驱动

    此驱动程序通过内置调频器,实现面向Intel Core(SandyBridge 和更新的型号)处理器的调频驱动。能够通过cpupower命令设置最大最小频率。 

■monitor/mwait

  1. 在core闲暇或者期待写入时,使以后core进入C1等C-states的非凡指令。

■Turbo

  1. 在个别核十分忙碌同时其余核又因为闲暇进入C-States时,内置的电源治理模块将其电能输送给繁忙的core,升高其电压和频率,使其取得比标频更高的频率。

BIOS选项

  • 以DELL服务器为例,在System Profile Setting中能够找到无关电源治理的选项。disable C-States、Monitor/Wait相干选项,能够使CPU始终保持高频率工作。


图6

应用工具查看CPU运行等级

■corefreq-cli工具

  1. 能够查看各种零碎状态和CPU状态,包含电压,频率,C-states,Turbo,温度等。


图7

问题解决

再回到刚开始的问题,通过corefreq-cli工具看到两台服务器的CPU的确工作在不同的C-States等级,如图8所示,服务器B在C1而服务器A在C6。


图8

调整服务器A的bios选项,在敞开了C-States、Monitor/Mwait后,两台服务的CPU都处在C1状态(图9),这时再别离在两台服务器执行ping操作,延时终于并驾齐驱了!


图9

总结

古代CPU电源治理性能非常弱小,咱们能够抉择经济环保的形式让CPU依据负载抉择工作频率和电压,在谋求极致性能时也能够让CPU不论任务量大小都满负荷工作,在理解以上内容后,咱们能够依据理论应用需要进行抉择。