内容


减少 Linux 耗电,第 2 部分

一般设置和与调控器相关的设置

学习可以设置什么以及它们如何影响电力使用量

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 减少 Linux 耗电,第 2 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:减少 Linux 耗电,第 2 部分

敬请期待该系列的后续内容。

CPUfreq 的一般设置

我们先来介绍 Linux CPUfreq 子系统的使用设置并提供一些接口选项,看看使用它是多么容易。先讨论一些一般设置:

  • /sys 接口
  • cpuspeed 设置文件
  • cpufreq-utils

使用 /sys 接口

/sys 文件系统为 CPUfreq 提供用户接口,起点是 /sys/devices/system/cpu/。其中一些文件是可写的(由根用户写),其他文件是只读的。

首先,看看 /sys/devices/system/cpu/。在这里会找到每个逻辑 CPU 的目录和 sched_mc_power_savings 可调项,如果在系统上可用的话,还会找到 sched_smt_power_savings 可调项(稍后讨论)。

清单 1. 检查 /sys/devices/system/cpu/ 的内容
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls
cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 sched_mc_power_savings

在每个处理器的目录内是一个 cpufreq 目录,它包含 CPUfreq 接口:

清单 2. 检查 cpufreq 目录
[root@systemx cpu]# cd cpu0/cpufreq/
[root@systemx cpufreq]# ls -l
total 0
-r--r--r-- 1 root root 4096 Oct 31 14:53 affected_cpus
-r-------- 1 root root 4096 Oct 31 14:53 cpuinfo_cur_freq
-r--r--r-- 1 root root 4096 Oct 31 14:53 cpuinfo_max_freq
-r--r--r-- 1 root root 4096 Oct 31 14:53 cpuinfo_min_freq
-r--r--r-- 1 root root 4096 Oct 31 14:53 scaling_available_frequencies
-r--r--r-- 1 root root 4096 Oct 31 14:53 scaling_available_governors
-r--r--r-- 1 root root 4096 Oct 31 14:53 scaling_cur_freq
-r--r--r-- 1 root root 4096 Oct 31 14:53 scaling_driver
-rw-r--r-- 1 root root 0 Nov 5 11:44 scaling_governor
-rw-r--r-- 1 root root 4096 Oct 31 14:53 scaling_max_freq
-rw-r--r-- 1 root root 4096 Oct 31 14:53 scaling_min_freq

如果调控器设置为 conservative 或 ondemand,还会在这里看到与调控器同名的目录。我们稍后讨论如何改变调控器。

对于每个调控器,都可以使用这些文件。我们将讨论每个设置的意义以及如何修改它们;然后讨论这个接口之外与调控器相关的一些设置。注意,对于每个处理器,cpufreq 目录下的设置可以不一样,因此要想跨处理器应用一致的策略,就必须按照后面的说明修改每个处理器的设置值。

首先,affected_cpus 显示修改频率会影响哪些处理器。由于硬件和/或软件的关联,一些处理器的频率是相互依赖的,必须同时修改频率。例如,可能会看到这种设置:

清单 3. 检查修改频率会影响哪些处理器
[root@systemx ~]# cd /sys/devices/system/cpu
[root@systemx cpu]# grep . cpu*/cpufreq/affected_cpus
cpu0/cpufreq/affected_cpus:0 1
cpu1/cpufreq/affected_cpus:0 1
cpu2/cpufreq/affected_cpus:2 3
cpu3/cpufreq/affected_cpus:2 3

接下来,cpuinfo_cur_freq 显示处理器当前的运行频率。scaling_cur_freq 文件列出调控器当前使用的扩展频率。

清单 4. 检查频率
[root@systemx cpufreq]# cat cpuinfo_cur_freq
2997000
[root@systemx cpufreq]# cat scaling_cur_freq
2997000

这个接口中列出的所有频率都以 KHz 为单位。

下面一些文件提供可用处理器频率的相关信息。cpuinfo_max_freqcpuinfo_min_freq 文件包含系统可用的最大和最小频率;scaling_available_frequencies 显示所有可用频率。

清单 5. 检查最大、最小和可用频率
[root@systemx cpufreq]# cat cpuinfo_max_freq
2997000
[root@systemx cpufreq]# cat cpuinfo_min_freq
1998000
[root@systemx cpufreq]# cat scaling_available_frequencies
2997000 2664000 2331000 1998000

