CPU frequency scaling (简体中文)

CPU 调频允许操作系统通过提高或降低 CPU 频率来达到省电目的。CPU 频率可以根据系统负载或响应 ACPI 事件来自动调整,也可通过用户空间程序手工调整。

翻译状态:本文是 CPU frequency scaling翻译。上次翻译日期:2017-11-07。如果英文版本有所更改,则您可以帮助同步翻译。

Linux 内核具有 CPU 调频实现,该基础架构称为 cpufreq。从 3.4 内核开始,必要的模块都会自动加载,而且推荐的调频器 ondemand governor 默认启用。但是,在进行高级配置时,仍然会用到其他用户空间工具,例如 cpupoweracpidlaptop-mode-tools,或桌面环境所提供的图形化工具。

用户空间工具

thermald

thermald 是一个 Linux 守护进程,用于防止平台过热。此守护进程会监控平台温度,并采用可用的冷却方式来降低温度。

默认情况下,在硬件采取激进的降温措施之前,它将利用现有的 CPU 数字温度传感器监控 CPU 温度,并保持 CPU 的温度处于可控范围。如果 sysfs 中存在表面温度传感器,那么它将让表面温度保持在 45℃ 以下。

i7z

i7z 是 i7 CPU (也同样适用于 i3 和 i5 CPU)的报告工具。可以在终端下输入 i7z 或者使用图形化工具 i7z-gui 来运行该工具。

cpupower

cpupower 是一组为辅助 CPU 调频而设计的用户空间工具。该软件包并非必须,但强烈建议安装,因为它提供了方便的命令行实用程序,并且内置 systemd 服务,可在启动时更改调频器。

cpupower 的配置文件位于 /etc/default/cpupower。此配置文件由 中的 bash 脚本读取,而该脚本由 systemd 通过 激活。若要在启动时启用 cpupower,请执行:

# systemctl enable cpupower.service

CPU 频率驱动程序

cpupower 需要相应模块来了解本地 CPU 的限制信息:

模块描述
intel_pstate此驱动程序通过内置调频器,实现面向 Intel Core(SandyBridge 和更新的型号)处理器的调频驱动。
acpi-cpufreq此 CPUFreq 驱动程序可充分利用 ACPI Processor Performance States。此驱动程序也支持 Intel Enhanced SpeedStep(之前由 speedstep-centrino 模块(已废弃)提供支持)。
speedstep-lib此 CPUFreq 驱动程序面向支持 Intel SpeedStep 的 CPU(主要包括 Atom 和早于 Pentinum 3 的 CPU)。
powernow-k8面向 K8/K10 Athlon 64/Opteron/Phenom 的 CPUFreq 驱动程序。从 Linux 3.7 开始,对于此系列中的较现代 CPU,将自动使用“acpi-cpufreq”。
pcc-cpufreq此驱动程序支持 HP 和 Microsoft 提出的 Processor Clocking Control 接口,在某些 ProLiant 服务器上比较有用。
p4-clockmod面向 Intel Pentium 4/Xeon/Celeron 处理器的 CPUFreq 驱动程序,可通过跳频来降低 CPU 温度。(您最好使用 SpeedStep 驱动程序。)

查看所有可用的模块,运行以下命令:

$ ls /usr/lib/modules/$(uname -r)/kernel/drivers/cpufreq/

加载合适的模块 (see Kernel modules for details)。一旦合适的 cpufreq 驱动模块被加载成功,就可以通过以下命令查询到 CPU 的信息:

$ cpupower frequency-info

设置最大和最小频率

在罕见的情况下,可能有必要手动设置最大和最小频率。

运行以下命令设置最大时钟频率(clock_freq 为时钟频率,单位为:GHz, MHz):

# cpupower frequency-set -u clock_freq

运行以下命令设置最小时钟频率:

# cpupower frequency-set -d clock_freq

运行以下命令设置运行于指定频率:

# cpupower frequency-set -f clock_freq

调整调速器

调速器(见下表)是预设的 CPU 电源方案。在同一时刻只会有一个会调速器被激活。详见内核文档

调速器描述
performance运行于最大频率
powersave运行于最小频率
userspace运行于用户指定的频率
ondemand按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行,空闲时间增加就降低频率
conservative按需快速动态调整CPU频率, 比 ondemand 的调整更保守
schedutil基于调度程序调整 CPU 频率 , .

根据实际硬件,以下的调速器可能被默认启用:

  • ondemand :AMD 及旧款 Intel CPU。
  • :Intel 使用 intel_pstate 驱动的 CPU(Sandy Bridge 和更新的CPU)。

