Intel Turbo Boost技术和intel_pstate
Intel Turbo Boost
Intel Turbo Boost是Intel在系列处理器实现的技术,通过动态控制处理器的时钟率来激活处理器运行在超过基础操作主频。
支持不同Turbo Boost版本技术的处理器分为:
Turbo Boost 1.0: Nehalem
Turbo Boost 2.0: Sandby Bridge
Turbo Boost Max 3.0: Ivy Bridge, Haswell, Broadwell, Skylake, Broadwell-E
Turo Boost是在操作系统请求处理器的最高性能状态(highest performance state, pstate)时候激活。
处理器性能状态是通过高级配置和电源接口(Advanced Configuration and Power Interface, ACPI)规范来定义的,这是被所有主流操作系统所支持的开放标准。在Turbo Boost背后的设计概念也被称为"动态超频"。
时钟主频是由处理器电压,电流和热量所限制的,同时也受到当前CPU核心数量和激活核心的最高主频限制。当处理器上负载调用更快性能,并且此时处理器还没有达到上限,则处理器时钟将增加操作频率以满足需求。频率增长,在Nehalem处理器是133MHz,而在Sand Bridge, Ivy Bridge,Haswell和Skylake处理器是100MHz。
Intel Turbo Boost监控处理器当期使用情况,以及处理器是否接近最大热量设计功率
(thermal design power, TDP)。这个TDP是处理器支持的最大功率。
Turbo Boost是动态
功能,Turbo Boost以133MHz步长增长,直到达到允许的最大Turbo Boost(和处理器型号相关)或者最大TDP。不过,Intel仍然建议处理器工作在基础时钟速度(base clock speed),因为Intel不承诺处理器任何时候都能够达到最大Turbo Boost speed。
Turbo Boost允许一个或多个CPU核心运行在更高的P-states,这个最大P-state需要考虑以下因素:
激活的核心数量( C0 或 C1 状态)
评估当前处理器消耗(Imax)
评估处理器电能消耗(TDP - Thermal Design Power)
处理器稳定
Turbo Boot Max 3.0
Intel Turbo Boost Max Technology 3.0 使用一个和CPU中存储信息相连的驱动。它标识并直接工作在最快的芯片内核上。驱动也允许通过白名单自定义配置以便让用户设置应用程序的优先级。这个驱动必须
在系统中存在和正确配置,否则操作系统就不能有效路由工作负载到目标处理器核心。
要使用Intel Turbo Boost Max Technology 3.0需要同时满足条件:
CPU处理器支持 (需要检查Intel CPU功能)
操作系统支持
驱动和相应的应用软件
X99或X299主板并使用激活BIOS/firmware支持
和Intel Turbo Boost Technology 2.0不同的是,3.0版本允许单核心更高的主频。
Intel Turbo Boost Max技术的软件用户接口和驱动允许用户优先将负载直接调度到最快的CPU核心上。
支持
Core List
是处理器核心的顺序列表,最高性能的core位于最高。更改列表顺序可能会重新以对应性能来表述处理器核心。在操作系统的core序号体系和处理器序号体系相关。例如,Core 0对应逻辑处理器0和1,Core 1对应逻辑处理器2和3。
注意
当每个CPU核心最大主频超过时钟 -
Overclocking Enabled
显示了Core List的优先级。
Turbo Boost Max技术哈支持设置应用程序可以使用的CPU性能的百分比(阀值),以及评估时间间隔: 默认的评估时间间隔单位是100ms,默认值是10,也就是10x100ms=1s,即每秒评估一次;CPU使用阀值默认是90%,调整这个阀值会降低程序消耗的系统性能。
Intel CPU的P-state, C-state, Turbo Boost
Intel处理器从单核发展到多核提供了在同一个物理CPU核运行2个线程的Hpyer-threading以及Turbo Boost来提供最大性能。处理器核型可以完全关闭(CPU HALT, 主频降到0)来节约电能消耗,并且根据很多因素,如工作负载和问题,来调整处理器核心的工作主频。能耗是现代处理器设计的重要组成。
内核激活Intel P-state
内核启动参数需要激活P-state驱动后才能使用Turbo Boost功能。详细内核参数配置方法参考在Grub2中修改内核启动参数
修改
/etc/default/grub
配置行GRUB_CMDLINE_LINUX
添加intel_idle.max_cstate=1 intel_pstate=enable processor.max_cstate=1
执行配置生效
安装工具
CentOS/RHEL安装工具
程序 | 软件包 | 说明 |
lscpu | util-linux | 查看cpu拓扑 |
cpupower | kernel-tools | 检查和设置处理器能耗管理、主频等 |
turbostat | kernel-tools | 监控处理器负载、主频、温度、内存使用等 |
rdmsr / wrmsr | msr-tools | 读写MSR寄存器 |
Debian/Ubuntu安装工具
Debian/Ubuntu安装的内核工具是针对不同内核来安装的,所以有
linux-tools-generic
和linux-tools-generic-hwe
以及linux-tools-virtual
等等不同工具包。
cpupower
属于linux-tools-common
软件包,在安装linux-tools-generic
会依赖安装。
检查处理器信息
从/proc/cpuinfo
可以获取处理器信息
输出案例
model name
model name : Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz
表明处理器型号E5-2630
,并且标称主频是2.3GHz
。
cpu MHz : 2299.820
cpu MHz : 2299.820
是当前处理器核心的主频,注意,单个CPU core有2个HT,CPU core的主频反映在两个HT上都是相同的。可以通过rdmsr
从MSR寄存器198H
读取处理器当前主频。
检查处理器拓扑
lscpu
不带任何参数则显示处理器规格摘要:
输出处理器表
显示
可以看到前述/proc/cpuinfo
中显示的逻辑处理器24个,实际是12个CPU核心,通过Hyper-threading技术显示为24个逻辑处理器。
要注意处理器核心的物理位置,跨socket调用会延迟性能。
L1d
表示L1 data
即一级数据缓存;L1i
表示L1 instruction
即一级指令缓存。也就是一级缓存区分为数据缓存和指令缓存两种。
L2
也是CPU核心内使用缓存;L3
缓存则是所有物理核心共享的缓存。
P-state
从Linux Kernel 3.9(2009年4月),一个新的intel_pstate加入到内核中,从SandbyBridge处理器开始,后续多代Intel处理器都得到了支持。
intel_pstate
驱动支持现代Intel处理器的温控。
处理器P-state
是支持处理器运行在不同电压 和/或 主频级别的能力。总的来说,P0
是最高性能级别,而P1
和P2
等依次节约电能但是带来潜在的性能损失。
在Linux内核启动参数中设置intel_pstate=disable
选项可以强制使用传统遗留的CPU驱动acpi_cpufreq
。
C-state
C-state
是idle power saving状态,也就是P-state的相反状态,是执行节电的状态。
当处理器处于P-state
状态时,处理器仍然在执行指令;当处理器处于C-state
时(除了C0
),则处理器是idle状态,也就是没有执行任何指令。
C-state
:
C0
是操作状态,意味着CPU在做一些有效工作C1
是第一个idle状态C2
是第二个idle状态:外部I/O控制器Hub阻断发给处理器的中断依次类推
当一个逻辑处理器idle是(除了C0
以外的C-state
),它的主频通常是0(HALT):
cpupower idle-info
命令列出支持的C-State
:
注意:系统必须加载了
intel_idle
驱动之后才能使用-m Idle_Stats
模块,才能列出支持的C-state
,否则输出如下:
cpupower monitor -l
可以列出所有可以监控的模块(也就是cpupower monitor
输出的所有列可以按照模块来过滤选择)
例如,我要监控Idle_Stats
(注意大小写)
则输出C-state
的情况
Turbo Boost
检查处理器性能
检查处理器主频
cpupower frequency-info
注意:使用
cpupower frequency-info
显示的当前cpu 0主频是一个约数,不精确且有延迟。最好采用cpupower monitor -m Mperf
检查能够获取精确的CPU主频,且即使没有使用intel_pstate
驱动也能够准确获取频率。
检查处理器主频
cpupower monitor -m Mperf
可以看到
Cx
显示的就是处理器idle的状态
Turbo Boost MSR
MSR 0x1a0
的第38
位用于检查是否激活了Turbo Boost
这里输出值如果是0
则表示激活了Turbo Boost,而数值1
表示no turbo
如果上述命令不工作,可能需要加载msr
内核模块,即执行sudo modprobe msr
。
intel_pstate/no_turbo
intel_pstate/no_turbo
可以在intel_pstate
驱动中关闭turob
(设置intel_pstate/no_turbo
值为1)
要检查是否启用和停止Turbo,可以通过
cat /sys/devices/system/cpu/intel_pstate/no_turbo
来检查
Turbo Boost也可以在运行时通过禁止intel_pstate
驱动来关闭:
注意:这里禁用
intel_pstate
之后,处理器主频会跌到物理主频的最小值,此时需要通过MSR寄存器199H
来静态设置目标性能状态值(Target performance State Value
)
也可以激活intel_pstate
驱动:
注意:这个
intel_pstate/status
入口必须在激活Turbo Boost之后才会存在,
读取CPU主频
cpupower
提供了frequency-info
指令可以读取CPU的主频
注意,默认没有指定cpu参数则读取cpu 0
主频。要读取指定cpu的主频,需要使用-c
参数,例如,读取cpu 31
的主频
不过,cpupower frequency-info
是通过intel_pstate
驱动来获取信息的,所以如果使用 echo off |sudo tee /sys/devices/system/cpu/intel_pstate/status
禁用了intel_pstate
驱动,则该指令失效。
可以通过cpupower monitor
指令来获取CPU主频,该指令是直接读取MSR 198H
来直接获取CPU主频信息,所以即使禁用了intel_pstate
驱动也可以获得准确的数据。
输出显示类似
使用turbostat
读取主频
turbostat
读取主频turbostat
默认10秒刷新一次,可以使用-i 1
可以1
秒刷新一次
这里参数:
Avg_MHz
是平均主频,基于APERF
Busy%
表示处理器繁忙百分比Bzy_MHz
是实际的busy frequency,基于MPERF
TSC_MHz
是固定主频,TSC基于Time Stamp Counter
APERF
(average) andMPERF
(maximum) 是MSR寄存器可以提供当前CPU主频信息。
/proc/cpuinfo
中的主频信息
/proc/cpuinfo
中的主频信息在/proc/cpuinfo
中有一个信息是cpu MHz
在2016年4月,Len Brown发布的patch修改了cpuinfo中计算主频的方法,采用了APERF
和MPERF
MSR来计算CPU主频:Calculate MHz using APERF/MPERF for cpuinfo and scaling_cur_freq
操作系统启动时,在系统日志中记录了TSC主频:
显示输出
cpupower
工具获取主频
cpupower
工具获取主频cpupower
工具提供了多种方法读取处理器主频:
输出
如果启用了
intel_pstate
,也可以通过for core in $(seq 0 31); do sudo cpupower -c $core frequency-info|grep 'current CPU'; done
(假设这里服务器是32个HT)
rdmsr/wrmsr
Intel处理器的MSR中性能状态值:目标性能状态值
Target performance State Value
(199H)和当前性能状态值Current performance State Value
读取MSR寄存器
读取的值需要乘以
100
才是实际的值。例如,198H
值1900
表示值是(1x16+9)x100=2500
(2.5GHz),198H
值1b00
表示值是(1x16+11)x100=2700
(2.7GHz)。
禁用
intel_pstate
驱动:要通过wrmsr
工具调整199H
MSR,需要确保停用intel_pstate
驱动,否则调整值会被intel_pstate
驱动自动覆盖无法生效。
要调整主频需要通过
wrmsr
写入MSR寄存器
wrmsr
使用参考 wrmsr
wrmsr
只支持-p
(指定处理器)和-a
(所有处理器)参数
然后检查性能设置值
检查性能当前值可以看到和设置值一致
检查主频,可以看到cpu 0/12
增加了100MHz,达到了2.6GHz
此时可以不断通过修改199H
MSR实现处理器主频调整。
最后,测试完成后恢复
intel_pstate
驱动
电源管理策略
检查当前电源管理可选的策略列表
可以看到intel_pstate
支持的cpufreq策略只有两种performance
和powersave
。
检查当前激活的电源管理策略
可以看到输出
修改成
performance
策略:
测试
在上述调整处理器主频过程中,可以通过脚本不断压测处理器,以得到处理器主频值。
性能测试可以通过计算pi来实现,以下
scale=20000
表示计算pi的精度是2万位:
如果要压所有的CPU满负荷,以确定Trubo Boost主频,可以采用如下
yes.sh
脚本
然后启用对24
核服务器压测,每个脚本都通过taskset
指令绑定到独立CPU上
对于进程pid,可以采用
taskset -cp <cpu N> <pid>
来设置进程<pid>
到处理器<cpu N>
运行。
异常排查
系统内核明确设置了
intel_pstate=enable
但是启动之后,依然出现如下报错
BIOS开启turbo没有成功导致。
参考
Balancing Power and Performance in the Linux Kernel - Intel开源中心提供的有关能耗和性能平衡的介绍文档
Last updated