CPU 频率调节
CPU 性能调节 使操作系统能够提高或降低 CPU 频率,以节省电量或提高性能。 调节可以自动响应系统负载、响应 ACPI 事件进行自我调整,或由用户空间程序手动更改。
Linux 内核通过 CPUFreq 子系统提供 CPU 性能调节,该子系统定义了两个抽象层
默认情况下会自动选择调节驱动和调节器,但用户空间工具(如 cpupower、acpid、Laptop Mode Tools)或为您的桌面环境提供的 GUI 工具仍然可以用于高级配置。
用户空间工具
i7z
i7z 是一个用于 Linux 的 i7(以及现在的 i3、i5、i7、i9)CPU 报告工具。 可以从终端使用命令 i7z
或作为 GUI 使用 i7z-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 是一个 Linux 守护进程,用于防止 Intel CPU 过热。 此守护进程使用 P 状态、T 状态和 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 单元。
gnome-shell-extension-cpupower
gnome-shell-extension-cpupower-gitAUR 是一个 GNOME Shell 扩展,可以更改最小/最大 CPU 频率并启用/禁用频率加速。
auto-cpufreq
auto-cpufreqAUR 是一个用于 Linux 的自动 CPU 速度和电源优化器,基于对笔记本电脑电池状态、CPU 使用率、CPU 温度和系统负载的活动监控。
频率调节驱动
调节驱动实现了 governor 指定的设置频率的 CPU 特定细节。 严格来说,ACPI 标准要求电源-性能状态 (P-states),从 P0 开始,性能逐渐降低。 此功能在 Intel 上称为 SpeedStep,在 AMD 上称为 PowerNow!。
但在实践中,处理器提供了指定特定频率的方法,而不是仅限于固定的 P 状态,而这正是调节驱动程序处理的。
cpupower 需要驱动程序来了解原生 CPU 的限制
驱动程序 | 描述 |
---|---|
acpi_cpufreq |
CPUFreq 驱动程序,它利用 ACPI 处理器性能状态。 此驱动程序还支持 Intel Enhanced SpeedStep(以前由已弃用的 speedstep_centrino 模块支持)。 对于 AMD Ryzen,它仅提供 3 个频率状态。 |
amd_pstate |
此驱动程序具有三种模式,分别对应于 CPU 硬件的不同自主程度:主动模式、被动模式和引导模式。 自内核版本 6.5 起,在受支持的 CPU(Zen 2 和更新版本)上,amd_pstate CPU 电源调节驱动程序会自动在“主动模式”下使用。 有关详细信息,请参阅 #amd_pstate。 |
amd_pstate_epp |
此驱动程序实现了由 amd_pstate=active 选择的调节驱动程序,并带有用于 AMD Ryzen(某些 Zen 2 和更新版本)处理器的内部 governor。 |
cppc_cpufreq |
基于 ACPI CPPC 系统的 CPUFreq 驱动程序(请参阅 #协作式处理器性能控制)。 AArch64 系统上的常见默认设置。 也适用于现代 x86,但 intel_pstate 和 amd_pstate 驱动程序更好。 |
intel_cpufreq |
从内核 5.7 开始,intel_pstate 调节驱动程序为不支持硬件管理的 P 状态 (HWP) 的 CPU(即 Intel Core i 第 5 代或更早版本)选择“被动模式”,也称为 intel_cpufreq 。 此“被动”驱动程序在 Intel CPU 上的行为类似于 ACPI 驱动程序,只不过它没有 ACPI 的 16 个 P 状态限制。 |
intel_pstate |
此驱动程序实现了用于 Intel Core(Sandy Bridge 和更新版本)处理器的内部 governor 的调节驱动程序。 对于这些处理器,它会自动使用,而不是使用以下其他驱动程序。 此驱动程序优先于其他驱动程序,并且是内置的,而不是模块。 intel_pstate 可能会通过 intel_cpufreq 驱动程序为较旧的 CPU 以“被动模式”运行。 如果在使用此驱动程序时遇到问题,请将 intel_pstate=disable 添加到内核行中,以便恢复使用 acpi_cpufreq 驱动程序。 |
p4_clockmod |
用于 Intel Pentium 4/Xeon/Celeron 处理器的 CPUFreq 驱动程序,通过跳过时钟来降低 CPU 温度。 (您可能想要改用 speedstep_lib 。) |
pcc_cpufreq |
此驱动程序支持 Hewlett-Packard 和 Microsoft Corporation 的处理器时钟控制接口,该接口在某些 ProLiant 服务器上很有用。 |
powernow_k8 |
用于 K8/K10 Athlon 64/Opteron/Phenom 处理器的 CPUFreq 驱动程序。 自 Linux 3.7 起,对于更现代的 AMD CPU,将自动使用“acpi_cpufreq”。 |
speedstep_lib |
用于启用 Intel SpeedStep 的处理器(主要是 Atom 和较旧的 Pentium)的 CPUFreq 驱动程序 |
要查看可用模块的完整列表,请运行
$ 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
或类似位置找到。 [4]
配置频率加速
某些处理器支持在适当的热条件下,在短时间内将其频率提高到高于正常最大频率。 在 Intel 处理器上,这称为 Turbo Boost,而在 AMD 处理器上,这称为 Turbo-Core。
通过 sysfs 设置 (intel_pstate)
intel_pstate 具有特定于驱动程序的接口,用于禁止处理器进入 turbo P 状态
# 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 自主(主动)模式、CPPC 非自主(被动)模式和 CPPC 引导自主(引导)模式。 官方支持的内核 构建时带有 CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3
,这意味着它们的默认模式是主动模式。 可以使用 内核参数 amd_pstate=active
、amd_pstate=passive
或 amd_pstate=guided
更改此设置。 要恢复为 acpi_cpufreq
驱动程序,请改为设置 amd_pstate=disable
。
- 主动模式
active
模式由amd_pstate_epp
(能效偏好)驱动程序实现。 在此模式下,当软件想要将 CPPC 固件偏向性能 (0x0) 或能效 (0xff) 时,amd_pstate_epp
驱动程序会向硬件提供提示。- 被动模式
passive
模式由amd_pstate
驱动程序实现。 在此模式下,驱动程序根据当前工作负载定义所需的性能,特别是可以在不影响生活质量的情况下容忍多少性能下降。- 引导模式
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
在主动模式下除外,它们以 powersave
和 performance
的形式提供伪调节器。 请参阅下面的 #自主频率调节。调节器 | 描述 |
---|---|
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 频率选择 [5], [6]。 |
根据调节驱动程序,默认情况下会加载这些调节器之一
- 自 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
采样率
采样率确定 governor 检查以调整 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
内核选项。[7] 要在启动时设置所需的调节参数,请配置 cpupower 实用程序并启用其 systemd 服务。 或者,可以使用 systemd-tmpfiles 或 udev 规则。
自主频率调节
Intel 和 AMD 都定义了一种让 CPU 根据 (1) 系统的性能范围和 (2) 指定偏好的性能/功耗提示来决定自身速度的方法。 当满足以下条件时,完全自主模式将被激活
amd_pstate
设置为 “active” — 需要 CPU 和 BIOS 中的 CPPC 支持,intel_pstate
设置为 “active” 且 硬件 P 状态 (HWP) 可用(即 Sandy Bridge 和更新版本)— 开箱即用。
主动调节的最重要特征是只有两个调节器看起来可用,powersave
和 performance
。 然而,它们的工作方式完全不像其正常的对应项:这些级别被转换为 CPU 内部 governor 的能效偏好提示。 因此,它们都提供动态调节,类似于 schedutil
或 ondemand
通用 governor,主要区别在于延迟。 对于 Intel HWP,performance
算法应该比旧的 ondemand governor 提供更好的节能功能。
Intel 主动式,非 HWP
令人困惑的是,intel-pstate 驱动程序有一种在没有 CPU 主动决策的情况下工作的 “active” 模式。 当内核 cmdline 强制 “active” 模式但 HWP 不可用或禁用时,此模式会开启。 它仍然只会提供 powersave
和 performance
,但驱动程序本身以类似于 schedutil
和 performance
的方式进行调节(即,它保持在最大 P 状态)。 与被动 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 支持仅通过 Intel CPU 上的 --hwp-epp
开关配置 EPP 提示。 它通过直接访问机器特定寄存器 (MSR) 工作,这些寄存器在 Intel 和 AMD 之间有所不同。 该程序还可以使用频率乘数范围来限制 HWP 频率范围。
要使用 x86_energy_perf_policy(8) 启用硬件 P 状态
# x86_energy_perf_policy -H 1 # x86_energy_perf_policy -U 1
协作式处理器性能控制
现代 CPU 的功耗不再仅仅取决于频率或电压设置,因为有些模块可以根据需要打开。 协作式处理器性能控制 (CPPC) 是 ACPI 5.0 提供的 P 状态替代方案。 处理器不再定义静态频率级别表,而是提供许多抽象的性能级别,操作系统从中选择这些级别。 有两个优点
- 不再有 16 个 P 状态条目的限制; 典型的 CPU 提供数百个级别可供选择。
- 当某些部件(例如矢量 FPU)未使用时,CPU 可以为性能级别提供更高的频率(例如加速)。
另一方面,灵活的频率会打破频率不变的利用率跟踪,这对于 schedutil
的快速频率更改非常重要。 已经使用了许多供应商特定的方法来使 CPPC 下的频率保持静态,其中大多数成功来自 arm64。
cppc_cpufreq
是通用的 CPPC 调频驱动程序。当 Zen 3 MSR 不可用时,amd_pstate
也使用 ACPI CPPC 来管理 CPU 频率——这种方法也称为“共享内存”,比 MSR 具有更高的延迟。
Intel 性能和能耗偏好提示
Intel 性能和能耗偏好提示 (EPB) 是 Intel CPU 提供的一种接口,允许用户空间指定期望的功耗-性能权衡,范围从 0(最高性能)到 15(最高节能)。EPB 寄存器是独立于频率调频的另一层性能管理机制。它会影响 P 状态和 C 状态选择的激进程度,并告知影响能耗的内部特定模型决策。
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 设置实用程序中进行了特定设置(频率、散热管理等),您可以归咎于有缺陷/过时的 BIOS,或者 BIOS 可能有充分的理由自行限制 CPU 频率。
这样的原因可能是(假设您的机器是笔记本电脑)电池已移除(或电量耗尽),因此您仅使用交流电源。在这种情况下,较弱的交流电源可能无法提供足够的电力来满足整个系统的极端峰值需求,并且由于没有电池辅助,这可能导致数据丢失、数据损坏,甚至在最坏的情况下导致硬件损坏!
并非所有 BIOS 在这种情况下都会限制 CPU 频率,但是,例如,大多数 IBM/Lenovo Thinkpad 都会这样做。有关此主题的更多 thinkpad 相关信息,请参阅 thinkwiki 链接。
如果您检查过不仅仅是奇怪的 BIOS 设置,并且您知道自己在做什么,则可以使内核忽略这些 BIOS 限制。
- 请确保您已阅读并理解以上部分。CPU 频率限制是 BIOS 的一项安全功能,您不应该需要绕过它。
- 不 建议这样做,并且可能会严重损坏您的硬件:使用风险自负。 [8]
设置 processor.ignore_ppc=1
内核参数。要临时尝试此操作,请将 /sys/module/processor/parameters/ignore_ppc
中的值从 0
更改为 1
。
某些系统使用另一种机制来限制 CPU 频率,例如,在没有电池或使用非官方电源适配器运行时。有关操作 Intel CPU 中的 BD PROCHOT 位的方法,请参阅 Lenovo ThinkPad T480#CPU stuck at minimum frequency,以及有关替代修复方法,请参阅 Dell XPS 15 (9560)#General slowness & stuttering。这不仅适用于 Lenovo ThinkPad T480,而且也是 Dell XPS 型号(如 XPS15 9550 和 XPS15 9560)中的常见问题。该位也是至少某些基于 Intel 的 MacBook 在未连接电池时以最低 CPU 频率运行的原因。