一、Intel C状态介绍
Intel的CPU提供不同的C状态,CPU的性能和功耗也会跟着实际的设置有相应的变化
为了在CPU空闲时节约能源,可以使用命令让CPU进入低功耗模式。 每个CPU都有几种功耗模式,它们统称为“C-模式”。
C-模式的基本理念是切断CPU内部的空闲部件的时钟信号和电源。 停止(通过切断时钟)、降低电压或者甚至完全关闭的部件越多,节约的能源就越多,但是CPU需要更多时间才能“唤醒”并再次完全正常运行。它们从C0开始编号,C0是正常的CPU操作模式,即CPU完全开启。 C编号越高,CPU睡眠模式越深,也就是说关闭的电路和信号更多,CPU需要更多时间才能恢复到C0,即唤醒。
每个模式也都有自己的名称,其中许多模式都有具有不同省电等级的子模式,因此唤醒时间也不尽相同。
在下面汇总了当前可用的所有C-State模式。 模式C1到C3的工作方式基本上是切断CPU内使用的时钟信号,而模式C4到C6的工作方式是降低CPU电压。 “增强”模式可以同时执行这两个操作。
模式 |
名称 |
作用 |
C0 |
操作状态 |
CPU完全打开 |
C1 |
停止 |
通过软件停止CPU内部主时钟;总线接口单元和APIC仍然保持全速运行。 |
C1E |
增强型停止 |
通过软件停止CPU内部主时钟并降低CPU电压;总线接口单元和APIC仍然保持全速运行。 |
C3 |
睡眠 |
停止所有CPU内部时钟 |
C6 |
深度电源关闭 |
将CPU内部电压降低至任何值,包括0 V |
二、C状态调整的相关设置
1、BIOS层面
BIOS是硬件控制的初始选项,BIOS的设置直接影响服务器的C状态表现
1)最大性能模式,CPU将一直在C0/C1状态工作
Monitor MWAIT : Disabled
Power/Performance Profile: High Performance Compute
CPU C state :Disabled
CPU C6 report: Disabled
Hardware P-States :Disabled
Turbo Mode:Enabled
P-state: Enabled
2)变频模式,CPU频率可以调整,将权限交给OS控制
Monitor MWAIT : Enabled
Power/Performance Profile: Custom
CPU C state :Enabled
CPU C6 report: Enabled
Hardware P-States : Native Mode
Turbo Mode:Enabled
P-state: Enabled
3)OS下设置
如果希望C状态在C0/C1状态下,在gurb.cfg里面加入参数:processor.max_cstate=1 intel_idle.max_cstate=0
如果希望C状态是变频,不在乎是否进入节能模式,在gurb.cfg里面加入参数:processor.max_cstate=8 intel_idle.max_cstate=9
“/boot/grub2/grub.cfg”文件中,找到对应内核,并修改如下行:
linux16 /boot/vmlinuz-xxxxxxxxxxxx LANG=en_US.UTF-8 processor.max_cstate=1 intel_idle.max_cstate=0
查看是否生效:
cat /proc/cmdline | grep "intel_idle.max_cstate=0" && cat /proc/cmdline | grep "processor.max_cstate=1"
echo $?
结果为0,表示已经重启生效。
备注:
[HW,ACPI]
processor.max_cstate={0|1|2|3|4|5|6|7|8|9}
无视ACPI表报告的值,强制指定CPU的最大 C-state值(必须是一个有效值):C0为正常状态,其他则为不同的省电模式(数字越大表示CPU休眠的程度越深/越省电)。"9"表示无视所有的DMI黑名单限制。
[KNL,HW,ACPI]
intel_idle.max_cstate=[0|正整数]
设置intel_idle驱动(CONFIG_INTEL_IDLE)允许使用的最大 C-state深度。"0"表示禁用intel_idle驱动,转而使用通用的acpi_idle驱动(CONFIG_CPU_IDLE)
三、实际使用情况:
不管CPU在什么状态,如果CPU压力足够大,都会进入C0状态。具体有多少核心进入C0状态,是根据CPU的负载情况决定的。
下图是CPU在C1E状态下对物理核心加压,一半核心都跑到了C0
下图是CPU在C1状态下加压,大部分到C0状态
四、应该怎么选择CPU的状态
根据实际的使用场景,需要高频?需要稳定?
1、需要部分核心达到最高频率
CPU都是多核心的SOC,如果需要一部分核心达到最高频工作,那么其他的一部分核心就会跑在基频或者比基频更低的频率上。因为CPU的TDP是一定的,这个设计是可以让做虚拟化的业务享受到CPU的最高频率。
以purley 平台5218CPU举例,
基频:2.3GHz
单核心最高频:3.9GHz
all core turbo最高频率:2.8GHz
所以当打开节能,设置为变频模式的时候,一些核心是可以跑到3.9GHz的,可以让一些重要应用的虚拟机跑到最优性能。
缺点是,因为频率变化很大,不稳定。而且压力很小的时候会进入深度节能状态,如果突然来了很大的压力,CPU从低频切换到高频,延时较大,而且容易发生宕机。
2、稳定应用,all core turbo到一定频率
基频是最稳定的应用频率,但是如果所有核心都跑在基频上,有点浪费CPU的性能表现。
最好的是设置为all core turbo 模式,这样CPU的核心都会跑在一个比基频高,比最大频率的一个稳定的频率上。延时表现最好,性能很稳定。