任何人在考虑业务成本或环境问题时都不得不重视电源效率。在本文中,我们将讨论如何使用 Linux CPUfreq 子系统和内核调控器来修改处理器的频率,从而改善系统效率,而不会对性能造成显著影响。但是,根据实际硬件的不同,电源效率调优存在一些限制(详见本系列的第 2 部分)。
从 2.6.0 Linux 内核开始,您可以通过 CPUfreq 子系统动态调整处理器频率。当处理器以较低的时钟速度运行时,它们消耗的电能和产生的热量也相对较少。时钟速度的这种缩放可以控制系统在未全力运行时消耗较少电能。
CPUfreq 结构利用调控器和守护程序来为系统设置静态或动态电源策略。动态调控器(详见下文)可以根据 CPU 利用率来调整 CPU 频率,从而有助于节省电能,而不会牺牲性能。这些调控器还允许一些用户调优,因此您可以自定义并轻松地更改变频系数。此外,sched_mc_power_savings 和
sched_smt_power_savings 设置将利用整固线程来节省电能。
CPU 电源状态(C State)和 CPU/设备性能状态(P State)
在开始 CPUfreq 讨论之前,我们先来看看 CPU 电源状态和 CPU/设备性能状态。
CPU 电源状态(不包括处理器运行时的 C0 状态)是空闲状态,处理器将解锁并关闭组件来节省电能。CPU 电源状态程度越深,采取的电能节省措施就越多 — 比如说停止处理器时钟或停止外部中断请求。这些状态帮助空闲中的系统节省电能。
此外,C1E 模式(或称作 Enhanced C1 或 C1 Enhanced Mode)也可以帮助空闲系统节省电能。同样通过降低电压和频率,C1E 尝试比传统 C1 状态(只会停止时钟信号)提供更大的电能节省。事实上,C1E 能够比任何 CPUfreq 调控器更快地降低电压/频率。
并非所有处理器都有这些选项,但是要使用 C 电源状态和 CIE,请确保启用了 BIOS 选项
CPU C State 和 C1E(或者类似的选项),以便于在空闲时实现更大的电能节省。一些系统支持 C3 甚至 C6 尝试休眠状态。
记住,CPU 电源状态程度越深,节省的电能就越多。
CPU/设备性能状态是与 CPU 频率和电压相关的运转状态。CPU/设备性能状态值越大,处理器所使用的频率和电压就越低。CPUfreq 调控器使用 CPU/设备性能状态来修改频率和降低功耗。
您需要在系统上启用
Processor Performance States BIOS 选项(或类似的选项),以便于使用 CPU/设备性能状态和 CPUfreq 调控器。图 1 是 C 和 CPU/设备性能状态的简化图。
图 1. CPU 电源状态和 CPU/设备性能状态
在使用 CPUfreq 子系统之前,您需要满足下节所述的前提条件。CPUfreq 在 RHEL 5.2 中是默认启用的(在其他分发版中通常也是启用的)。检查 CPUfreq 是否已经启用的一种快捷方法是查看 /sys 文件系统。如果在 /sys/devices/system/cpu/cpu*/cpufreq/ 中看到了 cpufreq 目录,则表示您的系统当前已经启用了 CPUfreq。如果未在其中看到此目录,则依照以下步骤确保一切就绪。
首先,确保您的处理器可以支持变频。有关此 CPUfreq 子系统的硬件列表,请参阅 参考资料 小节。
接下来,查看内核配置文件。通常,所有需要的配置默认都已针对 RHEL 5.2 内核设置好,但您可能希望更改一些设置来实现所需的系统启动状态。以下选项位于配置文件的 CPU Frequency scaling 部分:
CONFIG_CPU_FREQ
必须将此选项设置为 y,以便于利用内核的 CPU 变频功能。
CONFIG_CPU_FREQ_GOV_PERFORMANCE, CONFIG_CPU_FREQ_GOV_POWERSAVE,
CONFIG_CPU_FREQ_GOV_USERSPACE, CONFIG_CPU_FREQ_GOV_ONDEMAND,
CONFIG_CPU_FREQ_GOV_CONSERVATIVE
这些选项分别对应各个可用的 CPUfreq 调控器。要使用调控器,需要将配置选项设置为 y 或者
m。如果将选项设置为
y,则该调控器的模块将嵌入到内核中。如果将选项设置为 m,则每次在启动时都需要通过发出以下部分或全部命令来载入模块:
modprobe cpufreq_performance
modprobe cpufreq_powersave
modprobe cpufreq_userspace
modprobe cpufreq_ondemand
modprobe cpufreq_conservative
或者,如果选择了 m,那么您可以将调控器模块添加到
/etc/rc.local,以便在启动时载入模块。还需注意,通过将 CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE
或
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE 设置为
y,您可以将用户空间或性能调控器设置为默认。
此外,要使用 sched_mc_power_savings 和
sched_smt_power_savings(稍后讨论),
应确保在配置文件的 Processor type and features 部分将 CONFIG_SCHED_MC
和 CONFIG_SCHED_SMT 选项设置为
y。
要让配置文件中的更改生效,您需要重建和启动内核。您可能知道如何执行此任务,但如果不了解细节,可以阅读关于重建 Linux 内核的指南(参见 参考资料 获取建议)。
CPUfreq 子系统可以使用 5 种内核调控器。这些调控器根据特定标准设置处理器频率;其中一些根据系统或用户对输入的更改而动态更改频率。本文将重点讨论 RHEL 5.2,它基于 2.6.18 内核,因此所有这些调控器都可以使用。(本系列的第 2 和第 3 部分将详细讨论调控器。)
性能调控器会静态将处理器设置为可用的最高频率。您可以调整此调控器可用的频率范围。顾名思义,此调控器的目标的通过将处理器时钟速度设置为最大级别而实现最大的系统性能。此调控器默认不会尝试提供任何电能节省,但您可以通过调优调控器来更改它所选的频率。
另一方面,电能节省调控器会静态将处理器设置为可用的最低频率。您仍然可以调整此调控器可用的频率范围。此调控器的作用是始终以最低的速度运行。显然,这有时会影响性能,因为无论处理器多么繁忙,系统都不会提高频率。
事实上,此调控器经常都不会节省任何电能,因为最有效的电能节省通常来自空闲时通过输入 C 电源状态实现的节省。使用电能节省调控器会拖慢进程的运行,因为它会以最低的频率运行;因此,系统需要花更长的时间进入空闲状态,然后才能获得 C 电源状态节省。
接下来介绍用户空间调控器,它允许您手动选择和设置频率。此调控器还可以与在用户空间中运行的处理器频率守护程序结合使用来控制频率(我们将在第 2 部分中讨论关于守护程序的更多信息,并提供一些示例)。此调控器可用于设置唯一的电源策略(不可预设,也不可从其他调控器获取);您还可以使用它来试验策略。
注意,用户空间调控器本身并不会动态更改频率;而是允许您或用户空间程序动态选择处理器频率。
2.6.10 内核中引入的随需应变调控器是首款根据处理器利用率动态更改处理器频率的内核调控器。随需应变调控器将检查处理器利用率,如果发现其超过阀值,则会将频率设置为可用的最高值。如果调控器发现利用率小于阀值,则会继续降低频率,直到它达到可用的最低值。
您可以控制可用频率的范围,调控器检查系统利用率的频率以及利用率阀值。
基于随需应变调控器的保守调控器(在 2.6.12 内核中引入)也是根据处理器利用率来调整频率;但是,保守调控器稍有不同,它允许电能更加渐进性地增加。保守调控器将检查处理器利用率,并比较其与阀值的大小,适当地增加或减少频率,而不是直接使用最高或最低的频率。
您可以控制可用频率的范围、调控器检查系统利用率的频率、利用率阀值以及频率渐进率。
在第 2 部分中,我们将更加深入地讨论子系统的设置和使用。我将为 Linux CPUfreq 子系统提供一些常规设置和使用设置,以及一些不同的接口选项。我还将讨论特定于调控器的设置和管理调度程序,以便帮助您确定最合适的工具。
在第 3 部分中,我将使用两种热门的配置工作负荷来讨论各调控器对不同工作负荷的效果。
学习
- 查看
支持 CPUfreq 子系统的硬件列表。
- 查阅关于能耗的更多资料:
- 教程 “如何利用动态变频”
- 教程 “增强的 Intel SpeedStep 技术和基于需求的 Linux 切换”
- 文章 “使电源策略生效”(在电源调度程序上)
- 文章 “Linux 中的 CPU 变频”
- 文档 “Linux CPUfreq 调控器”(Linux 内核中的 CPU 变频和电压调整代码)
- Gentoo “电源管理指南”(提供了一条警告 — 针对笔记本,因此不要应用于服务器,除非知道自己在做什么!)
- 教程 “如何使用 CPU 变频(cpufreq)”
- 关于 CPU 变频 的 Wiki 条目
- 教程 “可针对多核系统调优的调度程序”
- 以及 kernel.org 中关于 CPUfreq 子系统 的数据
- 需要帮助您重建/重新启动内核吗?阅读 Kwan Lowe 的
“Kernel 重建指南”。
- 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
- 随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
-
使用可从 developerWorks 直接下载的
IBM 产品评估试用版软件,在 Linux 上构建您的下一个开发项目。
讨论
-
参与
My developerWorks 社区;使用您的个人配置文件和自定义主页,您可以根据自己的需要定制 developerWorks 并与其他 developerWorks 用户交互。
