減少Linux耗電:一般設(shè)置和與調(diào)控器相關(guān)的設(shè)置
CPUfreq 的一般設(shè)置
我們先來介紹 Linux CPUfreq 子系統(tǒng)的使用設(shè)置并提供一些接口選項(xiàng),看看使用它是多么容易。先討論一些一般設(shè)置:
/sys 接口
cpuspeed 設(shè)置文件
cpufreq-utils
使用 /sys 接口
/sys 文件系統(tǒng)為 CPUfreq 提供用戶接口,起點(diǎn)是 /sys/devices/system/cpu/。其中一些文件是可寫的(由根用戶寫),其他文件是只讀的。
首先,看看 /sys/devices/system/cpu/。在這里會(huì)找到每個(gè)邏輯 CPU 的目錄和 sched_mc_power_savings 可調(diào)項(xiàng),如果在系統(tǒng)上可用的話,還會(huì)找到 sched_smt_power_savings 可調(diào)項(xiàng)(稍后討論)。
清單 1. 檢查 /sys/devices/system/cpu/ 的內(nèi)容
[root@systemx ~]# cd /sys/devices/system/cpu/
[root@systemx cpu]# ls
cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7 sched_mc_power_savings
在每個(gè)處理器的目錄內(nèi)是一個(gè) 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
加入 My developerWorks 上的綠色組
在 GReen IT Report space 和 My developerWorks 上的 Green computing group 討論與能源、效率和環(huán)境相關(guān)的主題并分享參考資料。
如果調(diào)控器設(shè)置為 conservative 或 ondemand,還會(huì)在這里看到與調(diào)控器同名的目錄。我們稍后討論如何改變調(diào)控器。
對于每個(gè)調(diào)控器,都可以使用這些文件。我們將討論每個(gè)設(shè)置的意義以及如何修改它們;然后討論這個(gè)接口之外與調(diào)控器相關(guān)的一些設(shè)置。注意,對于每個(gè)處理器,cpufreq 目錄下的設(shè)置可以不一樣,因此要想跨處理器應(yīng)用一致的策略,就必須按照后面的說明修改每個(gè)處理器的設(shè)置值。
首先,affected_cpus 顯示修改頻率會(huì)影響哪些處理器。由于硬件和/或軟件的關(guān)聯(lián),一些處理器的頻率是相互依賴的,必須同時(shí)修改頻率。例如,可能會(huì)看到這種設(shè)置:
清單 3. 檢查修改頻率會(huì)影響哪些處理器
[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 顯示處理器當(dāng)前的運(yùn)行頻率。scaling_cur_freq 文件列出調(diào)控器當(dāng)前使用的擴(kuò)展頻率。
清單 4. 檢查頻率
[root@systemx cpufreq]# cat cpuinfo_cur_freq
2997000
[root@systemx cpufreq]# cat scaling_cur_freq
2997000
這個(gè)接口中列出的所有頻率都以 KHz 為單位。
下面一些文件提供可用處理器頻率的相關(guān)信息。cpuinfo_max_freq 和 cpuinfo_min_freq 文件包含系統(tǒng)可用的***和最小頻率;scaling_available_frequencies 顯示所有可用頻率。
#p#清單 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 文件列出可用的所有調(diào)控器。如果沒有看到全部五個(gè)調(diào)控器,要檢查在配置文件中是否啟用了所有調(diào)控器并確保按第 1 部分中的說明裝載了調(diào)控器的模塊。
清單 6. 檢查可用的調(diào)控器
[root@systemx cpufreq]# cat scaling_available_governors
ondemand powersave conservative userspace performance
scaling_driver 文件說明系統(tǒng)正在運(yùn)行哪個(gè) cpufreq 驅(qū)動(dòng)程序。典型的驅(qū)動(dòng)程序包括 acpi、speedstep-smi、speedstep-centrino、powernor_k8、powernow_k7、longhaul 等。如果希望改變驅(qū)動(dòng)程序,需要先卸載正在使用的驅(qū)動(dòng)程序,然后再裝載另一個(gè)驅(qū)動(dòng)程序。另外,在使用之前,一定要檢查驅(qū)動(dòng)程序是否適用于您的處理器。
清單 7. 檢查系統(tǒng)正在運(yùn)行哪個(gè) cpufreq 驅(qū)動(dòng)程序
[root@systemx cpufreq]# cat scaling_driver
centrino
這個(gè)目錄中的其他文件可以由根用戶寫,可以通過它們修改一些 cpufreq 設(shè)置。這些文件只包含允許用戶修改的 powersave 和 performance 調(diào)控器設(shè)置。其他調(diào)控器有更多設(shè)置可用,我們在下一節(jié)中討論。
首先,scaling_governor 文件顯示當(dāng)前啟用的調(diào)控器。要想改變調(diào)控器,只需把新調(diào)控器的名稱 echo 到這個(gè)文件中。注意,要想應(yīng)用一致的策略,必須對每個(gè)處理器這么做。例如:
清單 8. 檢查啟用的調(diào)控器并改變調(diào)控器
[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 文件顯示調(diào)控器可用的***和最小頻率。通過把一個(gè)可用的頻率 echo 到這些文件中,用戶可以修改調(diào)控器可用頻率的范圍。注意,這個(gè)頻率必須是 scaling_available_frequencies 中列出的頻率之一,因?yàn)檫@些是系統(tǒng)可用的所有處理器頻率。同樣,必須對每個(gè)處理器這么做。例如:
清單 9. 修改調(diào)控器可用的頻率
[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 設(shè)置文件
除了像前面提到的那樣直接 echo 設(shè)置值,用戶還可以使用 cpuspeed 設(shè)置文件修改驅(qū)動(dòng)程序、調(diào)控器、***速度、最小速度、利用率閾值和 ignore_nice_load 設(shè)置。RHEL 5.2 附帶 cpuspeed,但是其他 Linux 發(fā)行版可能不包含這個(gè)包。如果您的發(fā)行版不包含 cpuspeed,可以 下載 carlthompson.net 版本;README 中提供安裝說明。要想使用 cpuspeed 的 RHEL 5.2 版本,只需編輯 /etc/sysconfig/cpuspeed 文件,在文件中設(shè)置任何變量值,然后執(zhí)行以下命令:
/etc/init.d/cpuspeed restart
這個(gè)命令會(huì)讓新設(shè)置生效。請記住,必須裝載相應(yīng)的調(diào)控器模塊,才能開始使用調(diào)控器,除非它已經(jīng)是內(nèi)置的。
使用 cpufreq-utils
RHEL 5.2 和其他一些發(fā)行版還附帶 cpufreq-utils 包,它為 CPUfreq 子系統(tǒng)提供另一個(gè)用戶接口。大多數(shù)其他發(fā)行版應(yīng)該也包含這個(gè)包。在安裝 cpufreq-utils rpm 時(shí),會(huì)得到兩個(gè)實(shí)用程序 cpufreq-info 和 cpufreq-set。
cpufreq-info 實(shí)用程序列出處理器的相關(guān)信息及其 CPUfreq 設(shè)置,比如當(dāng)前頻率、頻率限制、CPUfreq 驅(qū)動(dòng)程序、當(dāng)前策略、當(dāng)前調(diào)控器和 affected-cpus 列表。
在啟用 userspace 調(diào)控器時(shí),cpufreq-set 實(shí)用程序讓用戶可以修改每個(gè)處理器的可用頻率范圍、使用的調(diào)控器和當(dāng)前運(yùn)行頻率。更多信息見 cpufreq-info 和 cpufreq-set 手冊頁。
與調(diào)控器相關(guān)的設(shè)置
現(xiàn)在討論用戶可以在內(nèi)核調(diào)控器中修改的設(shè)置。
powersave 和 performance 調(diào)控器
這兩個(gè)調(diào)控器分別把處理器頻率靜態(tài)地設(shè)置為***和***頻率。用戶只能修改前一節(jié)中討論的設(shè)置。
userspace 調(diào)控器
#p#現(xiàn)在開始討論與調(diào)控器相關(guān)的設(shè)置。如果啟用 userspace 調(diào)控器,還會(huì)在 cpufreq 目錄中看到 scaling_setspeed 文件,根用戶可以寫這個(gè)文件。這個(gè)調(diào)控器讓用戶或用戶空間中的程序可以交互地修改處理器頻率。用戶可以把所需的頻率 echo 到這個(gè)文件中,一些用戶空間守護(hù)進(jìn)程也可以設(shè)置這個(gè)值。正如對前面討論的文件所做的,必須修改每個(gè)處理器的 scaling_setspeed 文件。
許多守護(hù)進(jìn)程使用 userspace 調(diào)控器調(diào)整處理器頻率;下面是幾個(gè)例子:
cpudyn(CPU 動(dòng)態(tài)頻率控制):這個(gè)守護(hù)進(jìn)程根據(jù)處理器負(fù)載修改基本頻率,還可以在沒有活動(dòng)時(shí)讓磁盤進(jìn)入備用狀態(tài)以節(jié)省能源。
cpufreqd:這個(gè)守護(hù)進(jìn)程可以對電池電壓、AC 狀態(tài)、溫度、正在運(yùn)行的程序、處理器使用量等做出反應(yīng)。
cpuspeed:這個(gè)守護(hù)進(jìn)程可以根據(jù)處理器需求、電源變化、溫度等改變頻率。
powernowd:這個(gè)調(diào)控器守護(hù)進(jìn)程根據(jù)處理器負(fù)載改變基本頻率,用戶可以選擇四種行為模式。
ondemand 調(diào)控器
如果裝載 ondemand 調(diào)控器,會(huì)在 cpufreq 目錄中看到 ondemand 目錄。在這個(gè)目錄中,有許多可調(diào)的設(shè)置。對于可由根用戶寫的所有文件,可以通過 echo 新的設(shè)置值來修改。注意,對 ondemand 設(shè)置的任何修改會(huì)應(yīng)用于整個(gè)系統(tǒng)范圍,所以不需要為每個(gè)處理器修改設(shè)置。
清單 10. 檢查 ondemand 的可調(diào)設(shè)置
[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 文件可以設(shè)置為 0 或 1(0 是默認(rèn)設(shè)置)。當(dāng)這個(gè)參數(shù)設(shè)置為 1 時(shí),任何具有 “nice” 值的處理器不計(jì)入總處理器利用率。在設(shè)置為 0 時(shí),所有處理器都計(jì)入利用率。如果運(yùn)行的某個(gè)程序需要大量處理器,但是您不關(guān)心運(yùn)行時(shí)間,就可以使用這個(gè)設(shè)置。如果把 “nice” 設(shè)置應(yīng)用于進(jìn)程,就可以避免它受到頻率調(diào)整的影響。
接下來,powersave_bias 文件可以略微改變 ondemand 調(diào)控器的行為,它在用戶不太關(guān)心性能的情況下把目標(biāo)頻率降低指定的百分比,從而節(jié)省更多電力。這個(gè)設(shè)置可以設(shè)置為 1 到 1000 之間的值,這會(huì)使頻率下降百分之 0.1 到***。
sampling_rate(以微秒為單位)決定調(diào)控器間隔多長時(shí)間檢查處理器利用率,以便決定設(shè)置什么頻率。這個(gè)設(shè)置必須設(shè)置為 sampling_rate_min 和 sampling_rate_max 之間的值。
***,up_threshold 設(shè)置允許用戶修改***處理器利用率閾值,這個(gè)閾值觸發(fā)處理器頻率修改。在默認(rèn)情況下,up_threshold 值為 80。這意味著,內(nèi)核將按照 sampling_rate 指定的時(shí)間間隔檢查處理器利用率,如果超過了百分之 80,調(diào)控器會(huì)把頻率提高到可用的***頻率。
conservative 調(diào)控器
如果裝載 conservative 調(diào)控器,會(huì)在 cpufreq 目錄中看到 conservative 目錄。在這個(gè)目錄中,有許多可調(diào)的設(shè)置。對于可由根用戶寫的所有文件,可以通過 echo 新的設(shè)置值來修改。注意,對 conservative 設(shè)置的任何修改會(huì)應(yīng)用于整個(gè)系統(tǒng)范圍,所以不需要為每個(gè)處理器修改設(shè)置。
清單 11. 檢查 conservative 的可調(diào)設(shè)置
[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 設(shè)置與前面討論的 ondemand 調(diào)控器中的設(shè)置相同。
conservative 調(diào)控器還允許用戶設(shè)置 down_threshold。例如,在默認(rèn)情況下 down_threshold 設(shè)置為 20。這意味著,內(nèi)核將按照 sampling_rate 指定的時(shí)間間隔檢查處理器利用率,如果低于百分之 20,調(diào)控器會(huì)降低頻率。
freq_step 設(shè)置修改調(diào)控器在調(diào)整 CPU 頻率時(shí)使用的頻率步長(包括提高和降低兩個(gè)方向)。在默認(rèn)情況下,這個(gè)值設(shè)置為 5,這意味著,在每次決定調(diào)整頻率時(shí),調(diào)控器調(diào)整頻率的幅度為***或最小頻率的百分之 5。如果把這個(gè)值設(shè)置為 100,這個(gè)調(diào)控器的表現(xiàn)會(huì)與 ondemand 調(diào)控器完全一樣。
***,sampling_down_factor 作為 sampling_rate 的乘數(shù),放寬處理器利用率取樣的時(shí)間間隔。例如,如果 sampling_rate 設(shè)置為 10,000,而 sampling_down_factor 設(shè)置為 2,那么處理器利用率取樣的時(shí)間間隔為 20,000 微秒。
調(diào)度器可調(diào)項(xiàng)
現(xiàn)在,討論兩個(gè)調(diào)度器可調(diào)項(xiàng) —
sched_mc_power_savings 用于在核上調(diào)度進(jìn)程。
sched_smt_power_savings 用于在核上的超線程上調(diào)度進(jìn)程。
sched_mc_power_savings
sched_mc_power_savings 是 /sys/devices/system/cpu/ 目錄中的調(diào)度器可調(diào)項(xiàng)。如果要使用這個(gè)可調(diào)項(xiàng),不要忘了把 CONFIG_SCHED_MC 配置文件選項(xiàng)設(shè)置為 y(見 減少 Linux 耗電,第 1 部分:CPUfreq 子系統(tǒng) 中的設(shè)置部分)。
清單 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 文件可以設(shè)置為 0 或 1;0 是默認(rèn)設(shè)置。在設(shè)置為 1 時(shí),調(diào)度器嘗試在盡可能少的核上調(diào)度進(jìn)程,讓其他核可以空閑。換句話說,如果所有處理器都不太忙,那么 sched_mc_power_savings 嘗試把工作整合在盡可能少的處理器上。然后就可以讓一些處理器空閑,從而進(jìn)一步節(jié)省電力,尤其是在處理器支持 C 狀態(tài)等深度睡眠狀態(tài)的情況下(在這種狀態(tài)下處理器在空閑時(shí)只消耗非常少的電力)。實(shí)際節(jié)省的電力取決于許多因素,包括可用處理器的數(shù)量和正在運(yùn)行哪種 CPUfreq 調(diào)控器。當(dāng) sched_mc_power_savings 設(shè)置為 0 時(shí),不執(zhí)行特殊的調(diào)度。
sched_smt_power_savings
sched_smt_power_savings 可調(diào)項(xiàng)也是 /sys/devices/system/cpu/ 目錄中的調(diào)度器可調(diào)項(xiàng);但是,這個(gè)可調(diào)項(xiàng)只適用于支持超線程的系統(tǒng)。如果要使用這個(gè)可調(diào)項(xiàng),不要忘了把 CONFIG_SCHED_SMT 配置文件選項(xiàng)設(shè)置為 y(見第 1 部分中的設(shè)置部分)。
清單 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 設(shè)置相似,sched_smt_power_savings 文件可以設(shè)置為 0 或 1;0 是默認(rèn)設(shè)置。在設(shè)置為 1 時(shí),調(diào)度器嘗試在核上盡可能少的超線程上調(diào)度進(jìn)程,讓其他超線程可以空閑,進(jìn)而通過空閑 C 狀態(tài)節(jié)省電力。
【編輯推薦】