Linux CPU电源管理 C-state,众里寻他千百度
Youki 722 0

没实例说个毛

随机读发现性能下降

2022年第好几场雪,比平时来的冷一些!测试FIO随机读写的时候,意外发现FIO的随机读出现少量性能下降,查看iostat等监控数据,svctm出现比较稳定的30us差距,查看tubostat发现CPU停留在C6状态更多,C1更少。雪上加霜!! Linux CPU电源管理 C-state,众里寻他千百度 此图是FIO 随机读写的对比图, 蓝色为kernel 5.3.18,红色为kernel 5.14.17。 我们不难发现块大小为32K时随机读,产成了10+%性能下降,该性能下降导致了混合读写的性能丢失。真是事事无偿,大肠套小肠, 这相当与你背着媳妇攒钱,档了智能手表买了个I7 CPU,但实际的单核性能却只是个I5的输出。我拿你当初恋,你却当我是陪练!

调整kernel参数,禁止C-state进入深层idle

Linux CPU电源管理 C-state,众里寻他千百度 图中黄色部分为增加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所定义:

  1. C0:是一个Active状态,CPU/CORE正在执行指令。这个状态并不意味着cpu是最高频率,只要有任务在运行,cpu即使低频率也是在C0状态。从供电角度看,Cpu所有的器件都在供电。P-state就在这级工作,我们后续会涉及到。
  2. C1:Halt状态,没有任何指令执行,状态会瞬间返回C0状态。
  3. C1E:这个也属于C1类型,但是会用最低频率和电压降低
  4. C2:停止时钟,和C1相似,不过需要更多时间返回到C0状态
  5. C3:睡眠状态,需要相当长的时间回到C0状态。 跟多层级如下: Linux CPU电源管理 C-state,众里寻他千百度 LLC above refers to Last Level Cache, meaning the shared L3 cache in the processor. 各元器件的运行状态及相应度: Linux CPU电源管理 C-state,众里寻他千百度 下面是一个C-state节能的基本的时间线: C0 (CPU正常执行指令)--> C1 (空闲的Core始终停止) --> C3 (空闲的Core L1/L2刷新并且Core断电) --> C8 (所有的Core断电并且L3刷新,整个Package断电)

我们上面提到PC-state和CC-state的关系,显然它们不是独立的,所以两者的所有组合也不是全部合理的: Linux CPU电源管理 C-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),可以理解为计算机的电源状态。来,上酸菜: Linux CPU电源管理 C-state,众里寻他千百度

其中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进入到睡眠状态,看下图: Linux CPU电源管理 C-state,众里寻他千百度

C-state与ACPI G/S的组合:

Linux CPU电源管理 C-state,众里寻他千百度

上数据

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

评论区

索引目录