任何人在考虑业务成本或环境问题时都不得不重视电源效率。在本文中,我们将讨论如何使用 Linux CPUfreq 子系统和内核调控器来修改处理器的频率,从而改善系统效率,而不会对性能造成显著影响。但是,根据实际硬件的不同,电源效率调优存在一些限制(详见本系列的第 2 部分)。
Linux CPUfreq 子系统从 2.6.0 Linux 内核开始,您可以通过 CPUfreq 子系统动态调整处理器频率。当处理器以较低的时钟速度运行时,它们消耗的电能和产生的热量也相对较少。时钟速度的这种缩放可以控制系统在未全力运行时消耗较少电能。
CPUfreq 结构利用调控器和守护程序来为系统设置静态或动态电源策略。动态调控器(详见下文)可以根据 CPU 利用率来调整 CPU 频率,从而有助于节省电能,而不会牺牲性能。这些调控器还允许一些用户调优,因此您可以自定义并轻松地更改变频系数。此外,sched_mc_power_savings 和 sched_smt_power_savings 设置将利用整固线程来节省电能。
CPU 电源状态(C State)和 CPU/设备性能状态(P State)加入 My developerWorks 上的绿色小组在 My developerWorks 的 和 上讨论关于能源、效率和环境的话题,并共享相关资源。
在开始 CPUfreq 讨论之前,我们先来看看 CPU 电源状态和 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 频率和电压相关的运转状态。CPU/设备性能状态值越大,处理器所使用的频率和电压就越低。CPUfreq 调控器使用 CPU/设备性能状态来修改频率和降低功耗。
您需要在系统上启用 Processor Performance States BIOS 选项(或类似的选项),以便于使用 CPU/设备性能状态和 CPUfreq 调控器。图 1 是 C 和 CPU/设备性能状态的简化图。
图 1. CPU 电源状态和 CPU/设备性能状态CPUfreq 子系统的前提条件 在使用 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 内核中引入)也是根据处理器利用率来调整频率;但是,保守调控器稍有不同,它允许电能更加渐进性地增加。保守调控器将检查处理器利用率,并比较其与阀值的大小,适当地增加或减少频率,而不是直接使用最高或最低的频率。
您可以控制可用频率的范围、调控器检查系统利用率的频率、利用率阀值以及频率渐进率。