CPU 频率伸缩

出自 ArchWiki
(重定向自 Cpupower

CPU 性能伸缩 使操作系统能够向上或向下调节 CPU 频率,以节省电能或提高性能。伸缩可以根据系统负载自动完成、响应 ACPI 事件进行自我调整,或由用户空间程序手动更改。

Linux 内核通过 CPUFreq 子系统提供 CPU 性能伸缩,该子系统定义了两个抽象层

默认的频率调节驱动和调速器会自动选择,但用户空间工具(如 cpupoweracpidLaptop Mode Tools)或为您的桌面环境提供的 GUI 工具,仍然可以用于高级配置。

用户空间工具

i7z

i7z 是一款适用于 Linux 的 i7(现在也支持 i3、i5、i7、i9)CPU 报告工具。可以通过命令 i7z 从终端启动,也可以通过 i7z-gui 作为 GUI 启动。

turbostat

turbostat 可以显示现代英特尔和 AMD CPU 的频率、功耗、空闲状态和其他统计信息。

cpupower

cpupower 是一组用户空间实用程序,旨在协助 CPU 频率伸缩。该软件包不是使用伸缩所必需的,但强烈推荐,因为它提供了有用的命令行实用程序和一个 systemd 服务,用于在启动时更改调速器。

cpupower 的配置文件位于 /etc/default/cpupower。此配置文件由 /usr/lib/systemd/scripts/cpupower 中的 bash 脚本读取,该脚本由 systemd 通过 cpupower.service 激活。您可能需要启用 cpupower.service 以在启动时启动。

thermald

thermald 是一个 Linux 守护进程,用于防止英特尔 CPU 过热。此守护进程使用 P 状态、T 状态和英特尔电源钳位驱动程序主动控制散热参数。thermald 也可用于较旧的英特尔 CPU。如果最新的驱动程序不可用,则守护进程将恢复为 x86 型号特定寄存器和 Linux “cpufreq 子系统”来控制系统散热。

默认情况下,它使用可用的 CPU 数字温度传感器监控 CPU 温度,并将 CPU 温度保持在受控范围内,以避免硬件采取激进的纠正措施。如果散热 sysfs 中有皮肤温度传感器,则它会尝试将皮肤温度保持在 45 摄氏度以下。

在 Tiger Lake 笔记本电脑(例如 Dell Latitude 3420)上,据报告此守护进程比原本可用的性能解锁了更多性能

关联的 systemd 单元是 thermald.service,应启动启用。有关更多信息,请参阅 thermald(8)

power-profiles-daemon

powerprofilesctl 命令行工具(来自 power-profiles-daemon)通过 power-profiles-daemon 服务处理电源配置文件(例如,平衡、省电、性能)。GNOME 和 KDE 也提供了用于配置文件切换的 图形界面;请参阅以下内容

有关用法、用例以及与类似项目的比较的更多信息,请参阅 项目 README

启动/启用 power-profiles-daemon 服务。请注意,当启动 powerprofilesctl 时,它也会尝试启动该服务(请参阅 dbus.service单元状态)。

注意
  • power-profiles-daemon 与其他电源管理服务(如 TLPtunedsystem76-powerAUR冲突。要使用上述服务之一,而不是卸载 power-profiles-daemon(由于其可能作为依赖项的状态),请通过屏蔽 power-profiles-daemon 服务来禁用它(另请参阅 [1][2])。
  • 自 2.23.0 版本起,tuned 现在为 power-profiles-daemon 提供了 tuned-ppd 服务兼容层。

tuned

tuned 是一个用于监控和自适应调整系统设备的守护进程。它可以配置 GPU 电源模式、PCIe 电源管理、设置 sysctl 设置、调整内核调度等等;一个还可以配置系统中电源管理方面的守护进程。

截至 release 2.23.0,该项目附带了 tuned-ppd,这是一个用于为 power-profiles-daemon 编写的程序的兼容层,例如以下程序

有关为什么应该使用 tuned 而不是 power-profiles-daemon 的原因,请参阅 Fedora 的 提案,以将其替换为 tuned。对于相反的论点,请参阅 [3]

启动/启用 tuned 守护进程服务。为了 power-profiles-daemon 兼容性,也启动/启用 tuned-ppd 服务。要从命令行控制 tuned,请使用 tuned-adm 来查看、设置和推荐配置文件。

注意: tuned-ppd/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.servicecpupower-gui-user.service 的更多信息,请参阅 cpupower-gui systemd 单元

gnome-shell-extension-cpupower

gnome-shell-extension-cpupower-gitAUR 是一个 GNOME Shell 扩展,可以更改最小/最大 CPU 频率并启用/禁用频率加速。

auto-cpufreq

auto-cpufreqAUR 是一款基于对笔记本电脑电池状态、CPU 使用率、CPU 温度和系统负载的活动监控的 Linux 自动 CPU 速度和电源优化器。

频率调节驱动

频率调节驱动实现了设置调速器指定的频率的 CPU 特定细节。严格来说,ACPI 标准要求 电源性能状态 (P 状态),从 P0 开始,性能逐渐降低。此功能在英特尔上称为 SpeedStep,在 AMD 上称为 PowerNow!。

但在实践中,处理器提供了指定特定频率的方法,而不是被限制为固定的 P 状态,频率调节驱动程序会处理这些方法。

注意: 原生 CPU 模块会自动加载。

cpupower 需要驱动程序来了解原生 CPU 的限制

驱动程序 描述
acpi_cpufreq CPUFreq 驱动程序,它利用 ACPI 处理器性能状态。此驱动程序还支持英特尔增强型 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 及更高版本)处理器的内部调速器。
cppc_cpufreq 基于 ACPI CPPC 系统的 CPUFreq 驱动程序(请参阅 #协同处理器性能控制)。AArch64 系统上的常见默认设置。也适用于现代 x86,但 intel_pstateamd_pstate 驱动程序更好。
intel_cpufreq 从内核 5.7 开始,对于不支持硬件管理的 P 状态 (HWP) 的 CPU(即英特尔酷睿 i 第 5 代或更早版本),intel_pstate 频率调节驱动程序选择“被动模式”,也称为 intel_cpufreq。此“被动”驱动程序的行为类似于英特尔 CPU 上的 ACPI 驱动程序,但它没有 ACPI 的 16 状态限制。
intel_pstate 此驱动程序实现了带有用于英特尔酷睿(Sandy Bridge 及更高版本)处理器的内部调速器的频率调节驱动程序。对于这些处理器,它会自动使用,而不是使用下面的其他驱动程序。此驱动程序优先于其他驱动程序,并且是内置的,而不是模块。intel_pstate 可以通过 intel_cpufreq 驱动程序在“被动模式”下运行,以用于较旧的 CPU。如果您在使用此驱动程序时遇到问题,请将 intel_pstate=disable 添加到您的内核行中,以便恢复使用 acpi_cpufreq 驱动程序。
p4_clockmod 用于英特尔奔腾 4/至强/赛扬处理器的 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 用于启用英特尔 SpeedStep 的处理器(主要是 Atom 和较旧的奔腾)的 CPUFreq 驱动程序

此条目或章节的事实准确性存疑。

原因: 以下命令只会返回作为模块构建的驱动程序,而不会返回内置驱动程序:例如 intel_pstate 和 amd_pstate]。 (在 Talk:CPU frequency scaling 中讨论)

要查看可用模块的完整列表,请运行

$ 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]

