[转帖]谁动了我的 CPU 频率 —— CPU 性能之迷 Part 2

目录:

为何有本文

很多人知道 CPU 频率会影响 CPU 性能,也知道频率会动态变化,且知道 Linux 有 performance/powersave 两种频率控制策略。但很少人知道背后的软件原理,更少人知道如何调优策略,和监控实际 CPU 频率。本文想聊聊这些。

如,一个 CPU,有一堆特性,如何充分合理利用?

本文是 《CPU 性能之迷》系列的 Part 2。系列列表:

  1. 谁动了我的 CPU 频率 —— CPU 性能之迷 Part 2(本文)

本系列的写作背景和原因在 Part 1 中介绍过,这里不重复了。

什么是动态 CPU 频率

以下部分内容参考:CPU Performance Scaling

Operating Performance Pointsp-state
p-statep-state
p-state CPU 性能伸缩(CPU performance scaling) CPU 频率伸缩(CPU frequency scaling)

什么是 p-state

Linux CPU 性能伸缩(CPU performance scaling)

CPUFreq
缩放核心(CPUFreq core)CPUFreq core通用代码基础设施用户空间接口缩放调控器(scaling governors)缩放调控器(scaling governors)scaling governors缩放算法(scaling algorithm)缩放驱动程序(scaling drivers)scaling driversscaling governorsp-statescaling governorsp-state
scaling governorsscaling driversscaling algorithmp-statescaling algorithmscaling driversscaling governors
scaling algorithmCPUFreqscaling driversscaling governorsscaling algorithmintel_pstatescaling drivers

以下是我画的说明图:

CPUFreq Policy(CPU 频率缩放策略)

p-statep-stateCPUFreq Policystruct cpufreq_policy
CPUFreq PolicyCPUscaling driversscaling governorsCPU Scheduler

上图是我按照 CPU Performance Scaling - CPU Initialization 一文的文字来画的。想看细节和文字解释的同学可以细看这文章。

CPUFreq Policy 的 sysfs 文件接口

先来举个栗子,看看我的机器的文件目录结构:

这是有两个 socket Intel CPU 的 NUMA 机器,每 socket CPU 有 20 core,每个 core 有 2 个 超线程,共 2 * 20 * 2 = 80 个逻辑 CPU。

CPUFreq Policy
CPUFreq Policy
CPUFreq Policy
CPUFreq core/sys/devices/system/cpu/cpufreq
CPUFreq corepolicyX
policyX/sys/devices/system/cpu/cpuY/cpufreq
/sys/devices/system/cpu/cpufreqpolicyXCPUFreq
CPUFreq corescaling driverscaling governorscaling driversysfs

policy 通用属性

/sys/devices/system/cpu/cpufreq/policyX/
policyXCPUFREQ_ETERNALCPUFreqx86scaling_available_governorsscaling_min_freqscaling_max_freq

通用的 Scaling Governor

sysfsscaling_governor/sys/devices/system/cpu/cpufreq/policyX/scaling_governorCPUFreq Policyscaling governors
scaling governorsysfsscaling governorscaling drivers
scaling driversscaling governors/sys/devices/system/cpu/cpufreq/policyX/sys/devices/system/cpu/cpufreq/
scaling governor

上面的例子中,因为是 Intel 缩放驱动程序(scaling drivers - intel_pstate),所以没有任何这样的子目录。

performance
scaling_max_freq
powersave
scaling_min_freq

非 Intel CPU 的 Frequency Boost Support

某些处理器支持在某些条件下临时提高多核封装中某些内核的工作频率(并高于整个封装的可持续频率阈值)的机制,例如,如果整个芯片未充分利用并且低于其预期的热或功率预算时开启。

Turbo BoostTurbo-Core频率提升(frequency boost)
frequency boostscaling driver

非 Intel CPU 的 boost 的 sysfs 文件接口

/sys/devices/system/cpu/cpufreq/boostscaling driver

