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

性能优化大师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)
在空闲状态时,通过关闭不同子系统(时钟或者缓存等)达到不同省电状态。 关闭的组件越多,耗电量越低,但恢复工作就越慢。
常用的有以下几个状态
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) **
根据处理器负载自动调节电压和频率,以减少耗电量和发热量,大大减少了cpu在低工作量的能耗。(只有在c-states状态为c0时才会有效,因为必须为其供电才能执行指令)os控制的p-states
os设定特定的p-states,即选择工作频率,处理器再根据频率计算电压。
硬件控制的p-states
os只给出负载,由硬件选择对应的p-states,并设置电压和频率。
intel_pstate驱动
此驱动程序通过内置调频器,实现面向intel core(sandybridge 和更新的型号)处理器的调频驱动。可以通过cpupower命令设置最大最小频率。
■monitor/mwait
在core空闲或者等待写入时,使当前core进入c1等c-states的特殊指令。■turbo
在个别核非常繁忙同时其他核又因为空闲进入c-states时,内置的电源管理模块将其电能输送给忙碌的core,升高其电压和频率,使其获得比标频更高的频率。bios选项
以dell服务器为例,在system profile setting中可以找到有关电源管理的选项。disable c-states、monitor/wait相关选项,可以使cpu始终保持高频率工作。
图6
使用工具查看cpu运行等级
■corefreq-cli工具
可以查看各种系统状态和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不管任务量大小都满负荷工作,在了解以上内容后,我们可以根据实际使用需求进行选择。

DDR的三大关键技术详解
逻辑分析仪探头的物理形式
FPGA在汽车行业的应用
借助 NVIDIA DRIVE Concierge可加速部署更安全高效的车辆
聊聊网络应用中的常见问题
从一个简单的ping延迟出发了解CPU电源管理
解析工业以太网:实现智能工厂的未来之路
Counterpoint发布白皮书为旗舰芯片指明方向
六维力传感器赛道崛起的背后:细分赛道、技术赋能...国产厂商各显神通
启扬方案:RK3568在金融自助终端解决方案
AM335X与全志A40i大比拼
非接触式管道液位开关是如何实现的
我国首个大规模微发光二极管芯片项目将在2021年顺利投产
什么是LED驱动时序?LCD背光驱动程序设计
具有开放孔隙的普鲁士蓝类似物实现高性能锂硫电池
植物冠层图像分析仪的功能特点以及技术参数
代码的可重用性是代码开发和确保可维护性的关键
Summit微电子SMB274,让自动对焦成为手机摄像头标配
RISC-V向高性能计算(HPC)领域进军
Java11和Java17使用率达48%和45%