从一个简单的ping延迟出发了解CPU电源管理

电源/新能源

3415人已加入

描述

性能优化大师Brendan Gregg曾说:“性能问题可能来源于任何地方,包括系统中因你一无所知而不曾检查的地方”,CPU电源管理就是在性能优化过程中经常被忽略的地方。在这篇文章中,我们从一个简单的ping延迟出发,以小见大,一起了解CPU电源管理。

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

PLL电路

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

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

PLL电路

图1

PLL电路

图2

在观察服务器B ping服务器A的输出(图3)时发现,延时的变化范围很大,有时延时也很短。

PLL电路

图3

如图4所示,CPU的频率也是变化的,那么CPU频率是怎么变的又是因何而变,跟延迟的变化有关系吗?我们能否控制CPU频率的这种变化呢?要了解这些我们首先要知道CPU的变频和电源管理方面的知识。

PLL电路

图4

CPU的变频和电源管理

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

■C states (Power states)

  1. 在空闲状态时,通过关闭不同子系统(时钟或者缓存等)达到不同省电状态。 关闭的组件越多,耗电量越低,但恢复工作就越慢。

  2. 常用的有以下几个状态

    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进入省电状态。)

PLL电路

图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始终保持高频率工作。

PLL电路

图6

使用工具查看CPU运行等级

■corefreq-cli工具

  1. 可以查看各种系统状态和CPU状态,包括电压,频率,C-states,Turbo,温度等。

PLL电路

图7

问题解决

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

PLL电路

图8

调整服务器A的bios选项,在关闭了C-States、Monitor/Mwait后,两台服务的CPU都处在C1状态(图9),这时再分别在两台服务器执行ping操作,延时终于不相上下了!

PLL电路

图9

总结

现代CPU电源管理功能十分强大,我们可以选择经济环保的方式让CPU根据负载选择工作频率和电压,在追求极致性能时也可以让CPU不管任务量大小都满负荷工作,在了解以上内容后,我们可以根据实际使用需求进行选择。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分