配置频率加速

某些处理器支持在适当的热条件下,在短时间内将其频率提高到高于正常最大值。在英特尔处理器上,这称为 睿频加速,在 AMD 处理器上,这称为 Turbo Core

通过 sysfs 设置 (intel_pstate)

intel_pstate 具有特定于驱动程序的接口,用于禁止处理器进入睿频 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 设置

在英特尔处理器上,x86_energy_perf_policy 也可用于配置睿频加速

# x86_energy_perf_policy --turbo-enable 0

amd_pstate

amd_pstate 具有三种操作模式:CPPC 自主(主动)模式、CPPC 非自主(被动)模式和 CPPC 引导自主(引导)模式。官方支持的内核 构建时带有 CONFIG_X86_AMD_PSTATE_DEFAULT_MODE=3,这意味着它们的默认模式是主动模式。可以使用 内核参数 amd_pstate=activeamd_pstate=passiveamd_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_pstateamd_pstate 在主动模式下除外,它们以 powersaveperformance 的形式提供伪调速器。请参阅下面的 #自主频率调节
调速器 描述
performance 以从 /sys/devices/system/cpu/cpuX/cpufreq/scaling_max_freq 获取的最大频率运行 CPU。
powersave 以从 /sys/devices/system/cpu/cpuX/cpufreq/scaling_min_freq 获取的最小频率运行 CPU。
userspace 以用户指定的频率运行 CPU,可通过 /sys/devices/system/cpu/cpuX/cpufreq/scaling_setspeed 配置。
ondemand 根据当前负载动态调节频率。跳转到最高频率,然后随着空闲时间增加可能退回。
conservative 根据当前负载动态调节频率。频率调节比 ondemand 更渐进。
schedutil 调度程序驱动的 CPU 频率选择 [5], [6]

根据频率调节驱动程序,默认情况下会加载以下调速器之一

  • Linux 4.9.5 以来的 schedutil
  • 分别使用 intel_pstateamd_pstate 驱动程序的英特尔和 AMD CPU 的内部 powersave 调速器(请参阅上面的注释,它等效于 schedutil)。
