这个 分三部分的系列 帮助您调整系统以提高能源效率。在第 2 部分中,详细了解 Linux? CPUfreq 子系统的一般设置,以及关于五个内核调控器(performance、powersave、userspace、ondemand 和 conservative)的更多信息和设置。
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_freq 和 cpuinfo_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 驱动程序。典型的驱动程序包括 acpi、speedstep-smi、speedstep-centrino、powernor_k8、powernow_k7、longhaul 等。如果希望改变驱动程序,需要先卸载正在使用的驱动程序,然后再装载另一个驱动程序。另外,在使用之前,一定要检查驱动程序是否适用于您的处理器。
清单 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_freq 和 scaling_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_min 和 sampling_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_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
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 部分中,我将以两个流行的配置工作负载为例,讨论每个调控器在不同工作负载上可以产生的效果。
参考资料
学习
阅读关于电力消耗的其他资料:
教程 “How to make use of Dynamic Frequency Scaling”
教程 “Enhanced Intel SpeedStep Technology and Demand-Based Switching on Linux”
文章 “Making power policy just work”(关于电力调度器)
文章 “CPU frequency scaling in Linux”
文档 “Linux CPUfreq Governors”(关于 Linux 内核中的 CPU 频率和电压扩展代码)
Gentoo “Power Management Guide”(警告:适用于笔记本计算机,除非有把握,不要应用于服务器!)
教程 “How to use CPU frequency scaling (cpufreq)”
wiki 文章 CPU Frequency Scaling
教程 “Scheduler tunables for multi-socket systems”
kernel.org 中关于 CPUfreq subsystem 的数据
下面是使用 userspace 调控器调整处理器频率的守护进程的信息:
cpudyn 是 CPU 动态频率控制守护进程,它根据处理器负载改变基本频率;还能够让磁盘进入备用状态。
cpufreqd 守护进程可以对电池电压、AC 状态、温度、正在运行的程序、处理器使用量等做出反应。
cpuspeed 守护进程可以根据处理器需求、电源变化、温度等改变频率。
powernowd 守护进程根据处理器负载改变基本频率,有四种行为模式。
查阅 支持 CPUfreq 子系统的硬件列表。
在重新构建/重新启动内核方面需要帮助吗?看看 Kwan Lowe 的 “Kernel Rebuild Guide”。
在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
下载 cpuspeed 的 carlthompson.net 版本。
使用可直接从 developerWorks 下载的 IBM 产品评估试用版软件 构建您的下一个 Linux 开发项目。
讨论
参与论坛讨论。
加入 My developerWorks 社区;您可以通过个人信息和定制主页获得自己感兴趣的 developerWorks 文章,并与其他 developerWorks 用户进行交流。
关于作者
Jenifer Hopper 在 IBM 位于美国德克萨斯州 Asutin 的 Linux 性能小组担任软件工程师。她目前致力于高性能计算(High Performance Computing,HPC)、能源工作负荷以及系统探查器和数据分析工具。