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-genericlinux-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是最高性能级别,而P1P2等依次节约电能但是带来潜在的性能损失。

在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驱动中关闭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默认10秒刷新一次,可以使用-i 1可以1秒刷新一次

这里参数:

  • Avg_MHz是平均主频,基于APERF

  • Busy%表示处理器繁忙百分比

  • Bzy_MHz是实际的busy frequency,基于MPERF

  • TSC_MHz是固定主频,TSC基于Time Stamp Counter

APERF (average) and MPERF (maximum) 是MSR寄存器可以提供当前CPU主频信息。

/proc/cpuinfo中的主频信息

/proc/cpuinfo中有一个信息是cpu MHz

在2016年4月,Len Brown发布的patch修改了cpuinfo中计算主频的方法,采用了APERFMPERF MSR来计算CPU主频:Calculate MHz using APERF/MPERF for cpuinfo and scaling_cur_freq

操作系统启动时,在系统日志中记录了TSC主频:

显示输出

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 Performance state
  • 读取MSR寄存器

读取的值需要乘以100才是实际的值。例如,198H1900表示值是 (1x16+9)x100=2500 (2.5GHz),198H1b00表示值是(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策略只有两种performancepowersave

  • 检查当前激活的电源管理策略

可以看到输出

  • 修改成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没有成功导致。

参考

Last updated

Was this helpful?