警告: 更改默认调速器时,请使用 CPU 监控工具(用于温度、电压等)。

要激活特定的调速器,请运行

# 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
提示: 要实时监控 CPU 速度,请运行
$ 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 内核选项。[7] 要在启动时设置所需的频率调节参数,请配置 cpupower 实用程序并启用其 systemd 服务。或者,可以使用 systemd-tmpfilesudev 规则。

自主频率调节

英特尔和 AMD 都定义了一种方法,让 CPU 根据 (1) 系统的性能范围和 (2) 指定偏好的性能/功耗提示来决定其自身的速度。当以下情况发生时,完全自主模式被激活

  • amd_pstate 设置为“active”——需要在 CPU BIOS 中都支持 CPPC,
  • intel_pstate 设置为“active” 硬件 P 状态 (HWP) 可用(即 Sandy Bridge 及更高版本)——开箱即用。

主动调速的最重要特征是,只有两个调速器似乎可用,powersaveperformance。但是,它们的工作方式完全不像其正常的对应项:这些级别被转换为 CPU 内部调速器的能效比偏好提示。因此,它们都提供动态频率调节,类似于分别类似于 schedutilondemand 通用调速器,主要区别在于延迟。对于英特尔 HWP,performance 算法 应该比旧的 ondemand 调速器提供更好的节能功能

英特尔主动式,非 HWP

令人困惑的是,intel-pstate 驱动程序具有一种“主动”模式,该模式在没有 CPU 主动决策的情况下工作。当内核 cmdline 强制执行“主动”模式但 HWP 不可用或禁用时,此模式会开启。它仍然只会提供 powersaveperformance,但驱动程序本身以类似于 schedutilperformance 的方式进行调速(即,它保持在最大 P 状态)。与被动 intel-pstate 相比,此模式没有真正的优势。

设置 EPP

可以使用可用的 sysfs 接口选择介于两者之间的提示。AMD 和 英特尔之间的接口是相同的,其中文件 /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference 描述了当前的偏好,而 /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_available_preferences 提供了可用偏好列表。也可以传递一个介于 0(偏好性能)和 255(偏好功耗)之间的数字。为没有 EPP 的英特尔 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

# x86_energy_perf_policy --epb epb

通过 cpupower 设置

使用 cpupower

# cpupower set -b epb_value
警告: cpupower 不支持字符串别名。如果给定一个字符串,它会静默地将 EPB 设置为 0,对应于最大性能。

与 ACPI 事件的交互

用户可以配置调频 governor 以根据不同的 ACPI 事件自动切换,例如连接 AC 适配器或合上笔记本电脑盖。下面给出一个简单的例子;但是,值得阅读关于 acpid 的完整文章。

事件在 /etc/acpi/handler.sh 中定义。如果安装了 acpid 软件包,则该文件应已存在且可执行。例如,要将调频 governor 从 performance 更改为 conservative,当 AC 适配器断开连接时,并在重新连接时将其改回

/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 频率限制

此文章或章节需要语言、wiki 语法或样式改进。请参阅 Help:Style 以获取参考。

某些 CPU/BIOS 配置可能难以扩展到最大频率或根本无法扩展到更高的频率。这很可能是由 BIOS 事件告诉操作系统限制频率导致的,从而导致 /sys/devices/system/cpu/cpu0/cpufreq/bios_limit 设置为较低的值。

要么您只是在 BIOS 设置实用程序中进行了特定设置(频率、散热管理等),要么您可以责怪有缺陷/过时的 BIOS,要么 BIOS 可能有充分的理由自行限制 CPU 频率。

这样的原因可能是(假设您的机器是笔记本电脑)电池已取出(或接近报废),因此您仅使用交流电源。在这种情况下,较弱的交流电源可能无法提供足够的电力来满足整个系统的极端峰值需求,并且由于没有电池来辅助,这可能会导致数据丢失、数据损坏,甚至在最坏的情况下甚至硬件损坏!

并非所有 BIOS 都会在这种情况下限制 CPU 频率,但是,例如,大多数 IBM/联想 Thinkpad 都会这样做。有关此主题的更多 thinkpad 相关信息,请参阅 thinkwiki thinkpad 相关信息

如果您检查过没有奇怪的 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 卡在最低频率,以及有关替代修复方法的 Dell XPS 15 (9560)#General slowness & stuttering。它不仅适用于 Lenovo ThinkPad T480,而且也是 Dell XPS 型号(如 XPS15 9550 和 XPS15 9560)中的常见问题。该位也是至少某些基于 Intel 的 MacBook 在未连接电池的情况下以最低 CPU 频率运行的原因。

另请参阅