如果需要指定特定的调速器,运行以下命令:

# cpupower frequency-set -g governor

也可以这样实现:

# echo governor | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor >/dev/null

调节 ondemand 调速器

详见内核文档

开关阙值

设置到其他值(增加)的步长,执行以下命令:

# echo -n percent > /sys/devices/system/cpu/cpufreq/<governor>/up_threshold

设置到其他值(减小)的步长,执行以下命令:

# echo -n percent > /sys/devices/system/cpu/cpufreq/<governor>/down_threshold

采样率

采样率决定调速器多久进行一次检查并调整CPU频率。 设置大于1将通过降低负载评估的消耗,并将CPU保持在最高运行频率而提高性能。 的可选数值是 1 到 100000。这个可调参数对低CPU频率/负载没有效果。

要获取这个值 (default = 1),运行:

$ cat /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

要设置这个值,运行:

# echo -n <value> > /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor

保存设置

要在重启后自动启用设置,通常使用 内核模式选项systemd#systemd-tmpfiles - temporary files。如果某些特殊情况下会出现时序问题,可以使用 udev

例如要将 CPU core 的调速器设置为 performance,驱动是 , 创建如下 udev 规则:

要在 initramfs 中启用设置,请参考下面例子:udev#Debug output.

与ACPI事件交互

用户可以把调速器配置为基于不同的ACPI事件自动切换的形式。例如接入外接电源,或是合上屏幕时。以下是一个简明的例子,但可能有必须通读一遍文章acpid.

事件是在/etc/acpi/handler.sh中定义的。如果软件包已经安装,这个文件应该已经存在并且设置为可执行。例如,当外接电源拔除时将调速器从改为conservative,而当电源再次接入时将它改回来:

GNOME下的授权

GNOME (简体中文)有一个不错的小工具来在线修改调速器。如果想在不需要root密码的情况下就能使用它,只需要建立一个文件然后录入以下内容:

其中替换为期望的用户名。

AUR中的软件包desktop-privilegesAUR包含一个类似的文件为所有 用户组中的用户授权修改调速器。

疑难解答

  • 一些应用程序,如ntop,对自动频率调整不能很好地响应。在ntop的案例中它可能导致分段错误和大量信息丢失,因为在大量网络数据包突然到达被监控的网络接口时,调速器不能迅速反应,以致当前处理速度满足不了处理这些数据包所需的速度。
  • 一些CPU在默认的调速器配置下可能受到比较严重的性能损失(例如flash视频不能平滑地播放,或窗口动画停顿)。为了解决这些问题,完全禁用掉频率调整不如采取更积极的措施——降低每个CPU的up_threshold sysctl变量值。阅读#调节 ondemand 调速器章节以获得更多信息。
  • 有时on-demand调速器可能达不到最高频率而只能达到次级频率。这个问题可以通过把max_freq值设置得稍微高于最大频率的方式来解决。例如,如果CPU的频率范围是2.00 GHz到3.00 GHz,把max_freq设置为3.01 GHz就是一个不错的主意。
  • ALSA驱动和有些声音芯片配合工作时,可能导致在调速器改变频率时声音跳跃。改回non-changing调速器应该能够解决这个问题。

BIOS频率限制

一些CPU/BIOS配置可能导致达不到最高频率或根本无法调高频率。这很可能是因为BIOS告诉操作系统限制频率,结果在中设置了一个过低的值。

这种情况下需要在BIOS设置中修改指定的配置(频率,发热管理等)。这通常是由于有问题的/过旧的BIOS导致,也可能BIOS有特别的原因要求必须这样。

可能的原因有(假设你的机器是一台笔记本)电池被移除(或快要完全损坏),所以你只能用外接电源。这种情况下如果电源适配器提供的电能太弱,就会满足不了整个系统在峰值所需的电能,而且又没有电池辅助供电,就可能导致数据丢失,数据损坏或最坏的情况下损坏硬件!

不是所有的BIOS都会在这种情况下限制CPU频率,但如IBM/联想 Thinkpad就会。参考thinkwiki以获取更多信息thinkpad related info on this topic.

如果你检查后发现并没有不正确的BIOS设置,而且你也十分清楚自己在做什么以及可能导致的结果,你还可以选择让内核忽略BIOS限制。

一个特殊的参数需要传递给处理器模块。

临时尝试这办法时可以修改值从到。

要固化这个修改请参考Kernel module或继续阅读本文。 添加processor.ignore_ppc=1到内核启动参数或创建

参阅

This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.