CPU 频率缩放
CPU 性能缩放使操作系统能够向上或向下调整 CPU 频率,以节省电量或提高性能。缩放可以根据系统负载自动进行,响应 ACPI 事件进行调整,或由用户空间程序手动更改。
Linux 内核通过 CPUFreq 子系统提供 CPU 性能缩放,该子系统定义了两层抽象:
默认的缩放驱动程序和调度器会自动选择,但用户空间工具如 cpupower、acpid、Laptop Mode Tools 或为您的桌面环境提供的 GUI 工具,仍可用于高级配置。
用户空间工具
i7z
i7zAUR 是一个用于 Linux 的 i7 (现在包括 i3, i5, i7, i9) CPU 报告工具。可以通过终端命令 i7z 启动,或通过 i7z-gui 作为 GUI 启动。
turbostat
turbostat 可以显示现代 Intel 和 AMD CPU 的频率、功耗、空闲状态和其他统计信息。
cpupower
cpupower 是一套用于协助 CPU 频率缩放的用户空间工具。该软件包不是使用缩放所必需的,但强烈推荐,因为它提供了有用的命令行工具和一个 systemd 服务,用于在启动时更改调度器。
cpupower 的配置文件位于 /etc/default/cpupower。该配置文件由 /usr/lib/systemd/scripts/cpupower 中的一个 bash 脚本读取,该脚本由 systemd 通过 cpupower.service 激活。您可能需要 启用 cpupower.service 以在启动时开始运行。
thermald
thermald 是一个用于防止 Intel CPU 过热的 Linux 守护进程。该守护进程使用 P-states、T-states 和 Intel power clamp 驱动程序主动控制热参数。thermald 也可以用于旧款 Intel CPU。如果最新驱动程序不可用,则该守护进程将回退到 x86 模型特定寄存器和 Linux "cpufreq 子系统" 来控制系统冷却。
默认情况下,它使用可用的 CPU 数字温度传感器监控 CPU 温度,并在硬件采取激进的纠正措施之前保持 CPU 温度在控制之下。如果 thermal sysfs 中存在皮肤温度传感器,则它会尝试将皮肤温度保持在 45°C 以下。
在 Tiger Lake 笔记本电脑上(例如 Dell Latitude 3420),据报道该守护进程解锁了比可用性能更高的性能。
相关的 systemd 单元是 thermald.service,应启动并启用。有关更多信息,请参阅 thermald(8)。
power-profiles-daemon
来自 power-profiles-daemon 的 powerprofilesctl 命令行工具通过 power-profiles-daemon 服务处理电源配置文件(例如,平衡、节能、性能)。GNOME 和 KDE 也提供了图形界面进行配置文件切换;请参阅以下内容:
有关使用、用例和与类似项目比较的更多信息,请参阅项目的 README。
启动/启用 power-profiles-daemon 服务。请注意,当启动 powerprofilesctl 时,它还会尝试启动服务(请参阅 dbus.service 的单元状态)。
tuned
tuned 是一个用于监控和自适应调整系统设备的守护进程。它可以配置 GPU 电源模式、PCIe 电源管理、设置 sysctl 设置、调整内核调度器等;它也是一个配置系统中电源管理方面的守护进程。
在 2.23.0 版本发布时,该项目附带了 tuned-ppd,这是一个为为 power-profiles-daemon 编写的程序(如以下程序)提供的兼容层:
有关为什么应该使用 tuned 而不是 power-profiles-daemon 的原因,请参阅 Fedora 将其替换为 tuned 的提案。有关相反的论点,请参阅 [3]。
启动/启用 tuned 守护进程服务。为兼容 power-profiles-daemon,也启动/启用 tuned-ppd 服务。要从命令行控制 tuned,请使用 tuned-adm 查看、设置和推荐配置文件。
/etc/tuned/ppd.conf。要设置每当程序选择一个 power-profiles-daemon 配置文件时使用哪个 tuned 配置文件,请编辑该文件,其中包含了所有 power-profiles-daemon 模式和电池检测。cpupower-gui
cpupower-gui-gitAUR 是一个旨在协助 CPU 频率调整的图形化工具。该 GUI 基于 GTK,旨在提供与 cpupower 相同的选项。cpupower-gui 可以启用或禁用核心,并为每个核心更改最大/最小 CPU 频率和调速器。该应用程序通过 polkit 处理权限授予,并允许 wheel 用户组中的任何已登录用户更改频率和调速器。有关 cpupower-gui.service 和 cpupower-gui-user.service 的更多信息,请参阅 cpupower-gui systemd units。
gnome-shell-extension-cpupower
gnome-shell-extension-cpupower-gitAUR 是一个 GNOME Shell 扩展,可以更改最小/最大 CPU 频率并启用/禁用频率提升。
auto-cpufreq
auto-cpufreqAUR 是一个适用于 Linux 的自动 CPU 速度和功耗优化器,基于对笔记本电池状态、CPU 使用率、CPU 温度和系统负载的主动监控。
nvidia-powerd
nvidia-powerd 守护进程支持在支持的笔记本电脑平台上使用 NVIDIA 的动态 Boost 技术。它作为一个系统范围的电源控制器,根据工作负载需求动态地重新分配 GPU 和 CPU 之间的功耗,同时保持系统的总热预算。[4]
启动/启用 nvidia-powerd 服务,该服务由 nvidia-utils 软件包提供。
nvidia-settings -q DynamicBoostSupport 进行验证)。缩放驱动程序
缩放驱动程序通过与 CPU 硬件交互来实现频率缩放的控制。它们可以与缩放调度器进行通信以进行通用频率控制(ACPI 2.0 标准引入了电源性能状态 ("P-states")),但也可以具有附加功能(例如基于硬件的 P-States,允许 CPU 自主管理频率)。[5]
CPUFreq 缩放驱动程序会自动加载。scaling_driver |
描述 |
|---|---|
acpi_cpufreq |
使用 ACPI 电源性能状态 (P-States)。此驱动程序还支持 Intel Enhanced SpeedStep(以前由已弃用的 speedstep_centrino 模块支持)。对于 AMD Ryzen,它只提供 3 种频率状态。 |
amd_pstate |
此驱动程序有三种模式,对应于不同程度的 CPU 硬件自主性:active、passive 和 guided。自内核版本 6.5 起,在支持的 CPU(Zen 2 及更新版本)上,amd_pstate CPU 电源缩放驱动程序会自动在“active 模式”下使用。有关详细信息,请参阅 #amd_pstate。 |
amd_pstate_epp |
此驱动程序实现了由 amd_pstate=active 选中的缩放驱动程序,并为 AMD Ryzen(部分 Zen 2 及更新版本)处理器提供了一个内部调度器。 |
cppc_cpufreq |
基于 ACPI 的较新的 CPPC 系统(请参阅 #Collaborative processor performance control)。AArch64 系统上的常见默认值。在现代 x86 上也能工作,但 intel_pstate 和 amd_pstate 驱动程序实现了额外的硬件特定功能。 |
intel_cpufreq |
当 intel_pstate 处于“passive 模式”时报告的 scaling_driver[6]。 |
intel_pstate |
适用于 Intel 处理器(Sandy Bridge 及更新版本)的现代频率调整驱动程序。对于这些处理器,它会自动使用,而不是下面的其他驱动程序。此驱动程序优先于其他驱动程序,并且是内置的,而不是模块。默认情况下,如果处理器支持硬件管理 P 状态 (HWP),Intel 称之为 Speed Shift Technology (SST)(Skylake 处理器及更新版本),intel_pstate 将选择“Active Mode”。如果处理器不支持 HWP(或在使用 intel_pstate=no_hwp 参数时),则 intel_pstate 将选择“Passive Mode”,报告的 scaling_driver 字符串将是“intel_cpufreq”。如果您在使用此驱动程序时遇到问题,可以通过将 intel_pstate=disable 添加到您的 内核参数来恢复到 acpi_cpufreq 调整驱动程序。有关更多详细信息,请参阅 intel_pstate 文档。 |
p4_clockmod |
Intel Pentium 4/Xeon/Celeron 处理器的 CPUFreq 驱动程序,通过跳过时钟来降低 CPU 温度。(您可能更想使用 speedstep_lib。) |
pcc_cpufreq |
此驱动程序支持 Hewlett-Packard 和 Microsoft Corporation 的 Processor Clocking Control 接口,这在某些 ProLiant 服务器上很有用。 |
powernow_k8 |
K8/K10 Athlon 64/Opteron/Phenom 处理器的 CPUFreq 驱动程序。自 Linux 3.7 起,对于更现代的 AMD CPU,将自动使用 'acpi_cpufreq'。 |
speedstep_lib |
支持 Intel SpeedStep 处理器的 CPUFreq 驱动程序(主要是 Atom 和较旧的 Pentium 处理器) |
要查看可用模块的完整列表,请运行:
$ ls /usr/lib/modules/$(uname -r)/kernel/drivers/cpufreq/
加载适当的模块(有关详细信息,请参阅 内核模块)。一旦加载了适当的 cpufreq 驱动程序,就可以通过运行以下命令显示 CPU 的详细信息:
$ cpupower frequency-info
设置最大和最小频率
在某些情况下,可能需要手动设置最大和最小频率。
要设置最高时钟频率(clock_freq 是带单位的时钟频率:GHz、MHz)
# cpupower frequency-set -u clock_freq
要设置最低时钟频率
# cpupower frequency-set -d clock_freq
要将 CPU 设置为以指定频率运行
# cpupower frequency-set -f clock_freq
- 要仅为单个 CPU 核心进行调整,请添加
-c core_number。 - 调度器、最大和最小频率可以在
/etc/default/cpupower中设置。
或者,您可以手动设置频率
# echo value | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
可用值可以在 /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_frequencies 或类似文件中找到。[7]
配置频率提升
某些处理器支持在适当的热条件下,在短时间内将其频率提高到正常最大值以上。在 Intel 处理器上,这称为 Turbo Boost,在 AMD 处理器上,这称为 Turbo-Core。
通过 sysfs 设置 (intel_pstate)
intel_pstate 有一个特定于驱动程序的接口,用于禁止处理器进入 turbo P-States。
# echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
通过 sysfs 设置 (其他缩放驱动程序)
对于 intel_pstate 以外的缩放驱动程序,如果驱动程序支持提升,则会存在 /sys/devices/system/cpu/cpufreq/boost 属性,可用于禁用/启用提升。
要禁用提升,请运行:
# echo 0 > /sys/devices/system/cpu/cpufreq/boost
要启用提升,请运行:
# echo 1 > /sys/devices/system/cpu/cpufreq/boost
通过 x86_energy_perf_policy 设置
在 Intel 处理器上,x86_energy_perf_policy 也可用于配置 Turbo Boost。
# x86_energy_perf_policy --turbo-enable 0
amd_pstate
amd_pstate 有三种操作模式:CPPC 自主(active)模式、CPPC 非自主(passive)模式和 CPPC 引导自主(guided)模式。官方支持的内核在构建时使用 CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3,这意味着它们的默认值是 active 模式。这可以通过内核参数 amd_pstate=active、amd_pstate=passive 或 amd_pstate=guided 进行更改。要回退到 acpi_cpufreq 驱动程序,请改用 amd_pstate=disable。
- Active 模式
active模式由amd_pstate_epp(Energy Performance Preference)驱动程序实现。在此模式下,当软件希望将 CPPC 固件偏向性能(0x0)或能耗效率(0xff)时,amd_pstate_epp驱动程序会向硬件提供提示。- Passive 模式
passive模式由amd_pstate驱动程序实现。在此模式下,驱动程序根据当前工作负载定义所需的性能,特别是能够容忍多少性能下降而不影响生活质量。- Guided 模式
guided模式由amd_pstate驱动程序实现。在此模式下,amd_pstate驱动程序请求最小和最大性能级别,平台会自动选择此范围内的性能级别,并适合当前工作负载。
the _CPC object is not present in SBIOS or ACPI disabled 错误。将 Enable CPPC(通常在 AMD CBS > NBIO > SMU > CPPC 中找到)从 Auto 更改为 Enabled,或更改 UEFI 中的任何类似设置。如果它们不存在,请查阅供应商网站以获取更新,或检查主板是否隐藏了显示高级 UEFI 选项的方法。缩放调度器
缩放调度器是确定 CPU 所需频率的电源方案。一些请求恒定频率,另一些则实现算法以根据系统负载动态调整。内核中包含的调度器有:
intel_pstate 和 amd_pstate 在 active 模式下是例外,它们提供 powersave 和 performance 的伪调度器。请参阅下面的 #Autonomous frequency scaling。| 调度器 | 描述 |
|---|---|
| performance | 以最高频率运行 CPU,该频率从 /sys/devices/system/cpu/cpuX/cpufreq/scaling_max_freq 获取。 |
| powersave | 以最低频率运行 CPU,该频率从 /sys/devices/system/cpu/cpuX/cpufreq/scaling_min_freq 获取。 |
| userspace | 以用户指定的频率运行 CPU,可通过 /sys/devices/system/cpu/cpuX/cpufreq/scaling_setspeed 进行配置。 |
| ondemand | 根据当前负载动态调整频率。跳到最高频率,然后随着空闲时间的增加可能回落。 |
| conservative | 根据当前负载动态调整频率。与 ondemand 相比,频率调整更渐进。 |
| schedutil | 调度器驱动的 CPU 频率选择 [8],[9]。 |
根据缩放驱动程序的不同,默认会加载以下调度器之一:
- 自 Linux 4.9.5 起的
schedutil。 - 使用
intel_pstate和amd_pstate驱动程序的 Intel 和 AMD CPU 的内部powersave调度器(参见上面的注释,它等同于schedutil)。
要激活特定的调度器,请运行:
# cpupower frequency-set -g governor
- 要仅为单个 CPU 核心进行调整,请在上面的命令中添加
-c core_number。 - 激活调度器需要加载特定的 内核模块(名为
cpufreq_governor)。自内核 3.4 起,这些模块会自动加载。
或者,您可以手动为所有可用的 CPU 激活一个调度器:
# echo governor | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
$ watch cat /sys/devices/system/cpu/cpu[0-9]*/cpufreq/scaling_cur_freq
调整 ondemand 调度器
有关详细信息,请参阅 内核文档。
切换阈值
要设置步进到另一个频率的阈值:
# echo -n percent > /sys/devices/system/cpu/cpufreq/governor/up_threshold
要设置步退到另一个频率的阈值:
# echo -n percent > /sys/devices/system/cpu/cpufreq/governor/down_threshold
采样率
采样率决定了调度器检查调整 CPU 的频率。sampling_down_factor 是一个可调参数,当 CPU 处于最高时钟频率时,它会乘以采样率,从而延迟负载评估并提高性能。sampling_down_factor 的允许值范围是 1 到 100000。此可调参数对较低 CPU 频率/负载下的行为没有影响。
要读取值(默认 = 1),请运行:
$ cat /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor
要设置值,请运行:
# echo -n value > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor
使更改永久生效
自 Linux 5.9 起,可以设置 cpufreq.default_governor 内核选项。[10] 要在启动时设置所需的缩放参数,请配置 cpupower 工具并启用其 systemd 服务。或者,可以使用 systemd-tmpfiles 或 udev 规则。
自主频率缩放
Intel 和 AMD 都定义了一种方法,让 CPU 根据(1)系统的性能范围和(2)指定偏好的性能/功耗提示来决定自己的速度。完全自主模式在以下情况激活:
amd_pstate设置为 "active" - 需要 CPU *和* BIOS 支持 CPPC;intel_pstate设置为 "active" *并且* 硬件 P-state (HWP) 可用(即 Sandy Bridge 及更新版本)- 开箱即用。
Active 调度的最重要特性是只有两个调度器可用:powersave 和 performance。它们的工作方式与它们的普通对应项*完全不同*:这些级别被翻译为 CPU 内部调度器的 *Energy Performance Preference* 提示。因此,它们都提供动态缩放,类似于 schedutil 或 ondemand 通用调度器,主要区别在于延迟。performance 算法应比旧的 ondemand 调度器为 Intel HWP 提供更好的节能功能。
Intel 主动,非 HWP
intel-pstate 驱动程序有一个(令人困惑的)“active”模式,可以在没有 CPU 主动决策的情况下工作。当内核命令行强制“active”模式但 HWP 不可用或禁用时,此模式会开启。它仍然只提供 powersave 和 performance,但驱动程序本身以类似于 schedutil 和 performance(即保持在最高 P-state)的方式进行管理。与 passive intel-pstate 相比,此模式没有实际优势。
设置 EPP
可以通过可用的 sysfs 接口选择中间提示。AMD 和 Intel 之间的接口相同,其中文件 /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference 描述当前偏好,/sys/devices/system/cpu/cpu*/cpufreq/energy_performance_available_preferences 提供可用偏好列表。也可以传递一个介于 0(偏好性能)和 255(偏好能耗)之间的数字。对于没有 EPP 的 Intel CPU,提供了一个回退实现,将字符串转换为 EPB 级别(在下一节中描述),但在数字上会失败。
x86_energy_perf_policy 支持通过 --hwp-epp 开关在 *仅限* Intel CPU 上配置 EPP 提示。它通过直接访问机器特定寄存器 (MSR) 来工作,这些寄存器在 Intel 和 AMD 之间有所不同。该程序还可以使用频率乘数范围来限制 HWP 频率的范围。
使用 x86_energy_perf_policy(8) 启用硬件 P-States:
# x86_energy_perf_policy -H 1 # x86_energy_perf_policy -U 1
协同处理器性能控制
现代 CPU 的功耗不再仅仅取决于频率或电压设置,因为有模块可以在需要时打开。协同处理器性能控制 (CPPC) 是 ACPI 5.0 提供的 P-state 替代方案。处理器不是定义静态频率级别的表,而是提供许多抽象的*性能级别*,操作系统从中选择。有两个优点:
- 不再有 16 个 P-state 条目的限制;典型的 CPU 提供数百个级别可供选择。
- 当某些部分(例如,向量 FPU)未使用时,CPU 可以为性能级别提供更高的频率(例如,提升)。
另一方面,灵活的频率会破坏频率不变的利用率跟踪,这对于 schedutil 的快速频率更改很重要。已使用许多特定于供应商的方法来在 CPPC 下使频率保持静态,其中 arm64 取得了最大的成功。
cppc_cpufreq 是通用的 CPPC 缩放驱动程序。当 Zen 3 MSR 不可用时,amd_pstate 也使用 ACPI CPPC 来管理 CPU 频率 - 这种方法也称为“共享内存”,其延迟比 MSR 更高。
Intel 性能和能耗偏好提示
Intel performance and energy bias hint (EPB) 是 Intel CPU 提供的一个接口,允许用户空间在 0(最高性能)到 15(最高节能)的范围内指定所需的功耗-性能权衡。EPB 寄存器是独立于频率缩放的另一个性能管理层。它会影响 P-state 和 C-state 选择的激进程度,并告知内部特定于模型的决策,这些决策会影响能耗。
sysfs 和 x86_energy_perf_policy(8) 识别的常见值及其别名如下:
| EPB 值 | 字符串 |
|---|---|
| 0 | performance |
| 4 | balance-performance |
| 6 | normal, default |
| 8 | balance-power |
| 15 | power |
通过 sysfs 设置
可以使用 sysfs 属性设置 EPB:
# echo epb | tee /sys/devices/system/cpu/cpu*/power/energy_perf_bias
通过 x86_energy_perf_policy 设置
# x86_energy_perf_policy --epb epb
通过 cpupower 设置
使用 cpupower
# cpupower set -b epb_value
与 ACPI 事件的交互
用户可以配置调速器,使其根据不同的 ACPI 事件(例如连接 AC 适配器或合上笔记本电脑盖子)自动切换。下面给出了一个快速示例;但是,您可能需要阅读有关 acpid 的完整文章。
事件在 /etc/acpi/handler.sh 中定义。如果安装了 acpid 包,该文件应该已经存在并且可执行。例如,要在断开 AC 适配器时将调速器从 performance 更改为 conservative,并在重新连接时改回
/etc/acpi/handler.sh
[...]
ac_adapter)
case "$2" in
AC*)
case "$4" in
00000000)
echo "conservative" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo -n $minspeed >$setspeed
#/etc/laptop-mode/laptop-mode start
;;
00000001)
echo "performance" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo -n $maxspeed >$setspeed
#/etc/laptop-mode/laptop-mode stop
;;
esac
;;
*) logger "ACPI action undefined: $2" ;;
esac
;;
[...]
故障排除
BIOS 频率限制
某些 CPU/BIOS 配置在扩展到最大频率或以任何方式扩展到更高频率时可能存在困难。这很可能是由于 BIOS 事件指示操作系统限制频率,导致 /sys/devices/system/cpu/cpu0/cpufreq/bios_limit 设置为较低的值。
您可能刚刚在 BIOS 设置实用程序中进行了特定设置(频率、热管理等),您可以责怪有 bug/过时的 BIOS,或者 BIOS 可能有充分的理由自行限制 CPU。
例如,这可能是(假设您的机器是笔记本电脑)电池已卸下(或电量不足),因此您只能使用交流电源。在这种情况下,功率不足的交流电源可能无法提供足够的电力来满足整个系统的极端峰值需求,并且由于没有电池可以辅助,这可能导致数据丢失、数据损坏或最坏情况下甚至硬件损坏!
并非所有 BIOS 都会在这种情况下限制 CPU 频率,但例如,大多数 IBM/Lenovo Thinkpad 会。有关此主题的更多 thinkpad 相关信息,请参阅 thinkwiki。
如果您检查发现并非仅仅是奇怪的 BIOS 设置,并且您知道自己在做什么,那么您可以让内核忽略这些 BIOS 限制。
- 请确保您已阅读并理解以上部分。CPU 频率限制是 BIOS 的一项安全功能,您不需要对其进行规避。
- 这样做**不**推荐,并且可能严重损坏您的硬件:请自行承担风险。 [11]
设置 processor.ignore_ppc=1 内核参数。要临时尝试此操作,请将 /sys/module/processor/parameters/ignore_ppc 中的值从 0 更改为 1。
某些系统使用另一种机制来限制 CPU 频率,例如,在没有电池或使用非官方电源适配器运行时。请参阅 Lenovo ThinkPad T480#CPU 卡在最低频率,了解如何操纵 Intel CPU 中的 BD PROCHOT 位,以及 Dell XPS 15 (9560)#总体缓慢和卡顿,了解其他修复方法。这不仅适用于 Lenovo ThinkPad T480,也是 Dell XPS 型号(如 XPS15 9550 和 XPS15 9560)中的常见问题。该位也导致至少一些基于 Intel 的 MacBook 在未连接电池时以最低 CPU 频率运行。