前言
性能优化大师 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 不论任务量大小都满负荷工作,在理解以上内容后,咱们能够依据理论应用需要进行抉择。