前言
性能优化大师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)
图5
■P states (Performance states)
■monitor/mwait
■Turbo
BIOS选项
图6
使用工具查看CPU运行等级
■corefreq-cli工具
图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不管任务量大小都满负荷工作,在了解以上内容后,我们可以根据实际使用需求进行选择。