scaling_available_governors 文件列出可用的所有调控器。如果没有看到全部五个调控器,要检查在配置文件中是否启用了所有调控器并确保按第 1 部分中的说明装载了调控器的模块。

清单 6. 检查可用的调控器
[root@systemx cpufreq]# cat scaling_available_governors
ondemand powersave conservative userspace performance

scaling_driver 文件说明系统正在运行哪个 cpufreq 驱动程序。典型的驱动程序包括 acpispeedstep-smispeedstep-centrinopowernor_k8powernow_k7longhaul 等。如果希望改变驱动程序,需要先卸载正在使用的驱动程序,然后再装载另一个驱动程序。另外,在使用之前,一定要检查驱动程序是否适用于您的处理器。

清单 7. 检查系统正在运行哪个 cpufreq 驱动程序
[root@systemx cpufreq]# cat scaling_driver
centrino

这个目录中的其他文件可以由根用户写,可以通过它们修改一些 cpufreq 设置。这些文件只包含允许用户修改的 powersave 和 performance 调控器设置。其他调控器有更多设置可用,我们在下一节中讨论。

首先,scaling_governor 文件显示当前启用的调控器。要想改变调控器,只需把新调控器的名称 echo 到这个文件中。注意,要想应用一致的策略,必须对每个处理器这么做。例如:

清单 8. 检查启用的调控器并改变调控器
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls
cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 sched_mc_power_savings
[root@systemx cpu]# cat cpu0/cpufreq/scaling_governor
performance
[root@systemx cpu]# echo conservative > cpu0/cpufreq/scaling_governor
[root@systemx cpu]# cat cpu0/cpufreq/scaling_governor
conservative

scaling_max_freqscaling_min_freq 文件显示调控器可用的最大和最小频率。通过把一个可用的频率 echo 到这些文件中,用户可以修改调控器可用频率的范围。注意,这个频率必须是 scaling_available_frequencies 中列出的频率之一,因为这些是系统可用的所有处理器频率。同样,必须对每个处理器这么做。例如:

清单 9. 修改调控器可用的频率
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# cat cpu0/cpufreq/scaling_available_frequencies
2997000 2664000 2331000 1998000
[root@systemx cpu]# cat cpu0/cpufreq/scaling_max_freq
2997000
[root@systemx cpu]# cat cpu0/cpufreq/scaling_min_freq
1998000
[root@systemx cpu]# echo 2331000 > cpu0/cpufreq/scaling_min_freq
[root@systemx cpu]# cat cpu0/cpufreq/scaling_min_freq
2331000

使用 cpuspeed 设置文件

除了像前面提到的那样直接 echo 设置值,用户还可以使用 cpuspeed 设置文件修改驱动程序、调控器、最大速度、最小速度、利用率阈值和 ignore_nice_load 设置。RHEL 5.2 附带 cpuspeed,但是其他 Linux 发行版可能不包含这个包。如果您的发行版不包含 cpuspeed,可以 下载 carlthompson.net 版本;README 中提供安装说明。要想使用 cpuspeed 的 RHEL 5.2 版本,只需编辑 /etc/sysconfig/cpuspeed 文件,在文件中设置任何变量值,然后执行以下命令:

/etc/init.d/cpuspeed restart

这个命令会让新设置生效。请记住,必须装载相应的调控器模块,才能开始使用调控器,除非它已经是内置的。

使用 cpufreq-utils

RHEL 5.2 和其他一些发行版还附带 cpufreq-utils 包,它为 CPUfreq 子系统提供另一个用户接口。大多数其他发行版应该也包含这个包。在安装 cpufreq-utils rpm 时,会得到两个实用程序 cpufreq-info 和 cpufreq-set。

cpufreq-info 实用程序列出处理器的相关信息及其 CPUfreq 设置,比如当前频率、频率限制、CPUfreq 驱动程序、当前策略、当前调控器和 affected-cpus 列表。

在启用 userspace 调控器时,cpufreq-set 实用程序让用户可以修改每个处理器的可用频率范围、使用的调控器和当前运行频率。更多信息见 cpufreq-info 和 cpufreq-set 手册页。

与调控器相关的设置

现在讨论用户可以在内核调控器中修改的设置。

