性能优化|从ping延时看CPU电源管理

发布时间:2021-11-08 | 信息来源: | 发布作者:沃趣科技

前言

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


问题

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

1



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

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


2

3

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

4

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

5

CPU的变频和电源管理

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

l  C states (Power states)

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

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

C0: 工作状态,没有组件关闭。

C1: 使用HLTMWAIT指令进入该状态,C1状态会关闭内部时钟,但是可以立刻回到C0状态。

C3: 使用MWAIT指令进入该状态,会将L1L2缓存刷到LLC/L3缓存,并进一步关闭了PLL,但仍处于供电状态。(C1C3状态下,Cache一致性是得到保证的,从而恢复现场速度也很快)

C6: 使用MWAIT指令进入该状态,内部设备的上下文信息(Context)被封存和冻结,Catch被清空和关闭,电压也被将为0。恢复现场会更耗时。

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

6

l  P states (Performance states)

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

u  OS控制的P-states

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

u  硬件控制的P-states

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

u  Intel_pstate驱动

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

l  monitor/mwait

1.      在core空闲或者等待写入时,使当前core进入C1等C-states的特殊指令。

l  Turbo

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

BIOS选项

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

7

使用工具查看CPU运行等级

l  corefreq-cli工具

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

8

问题解决

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

9

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

10

总结

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




沃趣科技,让客户用上更好的数据库技术!