4

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

 1 year ago
source link: https://blog.51cto.com/u_15739379/5539212
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

原创

沃趣QFusion数据库私有云 2022-08-03 09:52:57 ©著作权

文章标签 服务器 电源管理 缓存 cpu 文章分类 分布式 服务器 阅读数265

前言

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

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

性能优化|从ping延时看CPU电源管理_服务器

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

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

性能优化|从ping延时看CPU电源管理_缓存_02
性能优化|从ping延时看CPU电源管理_缓存_03

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

性能优化|从ping延时看CPU电源管理_缓存_04

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

性能优化|从ping延时看CPU电源管理_缓存_05

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进入省电状态。)
性能优化|从ping延时看CPU电源管理_服务器_06

■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始终保持高频率工作。
性能优化|从ping延时看CPU电源管理_缓存_07

使用工具查看CPU运行等级

■corefreq-cli工具

  1. 可以查看各种系统状态和CPU状态,包括电压,频率,C-states,Turbo,温度等。
性能优化|从ping延时看CPU电源管理_cpu_08

问题解决

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

性能优化|从ping延时看CPU电源管理_缓存_09

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

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

总结

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

性能优化|从ping延时看CPU电源管理_服务器_11


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK