在本系列中,学习如何调整基于 Linux 的 IBM System x 服务器以提高能源效率。您将了解内核调控器及其设置以及如何使用它们;还会看到经过调优的调控器对电源效率和电子商务工作负载的影响。示例使用一个运行 Red Hat Enterprise Linux version 5.2 (RHEL 5.2) 的 System x 服务器,但是原理可以应用于任何 2.6.x 内核以及支持变频的任何处理器类型。
减少 Linux 耗电,第 1 部分:CPUfreq 子系统 介绍系统调优所需的组件和概念,包括 Linux CPUfreq 子系统、C 和 P 状态以及五个内核调控器。
第 2 部分详细介绍 Linux CPUfreq 子系统的一般设置,以及五个内核调控器 — performance、powersave、userspace、ondemand 和conservative — 及其设置。
第 3 部分将对比五个内核调控器在调优和未调优状态下的性能,展示通过系统电源调优可以实现的效果。
我们先来介绍 Linux CPUfreq 子系统的使用设置并提供一些接口选项,看看使用它是多么容易。先讨论一些一般设置:
/sys 文件系统为 CPUfreq 提供用户接口,起点是 /sys/devices/system/cpu/。其中一些文件是可写的(由根用户写),其他文件是只读的。
首先,看看 /sys/devices/system/cpu/。在这里会找到每个逻辑 CPU 的目录和 sched_mc_power_savings
可调项,如果在系统上可用的话,还会找到 sched_smt_power_savings
可调项(稍后讨论)。
[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 接口:
[root@systemx cpu]# cd cpu0/cpufreq/[root@systemx cpufreq]# ls -ltotal 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
在 GReen IT Report space 和 My developerWorks 上的 Greencomputing group 讨论与能源、效率和环境相关的主题并分享参考资料。
如果调控器设置为 conservative 或 ondemand,还会在这里看到与调控器同名的目录。我们稍后讨论如何改变调控器。
对于每个调控器,都可以使用这些文件。我们将讨论每个设置的意义以及如何修改它们;然后讨论这个接口之外与调控器相关的一些设置。注意,对于每个处理器,cpufreq 目录下的设置可以不一样,因此要想跨处理器应用一致的策略,就必须按照后面的说明修改每个处理器的设置值。
首先,affected_cpus
显示修改频率会影响哪些处理器。由于硬件和/或软件的关联,一些处理器的频率是相互依赖的,必须同时修改频率。例如,可能会看到这种设置:
[root@systemx ~]# cd /sys/devices/system/cpu[root@systemx cpu]# grep . cpu*/cpufreq/affected_cpuscpu0/cpufreq/affected_cpus:0 1cpu1/cpufreq/affected_cpus:0 1cpu2/cpufreq/affected_cpus:2 3cpu3/cpufreq/affected_cpus:2 3
接下来,cpuinfo_cur_freq
显示处理器当前的运行频率。scaling_cur_freq
文件列出调控器当前使用的扩展频率。
[root@systemx cpufreq]# cat cpuinfo_cur_freq2997000[root@systemx cpufreq]# cat scaling_cur_freq2997000
这个接口中列出的所有频率都以 KHz 为单位。
下面一些文件提供可用处理器频率的相关信息。cpuinfo_max_freq
和 cpuinfo_min_freq
文件包含系统可用的最大和最小频率;scaling_available_frequencies
显示所有可用频率。
[root@systemx cpufreq]# cat cpuinfo_max_freq2997000[root@systemx cpufreq]# cat cpuinfo_min_freq1998000[root@systemx cpufreq]# cat scaling_available_frequencies2997000 2664000 2331000 1998000
scaling_available_governors
文件列出可用的所有调控器。如果没有看到全部五个调控器,要检查在配置文件中是否启用了所有调控器并确保按第 1 部分中的说明装载了调控器的模块。
[root@systemx cpufreq]# cat scaling_available_governorsondemand powersave conservative userspace performance
scaling_driver
文件说明系统正在运行哪个 cpufreq 驱动程序。典型的驱动程序包括 acpi
、speedstep-smi
、speedstep-centrino
、powernor_k8
、powernow_k7
、longhaul
等。如果希望改变驱动程序,需要先卸载正在使用的驱动程序,然后再装载另一个驱动程序。另外,在使用之前,一定要检查驱动程序是否适用于您的处理器。
[root@systemx cpufreq]# cat scaling_drivercentrino
这个目录中的其他文件可以由根用户写,可以通过它们修改一些 cpufreq 设置。这些文件只包含允许用户修改的 powersave 和 performance 调控器设置。其他调控器有更多设置可用,我们在下一节中讨论。
首先,scaling_governor
文件显示当前启用的调控器。要想改变调控器,只需把新调控器的名称 echo
到这个文件中。注意,要想应用一致的策略,必须对每个处理器这么做。例如:
[root@systemx ~]# cd /sys/devices/system/cpu/[root@systemx cpu]# lscpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 sched_mc_power_savings[root@systemx cpu]# cat cpu0/cpufreq/scaling_governorperformance[root@systemx cpu]# echo conservative > cpu0/cpufreq/scaling_governor[root@systemx cpu]# cat cpu0/cpufreq/scaling_governorconservative
scaling_max_freq
和 scaling_min_freq
文件显示调控器可用的最大和最小频率。通过把一个可用的频率 echo
到这些文件中,用户可以修改调控器可用频率的范围。注意,这个频率必须是 scaling_available_frequencies
中列出的频率之一,因为这些是系统可用的所有处理器频率。同样,必须对每个处理器这么做。例如:
[root@systemx ~]# cd /sys/devices/system/cpu/[root@systemx cpu]# cat cpu0/cpufreq/scaling_available_frequencies2997000 2664000 2331000 1998000[root@systemx cpu]# cat cpu0/cpufreq/scaling_max_freq2997000[root@systemx cpu]# cat cpu0/cpufreq/scaling_min_freq1998000[root@systemx cpu]# echo 2331000 > cpu0/cpufreq/scaling_min_freq[root@systemx cpu]# cat cpu0/cpufreq/scaling_min_freq2331000
除了像前面提到的那样直接 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
这个命令会让新设置生效。请记住,必须装载相应的调控器模块,才能开始使用调控器,除非它已经是内置的。
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 手册页。
现在讨论用户可以在内核调控器中修改的设置。
这两个调控器分别把处理器频率静态地设置为最低和最高频率。用户只能修改前一节中讨论的设置。
现在开始讨论与调控器相关的设置。如果启用 userspace 调控器,还会在 cpufreq 目录中看到 scaling_setspeed
文件,根用户可以写这个文件。这个调控器让用户或用户空间中的程序可以交互地修改处理器频率。用户可以把所需的频率 echo
到这个文件中,一些用户空间守护进程也可以设置这个值。正如对前面讨论的文件所做的,必须修改每个处理器的 scaling_setspeed
文件。
许多守护进程使用 userspace 调控器调整处理器频率;下面是几个例子:
cpudyn
(CPU 动态频率控制):这个守护进程根据处理器负载修改基本频率,还可以在没有活动时让磁盘进入备用状态以节省能源。cpufreqd
:这个守护进程可以对电池电压、AC 状态、温度、正在运行的程序、处理器使用量等做出反应。cpuspeed
:这个守护进程可以根据处理器需求、电源变化、温度等改变频率。powernowd
:这个调控器守护进程根据处理器负载改变基本频率,用户可以选择四种行为模式。如果装载 ondemand 调控器,会在 cpufreq 目录中看到 ondemand 目录。在这个目录中,有许多可调的设置。对于可由根用户写的所有文件,可以通过 echo
新的设置值来修改。注意,对 ondemand 设置的任何修改会应用于整个系统范围,所以不需要为每个处理器修改设置。
[root@systemx ~]# cd /sys/devices/system/cpu/cpu0/cpufreq/ondemand/[root@systemx ondemand]# ls -ltotal 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_min
和 sampling_rate_max
之间的值。
最后,up_threshold
设置允许用户修改最大处理器利用率阈值,这个阈值触发处理器频率修改。在默认情况下,up_threshold
值为 80。这意味着,内核将按照 sampling_rate
指定的时间间隔检查处理器利用率,如果超过了百分之 80,调控器会把频率提高到可用的最大频率。
如果装载 conservative 调控器,会在 cpufreq 目录中看到 conservative 目录。在这个目录中,有许多可调的设置。对于可由根用户写的所有文件,可以通过 echo
新的设置值来修改。注意,对 conservative 设置的任何修改会应用于整个系统范围,所以不需要为每个处理器修改设置。
[root@systemx ~]# cd /sys/devices/system/cpu/cpu0/cpufreq/conservative/[root@systemx conservative]# ls -ltotal 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_load
、sampling_rate
、sampling_rate_max
、sampling_rate_min
和 up_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
是 /sys/devices/system/cpu/ 目录中的调度器可调项。如果要使用这个可调项,不要忘了把 CONFIG_SCHED_MC
配置文件选项设置为 y
(见 减少 Linux 耗电,第 1 部分:CPUfreq 子系统 中的设置部分)。
[root@systemx ~]# cd /sys/devices/system/cpu/[root@systemx cpu]# ls -ltotal 0drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu0drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu1drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu2drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu3drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu4drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu5drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu6drwxr-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
可调项也是 /sys/devices/system/cpu/ 目录中的调度器可调项;但是,这个可调项只适用于支持超线程的系统。如果要使用这个可调项,不要忘了把 CONFIG_SCHED_SMT
配置文件选项设置为 y
(见第 1 部分中的设置部分)。
[root@systemx ~]# cd /sys/devices/system/cpu/[root@systemx cpu]# ls -ltotal 0drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu0drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu1drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu2drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu3drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu4drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu5drwxr-xr-x 5 root root 0 Nov 12 17:45 cpu6drwxr-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 部分中,我将以两个流行的配置工作负载为例,讨论每个调控器在不同工作负载上可以产生的效果。
联系客服