Reference from IBM research.
減少Linux耗電,第2部分: 一般設置和與調控器相關的設置
CPUfreq 的一般設置我們先來介紹Linux CPUfreq 子系統的使用設置並提供一些接口選項,看看使用它是多麼容易。 先討論一些一般設置:
- /sys 接口
- cpuspeed 設置文件
- cpufreq-utils
/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調控器,會在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 是/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開發項目。
沒有留言:
張貼留言