powersave 和 performance 调控器

这两个调控器分别把处理器频率静态地设置为最低和最高频率。用户只能修改前一节中讨论的设置。

userspace 调控器

现在开始讨论与调控器相关的设置。如果启用 userspace 调控器,还会在 cpufreq 目录中看到 scaling_setspeed 文件,根用户可以写这个文件。这个调控器让用户或用户空间中的程序可以交互地修改处理器频率。用户可以把所需的频率 echo 到这个文件中,一些用户空间守护进程也可以设置这个值。正如对前面讨论的文件所做的,必须修改每个处理器的 scaling_setspeed 文件。

许多守护进程使用 userspace 调控器调整处理器频率;下面是几个例子:

  • cpudyn(CPU 动态频率控制):这个守护进程根据处理器负载修改基本频率,还可以在没有活动时让磁盘进入备用状态以节省能源。
  • cpufreqd:这个守护进程可以对电池电压、AC 状态、温度、正在运行的程序、处理器使用量等做出反应。
  • cpuspeed:这个守护进程可以根据处理器需求、电源变化、温度等改变频率。
  • powernowd:这个调控器守护进程根据处理器负载改变基本频率,用户可以选择四种行为模式。

ondemand 调控器

如果装载 ondemand 调控器,会在 cpufreq 目录中看到 ondemand 目录。在这个目录中,有许多可调的设置。对于可由根用户写的所有文件,可以通过 echo 新的设置值来修改。注意,对 ondemand 设置的任何修改会应用于整个系统范围,所以不需要为每个处理器修改设置。

清单 10. 检查 ondemand 的可调设置
[root@systemx ~]# cd /sys/devices/system/cpu/cpu0/cpufreq/ondemand/
[root@systemx ondemand]# ls -l
total 0
-rw-r--r-- 1 root root 4096 Nov 19 10:30 ignore_nice_load
-rw-r--r-- 1 root root 4096 Nov 19 10:30 powersave_bias
-rw-r--r-- 1 root root 4096 Nov 19 10:30 sampling_rate
-r--r--r-- 1 root root 4096 Nov 19 10:30 sampling_rate_max
-r--r--r-- 1 root root 4096 Nov 19 10:30 sampling_rate_min
-rw-r--r-- 1 root root 4096 Nov 19 10:30 up_threshold

ignore_nice_load 文件可以设置为 0 或 1(0 是默认设置)。当这个参数设置为 1 时,任何具有 “nice” 值的处理器不计入总处理器利用率。在设置为 0 时,所有处理器都计入利用率。如果运行的某个程序需要大量处理器,但是您不关心运行时间,就可以使用这个设置。如果把 “nice” 设置应用于进程,就可以避免它受到频率调整的影响。

接下来,powersave_bias 文件可以略微改变 ondemand 调控器的行为,它在用户不太关心性能的情况下把目标频率降低指定的百分比,从而节省更多电力。这个设置可以设置为 1 到 1000 之间的值,这会使频率下降百分之 0.1 到百分之百。

sampling_rate(以微秒为单位)决定调控器间隔多长时间检查处理器利用率,以便决定设置什么频率。这个设置必须设置为 sampling_rate_minsampling_rate_max 之间的值。

最后,up_threshold 设置允许用户修改最大处理器利用率阈值,这个阈值触发处理器频率修改。在默认情况下,up_threshold 值为 80。这意味着,内核将按照 sampling_rate 指定的时间间隔检查处理器利用率,如果超过了百分之 80,调控器会把频率提高到可用的最大频率。

conservative 调控器

如果装载 conservative 调控器,会在 cpufreq 目录中看到 conservative 目录。在这个目录中,有许多可调的设置。对于可由根用户写的所有文件,可以通过 echo 新的设置值来修改。注意,对 conservative 设置的任何修改会应用于整个系统范围,所以不需要为每个处理器修改设置。