如果该文件中的值为1,则启用频率提升机制。这意味着可以将硬件置于能够触发升压的状态(在基于硬件的情况下),或者允许软件触发升压(在基于软件的情况下)。这并不意味着目前在系统中的任何 CPU 上都实际使用了boost功能。它仅意味着允许使用频率提升机制(由于其他原因可能永远不会使用)。

如果该文件中的值为0,则频率提升机制被禁用。

可以写入此文件的值是 0 和 1。

Intel CPU 的 Scaling Driver

intel_pstateCPUFreqScaling Driver
intel_pstatep-state工作频率工作性能点 Operating Performance Pointsintel_pstatep-stateCPUFreq core频率Operating Performance Pointsintel_pstatep-stateintel_pstateCPUFreq coreCPUFreq core
intel_pstatep-stateintel_pstateCPUFreqCPUFreq
intel_pstatesysfs

操作模式 (Operation Modes)

intel_pstate
p-state主动模式 Active Modep-state主动模式 Active Mode被动模式 Passive Mode

它们中的哪一个会生效取决于所使用的内核命令行(内核启动参数)选项以及处理器的能力。

Active Mode

intel_pstateCPUFreqsysfsscaling_driverintel_pstate
CPUFreqscaling governorscaling governorCPUFreqsysfsscaling_governorp-state
scaling governorscaling governorscaling governorintel_pstatepowersavep-statepowersave governorschedutilondemand
intel_pstatep-statepowersaveperformancep-stateHWP
p-stateCONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCEperformance
Active Mode 且开启 HWP
Intel Speed Shift Technologyintel_pstate=no_hwp
p-statep-statep-state
p-stateintel_pstatep-statesysfsscaling_cur_freq
performance
intel_pstateEnergy-Performance Preference (EPP)Energy-Performance Bias (EPB)p-state
sysfs
p-stateintel_pstatep-state
powersave

不说明了,这个生产不常用。

Active Mode 且禁用 HWP

不说明了,这个生产不常用。

Passive Mode

intel_pstate=passiveintel_pstate=no_hwpHWPintel_pstate
CPUFreqsysfsscaling_driverintel_cpufreqCPUFreqscaling driverp-statescaling governorschedutil
intel_pstatesysfsscaling_available_governorsscaling governorp-stateCPUFreq coreTurbop-stateintel_pstateCPUFreq corescaling_cur_freqCPUFreqscaling governor

Turbo P-states Support

intel_pstatep-state
turbo threshold(阈值)
p-stateturbo p-statep-stateturbo 范围Turbo Boostp-stateturbo p-state
p-stateturbo p-state
Sandy Bridgep-statep-stateSandy Bridgeturbo p-statep-statep-statep-stateturbo p-statep-stateturbo p-state
turbo p-state
p-statep-state
turbo p-statep-state
sysfsno_turbo
sysfsno_turbo/sys/devices/system/cpu/intel_pstate/no_turboturbo p-state1intel_pstateturbo p-stateIntel Turbo Boost Technology

intel_pstate 的 sysfs 配置

Global Attributes

intel_pstatesysfs/sys/devices/system/cpu/intel_pstate/
intel_pstate=per_cpu_perf_limits
Scaling Governor

Intel(R) Speed Select Technology

实时监控 CPU 实际频率

以上是说原理和逻辑。但有运维经验的人也知道,内核逻辑每个版本都在变,硬件 CPU 也在变,如何做好实际的监控,才是硬道理。

corefreq-cli

CoreFreq, a CPU monitoring software with BIOS like functionalities, is designed for the 64-bits Processors of architecture Intel Atom, Core2, Nehalem, SandyBridge and superiors; AMD Families from 0Fh … up to 17h (Zen , Zen+ , Zen2), 18h (Hygon Dhyana), 19h (Zen3)

turbostat

cpupower

1
$ watch cat /sys/devices/system/cpu/cpu[0-9]*/cpufreq/scaling_cur_freq

内核日志

HWP 是否开启

静态配置