CPU Frequency Scaling (简体中文)
相关文章
CPUfreq 引用了内核架构中的 CPU 频率调整部分相关功能。这项技术使得操作系统能够提高或降低CPU速度来达到省电目的。CPU 频率可以根据系统负荷自动调整,或响应 ACPI 事件而调整,或通过用户空间程序手工调整。
从 3.4 内核开始,必要的模块都会自动加载,而且推荐的调速器 ondemand governor 默认启动。但是,用户空间程序,例如 cpupower,acpid,laptop-mode-tools,或你的桌面系统对应的图形化工具,在进行高级特性配置时可能仍然需要被用到。
Contents
用户空间工具
thermald
thermaldAUR 是一个 Linux 守护进程,它可以防止平台过热。此进程监控平台的温度,且使用可用的办法帮助温度的降低。
By default, it monitors CPU temperature using available CPU digital temperature sensors and maintains CPU temperature under control, before HW takes aggressive correction action. If there is a skin temperature sensor in thermal sysfs, then it tries to keep skin temperature under 45C.
默认情况下,它在硬件采取激进的行为之前,利用现有的 CPU 数字温度传感器监控 CPU 温度,并保持 CPU 的温度处于可控范围。如果 sysfs 中存在表面温度传感器,那么它将让表面温度保持在 45℃ 以下。
i7z
i7z 是 Linux 下极其好用的针对 i7 CPU 的报告工具(也同样适用于 i3 和 i5 CPU)。您可以在终端下输入 i7z
或者使用图形化工具 i7z-gui
来运行它。
cpupower
cpupower is a set of userspace utilities designed to assist with CPU frequency scaling. The package is not required to use scaling, but is highly recommended because it provides useful command-line utilities and a systemd service to change the governor at boot.
The configuration file for cpupower is located in /etc/default/cpupower
. This configuration file is read by a bash script in /usr/lib/systemd/scripts/cpupower
which is activated by systemd with cpupower.service
. You may want to enable cpupower.service
to start at boot.
cpupower 是一组为辅助 CPU frequency scaling 而设计的用户空间工具。这个软件包并不是必须的,但强烈建议安装,因为它提供了方便的命令行工具,且提供在启动时改变调速器的服务。
cpupower 的配置文件位于 /etc/default/cpupower
。这个配置文件被bash脚本读取,该脚本位于 /usr/lib/systemd/scripts/cpupower
,它又由 systemd
通过 cpupower.service
激活。为使用 systemd 在启动时启用 cpupower,运行:
# systemctl enable cpupower.service
CPU frequency driver
cpupower 需要模块才能知道本地的 CPU 限制信息:
模块 | 描述 |
---|---|
intel_pstate | This driver implements a scaling driver with an internal governor for Intel Core (SandyBridge and newer) processors. |
acpi-cpufreq | CPUFreq driver which utilizes the ACPI Processor Performance States. This driver also supports Intel Enhanced SpeedStep (previously supported by the deprecated speedstep-centrino module).支持ACPI Processor Performance States的CPUFreq驱动。该驱动也支持Intel Enhanced SpeedStep(之前由已过期的模块speedstep-centrino支持)。 |
speedstep-lib | CPUFreq drive for Intel speedstep enabled processors (mostly atoms and older pentiums (< 3)) 支持拥有speedstep功能的Intel处理器(通常是atom和奔腾3代或更老的处理器)CPUFreq驱动。 |
powernow-k8 | CPUFreq driver for K8/K10 Athlon64/Opteron/Phenom processors. Deprecated since linux 3.7 - Use acpi_cpufreq.支持K8/K10 Athlon64/Opteron/Phenom处理器的CPUFreq驱动。从linux 3.7开始进入淘汰阶段,使用acpi-cpufreq替代。 |
pcc-cpufreq | This driver supports Processor Clocking Control interface by Hewlett-Packard and Microsoft Corporation which is useful on some Proliant servers.支持HP和微软提出的“处理器时钟频率控制”接口,这在一些Proliant服务器上很有用。 |
p4-clockmod | CPUFreq driver for Intel Pentium 4 / Xeon / Celeron processors. When enabled it will lower CPU temperature by skipping clocks. You probably want to use a Speedstep driver instead.支持Intel奔腾4 / 至强 / 赛扬 处理器的CPUFreq驱动。生效时会通过skipping clocks技术降低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 电源方案。在同一时刻只会有一个会调速器被激活。可以查询内核源码的 内核文档 得到更多的相关信息。
调速器 | 描述 |
---|---|
ondemand | 按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率(阙值为 95%) |
performance | 运行于最大频率 |
conservative | 按需快速动态调整CPU频率, 一有cpu计算量的任务,就会立即达到最大频率运行,等执行完毕就立即回到最低频率(阙值为 75%) |
powersave | 运行于最小频率 |
userspace | 运行于用户指定的频率 |
根据实际硬件,以下的调速器可能被默认启用:
-
ondemand
:AMD 及旧款 Intel CPU。 -
powersave
:Intel Sandy Bridge 和更新的CPU。
如果需要指定特定的调速器,运行以下命令:
# cpupower frequency-set -g governor
也可以这样实现:
# echo governor | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor >/dev/null
调节 ondemand 调速器
查看 kernel documentation 获得更多信息。
开关阙值
设置到其他值(增加)的步长,执行以下命令:
# 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
大于1将通过降低负载评估的消耗,并将CPU保持在最高运行频率而提高性能。这个可调参数对低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
与ACPI事件交互
用户可以把调速器配置为基于不同的ACPI事件自动切换的形式。例如接入外接电源,或是合上屏幕时。以下是一个简明的例子,但可能有必须通读一遍文章acpid.
事件是在/etc/acpi/handler.sh
中定义的。如果acpid软件包已经安装,这个文件应该已经存在并且设置为可执行。例如,当外接电源拔除时将调速器从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 ;; [...]
GNOME下的授权
GNOME_(简体中文)有一个不错的小工具来在线修改调速器。如果想在不需要root密码的情况下就能使用它,只需要建立一个文件/var/lib/polkit-1/localauthority/50-local.d/org.gnome.cpufreqselector.pkla
然后录入以下内容:
[org.gnome.cpufreqselector] Identity=unix-user:USER Action=org.gnome.cpufreqselector ResultAny=no ResultInactive=no ResultActive=yes
其中USER
替换为期望的用户名。
AUR中的软件包desktop-privilegesAUR包含一个类似的.pkla
文件为所有power
用户组中的用户授权修改调速器。
疑难解答
- 一些应用程序,如ntop,对自动频率调整不能很好地响应。在ntop的案例中它可能导致分段错误和大量信息丢失,因为在大量网络数据包突然到达被监控的网络接口时,
on-demand
调速器不能迅速反应,以致当前处理速度满足不了处理这些数据包所需的速度。
- 一些CPU在默认的
on-demand
调速器配置下可能受到比较严重的性能损失(例如flash视频不能平滑地播放,或窗口动画停顿)。为了解决这些问题,完全禁用掉频率调整不如采取更积极的措施——降低每个CPU的up_threshold sysctl变量值。阅读#修改on-demand调速器的阈值章节以获得更多信息。
- 有时on-demand调速器可能达不到最高频率而只能达到次级频率。这个问题可以通过把max_freq值设置得稍微高于最大频率的方式来解决。例如,如果CPU的频率范围是2.00 GHz到3.00 GHz,把max_freq设置为3.01 GHz就是一个不错的主意。
- ALSA驱动和有些声音芯片配合工作时,可能导致在调速器改变频率时声音跳跃。改回non-changing调速器应该能够解决这个问题。
BIOS频率限制
一些CPU/BIOS配置可能导致达不到最高频率或根本无法调高频率。这很可能是因为BIOS告诉操作系统限制频率,结果在/sys/devices/system/cpu/cpu0/cpufreq/bios_limit
中设置了一个过低的值。
这种情况下需要在BIOS设置中修改指定的配置(频率,发热管理等)。这通常是由于有问题的/过旧的BIOS导致,也可能BIOS有特别的原因要求必须这样。
可能的原因有(假设你的机器是一台笔记本)电池被移除(或快要完全损坏),所以你只能用外接电源。这种情况下如果电源适配器提供的电能太弱,就会满足不了整个系统在峰值所需的电能,而且又没有电池辅助供电,就可能导致数据丢失,数据损坏或最坏的情况下损坏硬件!
不是所有的BIOS都会在这种情况下限制CPU频率,但如IBM/联想 Thinkpad就会。参考thinkwiki以获取更多信息thinkpad related info on this topic.
如果你检查后发现并没有不正确的BIOS设置,而且你也十分清楚自己在做什么以及可能导致的结果,你还可以选择让内核忽略BIOS限制。
一个特殊的参数需要传递给处理器模块。
临时尝试这办法时可以修改/sys/module/processor/parameters/ignore_ppc
值从0
到1
。
要固化这个修改请参考Kernel modules或继续阅读本文。
添加processor.ignore_ppc=1
到内核启动参数或创建
/etc/modprobe.d/ignore_ppc.conf
# 如果你的机器受到错误的BIOS频率限制,这应该会有帮助 options processor ignore_ppc=1