没实例说个毛
随机读发现性能下降
2022年第好几场雪,比平时来的冷一些!测试FIO随机读写的时候,意外发现FIO的随机读出现少量性能下降,查看iostat等监控数据,svctm出现比较稳定的30us差距,查看tubostat发现CPU停留在C6状态更多,C1更少。雪上加霜!! 此图是FIO 随机读写的对比图, 蓝色为kernel 5.3.18,红色为kernel 5.14.17。 我们不难发现块大小为32K时随机读,产成了10+%性能下降,该性能下降导致了混合读写的性能丢失。真是事事无偿,大肠套小肠, 这相当与你背着媳妇攒钱,档了智能手表买了个I7 CPU,但实际的单核性能却只是个I5的输出。我拿你当初恋,你却当我是陪练!
调整kernel参数,禁止C-state进入深层idle
图中黄色部分为增加intel_idle.max_cstate=1kernel参数后,产生的结果,数据回升明显。C-state对性能的影响已不容忽视。我又TMD哭的像个2傻子憧憬爱情了!!
来来来,让老铁们看看C-state是个啥?咋工作滴
背景
CPU设计之初,是可以在特定的负载之下可以一直工作。但是,几乎没有那个坑货可以使CPU保持7x24小时全负荷永久运行,大部分时间内,CPU都将不会在其最大允许负载情况下工作,显然在这种实际情况下,保持CPU在最大负载下运行,即不合理,也不节能,也无法响应环保号召。随之而来,CPU的节能小助手C-state (Idel state)P-state应运而生。
咋节能?
节能减排在Linux中一样适用,究其原因有两点:
- 当CPU空闲时,尽可能关闭CPU内部子系统。
- 当CPU有负载时,尽可能降低电压和频率。 第二条请参考公式 P ~ FV², 显然CPU的能量消耗与频率,电压的平方成线性关系。降低电压与频率起到减排目的。(P-state 相关博文,我们在下篇讨论)
C-state 是个啥?
C-state 是CPU硬件的一种特性,旨在当处理器空闲时尽可能的节能。不同处理器家族有不同的C-state的设置和层级范围。
C-state 咋节能
C-state存在多级,设置不同C-state级别从而在CPU idel时候关闭CPU内部的不同元器件,来较少能量损耗。 目前大部分的现在CPU具备多核(Core),多线程(Thread)的架构,多核被封装在一个单独的包(Package)中。Package,Core和Thread就像是就是套房2屋1厨8卫,整套房间可以理解为Package,每个房间即为Core,房间里的人为Thread。C-state根据CPU多核的特性被分成两组状态即,Package-state (PC-state) 和 Core-state(CC-state)。 由于Package中会共享一些组件对包中所有Core,所以只有在Pacakge中的所有Core全部子系统关闭,PC-state中的共享组件才可以断电,继而断电package。然而作为用户,我们无法直接控制PC-state,但是我们可以直接控制CC-state从而间接的控制PC-state。这地方有点绕,意思意思得了,会了也不能涨工资。
C-state的分级
C-state被分级成C0... 到CN,数值越大,节能效果越显著,随之而来需要更长的时间来唤醒CN状态到C0状态。C-state会根据CPU的idel时间长短,设置CPU的C-state的层级,idel时间越长,C-state会休眠越深,越多CPU内部的子系统会断电节能。这玩意儿就像谈恋爱,爱的越深,就会更深陷入其中,一旦对方劈腿,爱的一方越难从爱情的沼泽轱蛹出来。正所谓,甜言蜜语死鬼,一看就是情感的小土匪。 基本的C-state状态被ACPI所定义:
- C0:是一个Active状态,CPU/CORE正在执行指令。这个状态并不意味着cpu是最高频率,只要有任务在运行,cpu即使低频率也是在C0状态。从供电角度看,Cpu所有的器件都在供电。P-state就在这级工作,我们后续会涉及到。
- C1:Halt状态,没有任何指令执行,状态会瞬间返回C0状态。
- C1E:这个也属于C1类型,但是会用最低频率和电压降低
- C2:停止时钟,和C1相似,不过需要更多时间返回到C0状态
- C3:睡眠状态,需要相当长的时间回到C0状态。 跟多层级如下: LLC above refers to Last Level Cache, meaning the shared L3 cache in the processor. 各元器件的运行状态及相应度: 下面是一个C-state节能的基本的时间线: C0 (CPU正常执行指令)--> C1 (空闲的Core始终停止) --> C3 (空闲的Core L1/L2刷新并且Core断电) --> C8 (所有的Core断电并且L3刷新,整个Package断电)
我们上面提到PC-state和CC-state的关系,显然它们不是独立的,所以两者的所有组合也不是全部合理的: 上图中绿色部分表明PC-state与CC-state的合理组合。 没啥用,知道就行了,毕竟Intel这货不让你直接更改PC-state。
怎么查看C-state
先看看我CPU型号
Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
root?-:cpupower idle-info
CPUidle driver: intel_idle
CPUidle governor: menu
analyzing CPU 0:
Number of idle states: 9
Available idle states: POLL C1 C1E C3 C6 C7s C8 C9 C10
POLL:
Flags/Description: CPUIDLE CORE POLL IDLE
Latency: 0
Usage: 58853
Duration: 1472622
C1:
Flags/Description: MWAIT 0x00
Latency: 2
Usage: 70885
Duration: 15456747
C1E:
Flags/Description: MWAIT 0x01
Latency: 10
Usage: 149293
Duration: 44627887
C3:
Flags/Description: MWAIT 0x10
Latency: 70
Usage: 83908
Duration: 14263212
....
如何设置C-state
更改kernel参数
intel_idle.max_cstate=1
cpupower工具
cpupower -c all idle-set ....
ACPI power states
我们来看下ACPI power states, 这个状态被命名成这样式滴(GX states),它叫做全局系统状态(global system states),可以理解为计算机的电源状态。来,上酸菜:
其中GX中又细分了多种的sleep的状态(SX):
- GO/S0:计算机正在运行
- G1:睡眠
- G1/S1:休眠状态,这表述有点模糊,但这个状态Suspend/Hibernation 老铁是不是更熟悉了。
- G1/S2:CPU断电,CPU和其cache全部丢失。
- G1/S3:RAM还是保持供电的,不过RAM是暂停的状态。
- G1/S4:休眠磁盘,所有信息保存在DISK中,RAM和其他硬件断电。
- G2/S5:Soft off,和机械断电差不多,这不过可以比机械断电更快的通过reboot回复到G0状态
- G3:机械断电,需要reboot回复G0
C-state与ACPI power states:
所有C-state在G0/S0中生效,一旦进入到G1,CPU进入到睡眠状态,看下图:
C-state与ACPI G/S的组合:
上数据
Kernel 信息:
Linux:
|- Release [5.15.12-1-default]
|- Version [#1 SMP Wed Dec 29 14:50:16 UTC 2021 (375fcb8)]
|- Machine [x86_64]
Memory:
|- Total RAM 32473992 KB
|- Shared RAM 1492920 KB
|- Free RAM 19544956 KB
|- Buffer RAM 84776 KB
|- Total High 0 KB
|- Free High 0 KB
CPU-Freq driver [ intel_pstate]
Governor [ Missing]
CPU-Idle driver [ intel_idle]
|- Idle Limit [ C10]
|- State POLL C1 C1E C3 C6 C7s C8 C9
|- CPUIDLE MWAIT 0 MWAIT 0 MWAIT 0 MWAIT 0 MWAIT 0 MWAIT 0 MWAIT 0
|- Power -1 0 0 0 0 0 0 0
|- Latency 0 2 10 70 85 124 200 480
|- Residency 0 2 20 100 200 800 800 5000
可以看出,C-state值越大,带来的延迟越严重。
Core C-statue 统计数据:
CPU Freq(MHz) Ratio Turbo C0(%) C1(%) C3(%) C6(%) C7(%) Min TMP:TS Max
000 96.16 ( 0.96) 3.55 7.78 4.35 0.00 1.61 86.26 26 / 29:68 / 53
001 40.08 ( 0.40) 1.48 4.52 4.79 0.17 5.35 85.17 29 / 33:64 / 51
002 150.36 ( 1.50) 5.54 7.15 6.71 0.27 2.68 83.18 27 / 30:67 / 48
003 18.35 ( 0.18) 0.68 2.17 3.87 0.20 2.68 91.07 26 / 31:66 / 51
004 24.30 ( 0.24) 0.90 2.32 9.80 0.00 1.61 86.27 26 / 29:68 / 53
005 28.87 ( 0.29) 1.06 2.96 6.35 0.17 5.35 85.17 29 / 33:64 / 51
006 62.95 ( 0.63) 2.32 4.48 9.38 0.27 2.68 83.18 27 / 30:67 / 48
007 13.99 ( 0.14) 0.52 1.55 4.50 0.20 2.68 91.07 26 / 31:66 / 51
Averages: Turbo C0(%) C1(%) C3(%) C6(%) C7(%) TjMax: Pkg:
2.01 4.12 6.22 0.16 3.08 86.42 100 C 35 C
CPU Freq(MHz) Ratio Turbo C0(%) C1(%) C3(%) C6(%) C7(%) Min TMP:TS Max
000 22.42 ( 0.22) 0.83 2.94 5.11 0.11 2.34 89.51 26 / 29:68 / 53
001 21.99 ( 0.22) 0.81 3.07 5.69 0.11 5.12 86.01 29 / 32:65 / 51
002 75.98 ( 0.76) 2.80 9.02 5.55 0.04 1.88 83.52 27 / 30:67 / 48
003 14.05 ( 0.14) 0.52 1.99 3.99 0.12 2.10 91.80 26 / 31:66 / 51
004 34.53 ( 0.34) 1.27 3.76 4.29 0.11 2.34 89.50 26 / 29:68 / 53
005 35.22 ( 0.35) 1.30 3.67 5.10 0.11 5.12 86.00 29 / 32:65 / 51
006 45.33 ( 0.45) 1.67 4.98 9.59 0.04 1.88 83.51 27 / 30:67 / 48
007 19.27 ( 0.19) 0.71 2.42 3.56 0.12 2.10 91.80 26 / 31:66 / 51
Averages: Turbo C0(%) C1(%) C3(%) C6(%) C7(%) TjMax: Pkg:
1.24 3.98 5.36 0.09 2.86 87.71 100 C 34 C
不难发现,本机大部分时间是在C7,闲着看我码字。
总结
没啥总结的,该说的都在上面,忘记一点,更改C-state到更高层级,无疑会增加用电量,不过你们也不关心,毕竟这是老板的事,对公司有意见的,是时候给你们老板上一课了。
VX:smzdmn MAIL:wxgwin@hotmail.com