清单 11. 检查 conservative 的可调设置
[root@systemx ~]# cd /sys/devices/system/cpu/cpu0/cpufreq/conservative/
[root@systemx conservative]# ls -l
total 0
-rw-r--r-- 1 root root 4096 Nov 19 11:31 down_threshold
-rw-r--r-- 1 root root 4096 Nov 19 11:31 freq_step
-rw-r--r-- 1 root root 4096 Nov 19 11:31 ignore_nice_load
-rw-r--r-- 1 root root 4096 Nov 19 11:31 sampling_down_factor
-rw-r--r-- 1 root root 4096 Nov 19 11:31 sampling_rate
-r--r--r-- 1 root root 4096 Nov 19 11:31 sampling_rate_max
-r--r--r-- 1 root root 4096 Nov 19 11:31 sampling_rate_min
-rw-r--r-- 1 root root 4096 Nov 19 11:31 up_threshold

ignore_nice_loadsampling_ratesampling_rate_maxsampling_rate_minup_threshold 设置与前面讨论的 ondemand 调控器中的设置相同。

conservative 调控器还允许用户设置 down_threshold。例如,在默认情况下 down_threshold 设置为 20。这意味着,内核将按照 sampling_rate 指定的时间间隔检查处理器利用率,如果低于百分之 20,调控器会降低频率。

freq_step 设置修改调控器在调整 CPU 频率时使用的频率步长(包括提高和降低两个方向)。在默认情况下,这个值设置为 5,这意味着,在每次决定调整频率时,调控器调整频率的幅度为最大或最小频率的百分之 5。如果把这个值设置为 100,这个调控器的表现会与 ondemand 调控器完全一样。

最后,sampling_down_factor 作为 sampling_rate 的乘数,放宽处理器利用率取样的时间间隔。例如,如果 sampling_rate 设置为 10,000,而 sampling_down_factor 设置为 2,那么处理器利用率取样的时间间隔为 20,000 微秒。

调度器可调项

现在,讨论两个调度器可调项 —

  • sched_mc_power_savings 用于在核上调度进程。
  • sched_smt_power_savings 用于在核上的超线程上调度进程。

sched_mc_power_savings

sched_mc_power_savings 是 /sys/devices/system/cpu/ 目录中的调度器可调项。如果要使用这个可调项,不要忘了把 CONFIG_SCHED_MC 配置文件选项设置为 y(见 减少 Linux 耗电,第 1 部分:CPUfreq 子系统 中的设置部分)。

清单 12. 检查 sched_mc_power_savings 的位置
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls -l
total 0
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu0
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu1
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu2
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu3
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu4
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu5
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu6
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu7
-rwxrwxr-x 1 root root 4096 Nov 19 09:54 sched_mc_power_savings

sched_mc_power_savings 文件可以设置为 0 或 1;0 是默认设置。在设置为 1 时,调度器尝试在尽可能少的核上调度进程,让其他核可以空闲。换句话说,如果所有处理器都不太忙,那么 sched_mc_power_savings 尝试把工作整合在尽可能少的处理器上。然后就可以让一些处理器空闲,从而进一步节省电力,尤其是在处理器支持 C 状态等深度睡眠状态的情况下(在这种状态下处理器在空闲时只消耗非常少的电力)。实际节省的电力取决于许多因素,包括可用处理器的数量和正在运行哪种 CPUfreq 调控器。当 sched_mc_power_savings 设置为 0 时,不执行特殊的调度。

sched_smt_power_savings

sched_smt_power_savings 可调项也是 /sys/devices/system/cpu/ 目录中的调度器可调项;但是,这个可调项只适用于支持超线程的系统。如果要使用这个可调项,不要忘了把 CONFIG_SCHED_SMT 配置文件选项设置为 y(见第 1 部分中的设置部分)。

清单 13. 检查 sched_smt_power_savings 的位置
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls -l
total 0
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu0
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu1
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu2
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu3
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu4
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu5
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu6
drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu7
-rwxrwxr-x 1 root root 4096 Nov 19 09:54 sched_mc_power_savings
-rwxrwxr-x 1 root root 4096 Nov 19 09:54 sched_smt_power_savings

sched_mc_power_savings 设置相似,sched_smt_power_savings 文件可以设置为 0 或 1;0 是默认设置。在设置为 1 时,调度器尝试在核上尽可能少的超线程上调度进程,让其他超线程可以空闲,进而通过空闲 C 状态节省电力。

结束语

在第 3 部分中,我将以两个流行的配置工作负载为例,讨论每个调控器在不同工作负载上可以产生的效果。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=439300
ArticleTitle=减少 Linux 耗电,第 2 部分: 一般设置和与调控器相关的设置
publish-date=10262009