Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
電源管理指南
管理 Red Hat Enterprise Linux 6 的電源消耗量
Red Hat Inc.
Don Domingo
Rüdiger Landmann
摘要
章 1. 總覽
1.1. 電源管理的重要性
- 降低整體的電力消耗量,以節省成本
- 降低伺服器與運算中心的熱量
- 降低次要成本,包括冷卻系統、空間、機房、發電機、UPS(不斷電系統,uninterruptible power supplies)等
- 延長筆記型電腦的電池壽命
- 減低碳排放量
- 符合綠 IT 的政府法規與法律需求,例如能源之星(Energy Star)標準
- 符合公司對於新系統的章程
1.2. 電源管理的基本概念
Red Hat Enterprise Linux 5 的 kernel 對每個 CPU 使用一個定期的計時器。這個計時器會避免處理器真的進入閒置狀態,因為不管 CPU 是不是正在執行程序,計時器都會要求 CPU 處理每個計時器的事件(每隔幾毫秒就會發生一次,視設定而定)。要有效管理電源,極大部分是與降低喚醒 CPU 的頻率有關。
這對擁有移動零件的裝置(例如硬碟)尤其重要。除此之外,有些應用程式可能會讓不使用、但仍啟用的裝置處於開啟(open)狀態;當這情況發生時,kernel 會假定這裝置還在使用中,讓裝置無法進入省電模式。
然而在許多情況下,這端賴較新的硬體與正確的 BIOS 配置。較舊的系統元件通常不支援 Red Hat Enterprise Linux 6 提供的一些新功能。請確定您電腦使用的是最新的官方韌體,同時 BIOS 裡的電源管理或裝置配置都已經啟用。要注意的功能包括:
- SpeedStep
- PowerNow!
- Cool'n'Quiet
- ACPI (C state)
- Smart
現代 CPU 都支援 ACPI(Advanced Configuration and Power Interface,進階配置與電源介面)功能,提供多種電源狀態。這三種狀態為:
- 睡眠(C-state)
- 頻率(P-state)
- 熱輸出(T-state 或稱「thermal state」:熱能狀態)
很明顯的,最省電的方式是完全關閉電腦的電源。舉例來說,您的公司可以發展出「綠 IT」的企業文化,讓員工在外出午餐或回家前,將電腦關閉。您也可以使用 Red Hat Enterprise Linux 6 的虛擬化技術,把數台伺服器整合至一台較大的伺服器。
章 2. 電源管理的稽核與分析
2.1. 稽核與分析概要
2.2. PowerTOP
root
身份執行下列指令:
yum install powertop
root
身份執行下列指令:
powertop
root
身份執行以下指令:
powertop --calibrate
chkconfig off servicename off
root
身份執行以下指令:
ps -awux | grep processname
strace -p processid
C4
比 C3
高)。這能顯示 CPU 使用量的優化程度如何。當系統閒置時,最高的 C 或 P-State 應要擁有超過 90% 的駐留時間。
圖形 2.1. PowerTOP 的操作畫面
--html
選項來產生 HTML 報告。請將 htmlfile.html 參數替換為您希望使用的輸出檔案之名稱:
powertop --html=htmlfile.html
--time
選項來更改此行為:
powertop --html=htmlfile.html --time=seconds
turbostat
(8) man page,或參閱《效能微調指南》。
2.3. Diskdevstat 與 netdevstat
root
身份透過下列指令來以 SystemTap 安裝這些工具:
yum install systemtap tuned-utils kernel-debuginfo
diskdevstat
netdevstat
diskdevstat update_interval total_duration display_histogram
netdevstat update_interval total_duration display_histogram
- update_interval
- 每次更新畫面的時間間隔,單位為秒。預設值為
5
- total_duration
- 整個執行時間,單位為秒。預設值為
86400
(一天) - display_histogram
- 旗標值,表示在執行結束時,是不是要將所有資料以直方圖列出。
PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND 2789 2903 sda1 854 0.000 120.000 39.836 0 0.000 0.000 0.000 plasma 15494 0 sda1 0 0.000 0.000 0.000 758 0.000 0.012 0.000 0logwatch 15520 0 sda1 0 0.000 0.000 0.000 140 0.000 0.009 0.000 perl 15549 0 sda1 0 0.000 0.000 0.000 140 0.000 0.009 0.000 perl 15585 0 sda1 0 0.000 0.000 0.000 108 0.001 0.002 0.000 perl 2573 0 sda1 63 0.033 3600.015 515.226 0 0.000 0.000 0.000 auditd 15429 0 sda1 0 0.000 0.000 0.000 62 0.009 0.009 0.000 crond 15379 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15473 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15415 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15433 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15425 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15375 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15477 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15469 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15419 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15481 0 sda1 0 0.000 0.000 0.000 61 0.000 0.001 0.000 crond 15355 0 sda1 0 0.000 0.000 0.000 37 0.000 0.014 0.001 laptop_mode 2153 0 sda1 26 0.003 3600.029 1290.730 0 0.000 0.000 0.000 rsyslogd 15575 0 sda1 0 0.000 0.000 0.000 16 0.000 0.000 0.000 cat 15581 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15582 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15579 0 sda1 0 0.000 0.000 0.000 12 0.000 0.001 0.000 perl 15580 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15354 0 sda1 0 0.000 0.000 0.000 12 0.000 0.170 0.014 sh 15584 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15548 0 sda1 0 0.000 0.000 0.000 12 0.001 0.014 0.001 perl 15577 0 sda1 0 0.000 0.000 0.000 12 0.001 0.003 0.000 perl 15519 0 sda1 0 0.000 0.000 0.000 12 0.001 0.005 0.000 perl 15578 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15583 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15547 0 sda1 0 0.000 0.000 0.000 11 0.000 0.002 0.000 perl 15576 0 sda1 0 0.000 0.000 0.000 11 0.001 0.001 0.000 perl 15518 0 sda1 0 0.000 0.000 0.000 11 0.000 0.001 0.000 perl 15354 0 sda1 0 0.000 0.000 0.000 10 0.053 0.053 0.005 lm_lid.sh
- PID
- 應用程式的程序 ID
- UID
- 執行應用程式的使用者 ID
- DEV
- 發生 I/O 的裝置
- WRITE_CNT
- 寫入的總數
- WRITE_MIN
- 兩次連續寫入的最短時間(單位為秒)
- WRITE_MAX
- 兩次連續寫入的最長時間(單位為秒)
- WRITE_AVG
- 兩次連續寫入的平均時間(單位為秒)
- READ_CNT
- 讀取的總數
- READ_MIN
- 兩次連續讀取的最短時間(單位為秒)
- READ_MAX
- 兩次連續讀取的最長時間(單位為秒)
- READ_AVG
- 兩次連續讀取的平均時間(單位為秒)
- COMMAND
- 程序的名稱
PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND 2789 2903 sda1 854 0.000 120.000 39.836 0 0.000 0.000 0.000 plasma 2573 0 sda1 63 0.033 3600.015 515.226 0 0.000 0.000 0.000 auditd 2153 0 sda1 26 0.003 3600.029 1290.730 0 0.000 0.000 0.000 rsyslogd
WRITE_CNT
都大於 0
,表示在評量期間,它們都有寫入資料。其中 plasma 的數值特別高:它進行了大部分的寫入動作,當然寫入之間的平均時間也最低。如果您想找出最不省電的應用程式,自然 Plasma 就成為最值得觀察的對象。
strace -p 2789
strace
的運作模式為每 45 秒開啟 KDE 的圖示快取檔案,寫入資料後又馬上關閉檔案。這導致不必要的硬碟寫入,因為檔案的 meta 資訊(更準確的說,是修改時間)有所改變。最終的修正是為了避免這些不必要的呼叫,因為圖示沒有任何改變。
2.4. 電池壽命工具組
-a
選項,回報桌上型電腦的效能。
office
負載會寫入文字再加以校正,並將同樣程序用於試算表裡。若與 PowerTOP 或其它稽核或分析工具一起執行 BLTK,就可以測試機器啟用、而不是閒置時的最佳化是否有效果。使用者可以在不同的設定中,用同樣的負載來進行測試,進而比較不同設定所帶來的結果。
yum install bltk
bltk workload options
idle
(閒置)負載 120 秒:
bltk -I -T 120
-I
,--idle
- 系統處於閒置狀態,用來作為與其他負載比較的基準值
-R
,--reader
- 模擬讀取文件(預設上使用 Firefox)
-P
,--player
- 模擬從光碟機觀看多媒體檔案(預設上使用 mplayer)
-O
,--office
- 使用 OpenOffice.org 來模擬編輯文件
-a
,--ac-ignore
- 不管 AC 電源是否存在,都予以忽略(桌上型電腦必用)
-T number_of_seconds
,--time number_of_seconds
- 測試時間(單位為秒);請與
idle
負載合用此選項 -F filename
,--file filename
- 指定檔案用於特定的負載,例如不存取光碟機,而改播放別的檔案給
player
負載使用 -W application
,--prog application
- 指定應用程式,用於特定的負載上,例如不用 Firefox 而改用其它瀏覽器,測試
reader
負載。
bltk
的 man page。
/etc/bltk.conf
配置檔所指定的目錄,預設上是 ~/.bltk/workload.results.number/
。舉例來說,~/.bltk/reader.results.002/
目錄會儲存 reader
負載的第三次測試(第一次測試不會有編號)。所有結果會散見於多個檔案中。要把這些結果濃縮到單一、易讀的格式,請執行:
bltk_report path_to_results_directory
Report
的文字檔案。要在終端機模擬程式中顯示結果,請使用 -o
選項。
bltk_report -o path_to_results_directory
2.5. tuned 與 ktune
yum install tuned
/etc/tuned.conf
中設定一組範例配置檔,並啟動預設的 profile。
service tuned start
chkconfig tuned on
-d
,--daemon
- 以 daemon 方式啟動 tuned,而不是在前景執行。
-c
,--conffile
- 使用指定了路徑與檔案的配置檔,例如
--conffile=/etc/tuned2.conf
。預設值是/etc/tuned.conf
。 -D
,--debug
- 使用最高等級的日誌紀錄。
2.5.1. tuned.conf
檔案
tuned.conf
檔案包含了 tuned 所使用的配置設定。預設上,這檔案位於 /etc/tuned.conf
,但使用者可以指定不同的位置與名稱,方法是使用 --conffile
選項啟動 tuned.conf
。
[main]
一節,定義 tuned 的通用參數。這檔案的每個外掛程式都會有自己專用的一節。
[main]
一節包含了以下選項:
interval
- tuned 監控、微調系統的間隔,單位為秒。預設值為
10
。 verbose
- 是否提供詳盡的輸出結果。預設值為
False
(否)。 logging
- 指定寫入日誌的訊息之最低優先順序。以降冪排列,可用的值有
critical
、error
、warning
、info
、與debug
。預設值是info
。 logging_disable
- 指定寫入日誌的訊息之最高優先順序,低於這個優先順序的訊息都不會被紀錄。以降冪排列,可用的值有
critical
、error
、warning
、info
、與debug
。notset
會停用這個選項。
[CPUTuning]
。每個外掛程式都可以使用自己的選項,但以下會套用至所有外掛程式:
enabled
- 啟用外掛程式與否。預設值為
True
(是)。 verbose
- 訊息輸出是否詳盡與否。如果此外掛程式沒有設定,這個值會引用自
[main]
。 logging
- 指定寫入日誌的訊息之最低優先順序。如果此外掛程式沒有設定,這個值會引用自
[main]
。
[main] interval=10 pidfile=/var/run/tuned.pid logging=info logging_disable=notset # Disk monitoring section [DiskMonitor] enabled=True logging=debug # Disk tuning section [DiskTuning] enabled=True hdparm=False alpm=False logging=debug # Net monitoring section [NetMonitor] enabled=True logging=debug # Net tuning section [NetTuning] enabled=True logging=debug # CPU monitoring section [CPUMonitor] # Enabled or disable the plugin. Default is True. Any other value # disables it. enabled=True # CPU tuning section [CPUTuning] # Enabled or disable the plugin. Default is True. Any other value # disables it. enabled=True
2.5.2. Tuned-adm
tuned-adm
指令選擇、啟動;但您也可以自行建立、修改或刪除 profile。
tuned-adm list
tuned-adm active
tuned-adm profile profile_name
tuned-adm profile server-powersave
tuned-adm off
default
」(預設的)profile 會被啟動。Red Hat Enterprise Linux 6 也包括以下事先定義好的 profile:
- default
- 預設的節能設定檔。在所有可用設定檔中,這對節省能源有著最低的衝擊,它只啟用 tuned 的 CPU 與磁碟外掛程式。
- desktop-powersave
- 可以直接用於桌上型電腦的節能設定檔。它會為 SATA 主機控制卡啟用 ALPM 省電模式(詳情請參閱 節 3.8, “積極性連結電源管理”),以及 tuned 的 CPU、乙太網路與磁碟外掛程式。
- server-powersave
- 可直接用於伺服器系統的節能設定檔。它會為 SATA 主機控制卡啟用 ALPM 省電模式、透過 HAL 停用光碟機的輪詢功能(詳情請參閱 hal-disable-polling 的 man page),並啟用 tuned 的 CPU 與磁碟外掛程式。
- laptop-ac-powersave
- 這是個中度衝擊的節能設定檔,可直接用於接上電源的筆記型電腦。它會為 SATA 主機控制卡啟用 ALPM 省電模式、WiFi 省電模式,以及 tuned 的 CPU、乙太網路與磁碟外掛程式。
- laptop-battery-powersave
- 這是個高度衝擊的節能設定檔,可直接用於使用電池的筆記型電腦。它會啟用之前使用的所有省電機制,再加上給低喚醒系統的多核心省電排程程式,並確定
ondemand
調速程式是啟用的,而 AC97 音效省電功能同時也是啟用的。您可以在任何系統上使用此設定檔,以節省最多的電力;這並不限於以電池運作的筆記型電腦。但使用此設定檔會對效能造成顯著的衝擊,尤其是磁碟與網路的延遲時間會變長。 - spindown-disk
- 這是個強大的節能設定檔,用於使用傳統硬碟的機器。它增加磁碟寫入的值,降低磁碟的 swap ,並停用同步日誌功能。所有分割區都會以
noatime
選項重新掛載。所有 tuned 嵌入程式都會被停用。 - throughput-performance
- 供伺服器使用的設定檔,可微調 I/O 的效能。它會停用 tuned 與 ktune 的省電機制,啟用 sysctl 設定,改進硬碟與網路 I/O 的吞吐效能,並切換到 deadline scheduler。
- latency-performance
- 這是個伺服器設定檔,用於典型的延遲效能微調。這個設定檔會停用動態式的微調機制與透明的巨型頁面。它使用
performance
調速程式來透過cpuspeed
進行 p-state,並將 I/O 排程器設為deadline
。此外,在 Red Hat Enterprise Linux 6.5 和更新版本中,此設定檔會請求值為1
的cpu_dma_latency
參數。在 Red Hat Enterprise Linux 6.4 和更舊版本中,cpu_dma_latency
則會請求0
這個值。 - enterprise-storage
- 用來為企業級伺服器配置改善整體效能的伺服器設定檔。這會切換至 deadline scheduler,並停用一些 I/O 限制,大幅增進吞吐量。
- virtual-guest
- 這個設定檔已針對虛擬機器進行優化。它基於企業儲存設定檔,不過卻也降低了虛擬記憶體的 swap。此設定檔能使用於 Red Hat Enterprise Linux 6.3 和更新版本中。
- virtual-host
- 基於 enterprise-storage 設定檔,virtual-host 會降低虛擬記憶體的 swap 並且更加積極地回寫中途分頁(dirty page)。非 root 和非 boot 的檔案系統將以
barrier=0
掛載。此外,由 Red Hat Enterprise Linux 6.5 起,kernel.sched_migration_cost
參數將會被設為 5 毫秒。在 Red Hat Enterprise Linux 6.5 以前,kernel.sched_migration_cost
使用了 0.5 毫秒作為預設值。 - sap
- 一個為 SAP 軟體效能優化的設定檔。它基於 enterprise-storage 設定檔。Sap 設定檔會額外微調有關於共享記憶體與信號的 sysctl 設定,以及一項程序能擁有的最大記憶體映射數量。
/etc/tune-profiles
的子目錄下。所以 /etc/tune-profiles/desktop-powersave
包含了本 profile 所需的檔案與設定。每個檔案都包含最多四個檔案:
tuned.conf
- 這個 profile 所使用的 tuned 服務配置
sysctl.ktune
- ktune 所使用的 sysctl。它的格式與
/etc/sysconfig/sysctl
檔案無異(詳情請參閱 sysctl 與 sysctl.conf 的 man page)。 ktune.sysconfig
- ktune 自己的配置檔,通常是
/etc/sysconfig/ktune
。 ktune.sh
- ktune 服務所使用、類似 init 的 shell script,可以在開機階段執行特定的指令,以微調系統。
laptop-battery-powersave
profile 已經包含了非常豐富的微調選項,是很好的起點。您只要複製整個目錄,並賦予新名稱即可,如下:
cp -a /etc/tune-profiles/laptop-battery-powersave/ /etc/tune-profiles/myprofile
# Disable HAL polling of CDROMS # for i in /dev/scd*; do hal-disable-polling --device $i; done > /dev/null 2>&1
2.6. DeviceKit-power 與 devkit-power
devkit-power
命令與以下選項,來存取命令列工具:
--enumerate
,-e
- 顯示系統上每個電力來源的物件路徑,例如:
/org/freedesktop/DeviceKit/power/devices/line_power_AC
/org/freedesktop/UPower/DeviceKit/power/battery_BAT0
--dump
,-d
- 顯示系統上所有電力裝置的參數。
--wakeups
,-w
- 顯示系統的 CPU 喚醒次數。
--monitor
,-m
- 監控系統上電力裝置的改變,例如連上或移除 AC 電源,或電池的電力耗盡。請按下 Ctrl+C,停止監控系統。
--monitor-detail
- 監控系統上電力裝置的改變,例如連上或移除 AC 電源,或電池的電力耗盡。
--monitor-detail
選項所顯示的內容會比--monitor
選項更為詳盡。請按下 Ctrl+C,停止監控系統。 --show-info object_path
,-i object_path
- 顯示特定物件路徑的所有資訊。舉例來說,要取得系統上特定電池(
/org/freedesktop/UPower/DeviceKit/power/battery_BAT0
)的資訊,請執行:devkit-power -i /org/freedesktop/UPower/DeviceKit/power/battery_BAT0
2.7. GNOME 電源管理程式
- 使用 AC 電源
- 一般
- 使用電池電源
2.8. 其它稽核方式
- vmstat
- vmstat 提供了程序、記憶體、分頁、區塊 I/O、trap、以及 CPU 的詳細資訊。請使用這工具來更進一步檢視系統的整體表現,看看哪些部份處於忙碌狀態。
- iostat
- iostat 跟 vmstat 非常類似,但用於磁區裝置的 I/O。它也提供了非常詳盡的輸出與統計資料。
- blktrace
- blktrace 提供了非常詳盡的區塊 I/O 追蹤資料。它會把資訊依照應用程式,切成獨立區塊。這與 diskdevstat 合用時非常有用。
章 3. 核心架構與機制
重要
cpupower
指令,請確定您已經安裝 cpupowerutils 套件。
3.1. CPU 的閒置狀態
- C0
- 運作中或執行中。在此狀態下,CPU 處於工作狀態,完全不閒置。
- C1, Halt
- 這狀態表示處理器並不處於執行狀態,但通常也不處於低耗電狀態。CPU 能在完全不延遲的情形下,繼續進行處理。所有提供 C-State 的處理器都必須支援此狀態。Pentium 4 處理器支援更精進的 C1 狀態,稱之為 C1E,是處於低耗電狀態的。
- C2, Stop-Clock
- 這狀態表示此處理器的時脈是停止的,但它仍然為其註冊碼與快取保持完整的狀態,因此在時脈重新開始時,就可以立即開始處理、運算。這是選用的狀態。
- C3, Sleep
- 這表示處理器的確進入睡眠狀態,而且不會保留最新的快取版本。有鑑於此,從這狀態喚醒處理器,會比 C2 狀態要來得長。同樣的,這是選用的狀態。
cpupower idle-info
3.2. 使用 CPUfreq
調速程式
3.2.1. CPUfreq 調速程式的類型
這個 Performance(效能)調速程式會強迫 CPU 使用最高的時脈頻率運作。這個頻率會以靜態方式設定,而且不會改變。因此,這個特定的調速程式「不會提供任何省電功能」。這只適用於高工作負載時段,在這期間 CPU 鮮有(或從沒有)閒置的時候。
相反地,Powersave(省電)調速程式會強迫 CPU 使用最低的時脈頻率運作。這頻率會以靜態方式設定,而且不會改變。因此,這個調速程式會以最節省電力的方式運作,但會導致「最低的 CPU 效能」。
Ondemand(視需要)調速程式能在系統負載高的時候,使用 CPU 的最高時脈運行;並在系統閒置時,使用最低的時脈頻率。這讓系統根據系統負載,動態調整電力消耗;但代價是「切換時脈時會導致延遲」。因此,如果負載的變動太過頻繁,Ondemand 調速程式會因為切換時脈的次數過多,而降低 Performace 或 Powersave 所帶來的好處。
Userspace 調速程式能讓 userspace(使用者空間)的程式(或任何以 root 身份執行的程序)來設定頻率。此調速程式通常會與 cpuspeed
daemon 一起使用。在所有調速程式中,Userspace 是最高度客製化的;而且根據配置方式,它可以提供效能與電力消耗的最佳平衡。
跟 Ondemand 調速程式類似,Conservative(保守)調速程式也可以根據使用量調整時脈頻率。然而,Ondemand 會以更積極的方式來進行(最高頻率或最低頻率二選一);而 Conservation 調速程式會以漸進方式調整頻率。
注意
cron
job 來啟動調速程式。這能讓您在每日的特定時間,自動設定不同的調速程式。因此,您可以在閒置時段(例如下班後)使用低頻率的調速程式,並在高負載時調回高頻率的調速程式。
3.2.2. 設定 CPUfreq
過程 3.1. 如何新增 CPUfreq 驅動程式
- 請使用以下指令來檢視系統上有哪些可用的 CPUfreq:
ls /lib/modules/[kernel version]/kernel/arch/[architecture]/kernel/cpu/cpufreq/
- 使用
modprobe
來新增正確的 CPUfreq 驅動程式。modprobe [CPUfreq driver]
使用以上指令時,請記得移除.ko
延伸檔名。
cpupower frequency-info --governors
modprobe
來新增所需的 kernel 模組,以啟用您想要使用的特定 CPUfreq 調速程式。這些 kernel 模組可以在 /lib/modules/[kernel version]/kernel/drivers/cpufreq/
中找到。
3.2.3. 微調 CPUfreq 政策與速度
cpupower frequency-info
指令檢視 CPU 速度與政策資訊,並進一步透過 cpupower frequency-set
選項微調每個 CPU 的速度。
cpupower frequency-info
指令有以下選項:
--freq
— 根據 CPUfreq 和新的速度,顯示目前的 CPU 速度,單位為 KHz。--hwfreq
— 根據硬體,顯示 CPU 目前的時脈,單位為 KHz(僅有 root 可使用)。--driver
— 顯示設定此 CPU 的 CPUfreq 驅動程式為何。--governors
— 顯示 kernel 裡可用的 CPUfreq 調速程式。如果您想要使用沒有列在這個檔案中的 CPUfreq 調速程式,請參閱 節 3.2.2, “設定 CPUfreq” 裡的 過程 3.2, “啟用 CPUfreq 調速程式” 操作指引。--affected-cpus
— 列出需要頻率協調程式之 CPU。--policy
— 顯示目前 CPUfreq 政策的範圍,單位為 KHz,以及目前使用的調速程式。--hwlimits
— 列出 CPU 的可用頻率,單位為 KHz。
cpupower frequency-set
指令有以下選項:
注意
/sys/devices/system/cpu/[cpuid]/cpufreq/
中的可調整參數中找到。設定與數值可以透過撰寫這些可調整參數而改變。舉例來說,要設定 cpu0 的最低時脈為 360 KHz,請執行:
echo 360000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
3.3. CPU 監控
cpupower-monitor
man page。
cpupower monitor
指令的以下選項:
-l
— 列出系統上的所有監控。-m <monitor1>, <monitor2>
— 顯示特定監控。識別子可透過執行-l
找到。command
— 顯示閒置的統計數據,以及特定指令的處理器需求。
3.4. CPU 的省電政策
cpupower set
指令的以下選項:
- --perf-bias <0-15>
- 允許受支援的 Intel 處理器上的軟體更主動地回應,以決定最佳效能與省電之間的平衡。這並不會覆寫其它省電政策。可指定的值從 0 到 15,0 是最佳效能,而 15 是最省電。預設上,這選項可套用到所有處理器核心上。要僅僅套用至一個核心上, 請新增
--cpu <cpulist>
選項。 - --sched-mc <0|1|2>
- 在其它 CPU 套件使用電力前,限制單一 CPU 套件中系統處理器對處理器核心所使用的電力。0 表示沒有限制;1 表示一開始只使用單一 CPU 套件;而 2 在處理任務喚醒時,會額外著重於半閒置的 CPU 套件。
- --sched-smt <0|1|2>
- 限制系統程序在其它核心上使用電力前,對一個處理器核心之同類型執行續所使用的電力。0 表示沒有限制;1 表示一開始只使用單一 CPU 套件;而 2 在處理任務喚醒時,會額外著重於半閒置的 CPU 套件。
3.5. suspend(暫停)與 resume(重新開始)
3.6. 無計時 kernel
3.7. 主動狀態電源管理
- 預設值
- 根據系統韌體(例如 BIOS)來設定 PCIe 連線的電源狀態。這是 ASPM 的預設狀態。
- powersave(省電模式)
- 設定 ASPM 盡可能的節省電源,不理會效能因素。
- performance(效能)
- 停用 ASPM 讓 PCIe 連線能以最高效能運作。
pcie_aspm
kernel 參數來啟用或停用,其中 pcie_aspm=off
會關閉 ASPM,而 pcie_aspm=force
會啟動 ASPM,即使裝置不支援 ASPM 亦然。
/sys/module/pcie_aspm/parameters/policy
,但可以在開機時以 pcie_aspm
kernel 參數來設定,舉例來說,其中 pcie_aspm.policy=performance
會設定 ASPM 的效能政策。
警告
pcie_aspm=force
,不支援 ASPM 的硬體可能會導致系統停止回應。在設定 pcie_aspm=force
之前,請確定系統上所有的 PCIe 硬體都支援 ASPM。
3.8. 積極性連結電源管理
這個模式會在磁碟沒有 I/O 的情形下,以次低電源狀態(PARTIAL)連線。這個模式適用於間歇性的電源狀態(例如一段時間有大量 I/O,然後是一段閒置時間),對效能的影響較小。
medium_power
模式能讓連線根據負載,在 PARTIAL 與完全供電(ACTIVE)狀態下游移。請注意,連線無法在 PARTIAL 與 SLUMBER 之間直接游移;電源狀態必須先切換到 ACTIVE,再游移至另一種狀態。
/sys/class/scsi_host/host*/link_power_management_policy
是否存在。要改變設定,請把本節所描述的值寫入這些檔案;或請打開這些檔案,檢查這些數值。
3.9. Relatime 磁碟存取最佳化
atime
,而維護這資料需要不斷地寫入硬碟。這會讓儲存裝置一直處於忙碌與開機狀態。因為一些應用程式會使用 atime
資料,所以儲存裝置會浪費電力。更有甚者,即使檔案不是從存儲裝置直接讀取,而是從快取記憶體中讀取,一樣會有寫入的動作。在有些時候,Linux kernel 支援 mount 的 noatime
選項,使用這選項掛載的檔案系統就不會寫入 aime
資料。然而,僅關掉這項功能還是會有問題,因為有些應用程式仰賴 atime
的資料,如果找不到這資料,就會失敗。
relatime
。Relatime
會維護 atime
資料,但不會在每次檔案被存取時運作。啟用了這選項之後,atime
資料只有在 atime
資料上一次被修改(mtime
)之後有所更動時,或在檔案被存取之後又過了一定時間(預設值為一天)時,檔案才會被寫入。
relatime
的方式掛載。您可以使用 norelatime
選項掛載任何檔案系統,而不啟用此方式。
3.10. 用電控制
動態用電控制(Dynamic Power Capping)可以在幾款 ProLiant 與 BladeSystem 伺服器上找到,它能讓系統管理者設定一或多台伺服器的電力使用上限。不管伺服器的負載為何,其電力消耗量都不會超過這個上限。在到達電力消耗上限之前,這機制不會有任何動作。一旦到了上限,管理處理器會調整 CPU 的 P-state,並限制其時脈,以降低電源消耗量。
/dev/hpilo/dXccbN
的管理處理器。kernel 也包括 hwmon
sysfs
延伸介面,以支援動態用電控制功能,外加 ACPI 4.0 電力計所使用的 hwmon
驅動程式,用於 sysfs
介面。有了這些功能,作業系統與使用者空間的工具可以讀取用電控制的配置值,以及系統目前的用電量。
Intel 的 Node Manager 在系統上加了用電控制功能,使用的是處理器的 P-state 與 T-state 來限制 CPU 的效能,進而達成節省電力的目的。設定電源管理政策後,系統管理者可以配置系統,使其在低負載時(例如夜間或週末)消耗更少電力。
3.11. 加強的圖形電源管理
LVDS(低電壓差動訊號傳輸,Low Voltage Differential Signaling)是一種在銅線上傳送電子訊號的系統。這系統著名的應用之一,是傳送像素資訊到筆記型電腦的 LCD(liquid crystal display,液晶螢幕)上。所有顯示器都有「更新頻率」(refresh rate):從顯示卡收到訊號,並在螢幕上重新繪製的速率。一般來說,螢幕每秒鐘會收到 60 次更新資料(也就是 60 Hz)。當螢幕與顯示卡以 LVDS 連接時,LVDS 系統會在每一個更新週期消耗電力。閒置時,許多 LCD 螢幕的更新頻率會降低到 30 Hz,但不會有任何顯著的影響(與 CRT (cathode ray tube) 陰極射線管螢幕不同,降低更新頻率會導致螢幕上的字元閃爍)。內建於 Red Hat Enterprise Linux 6 的 Intel 顯示晶片驅動程式會在螢幕閒置時自動降低時脈(downclocking),節省約 0.5 W 的電力。
SDRAM(Synchronous dynamic random access memory,同步動態存取記憶體)用作顯示卡的記憶體,每秒會充電成千上萬次,好讓每個記憶體單元能保存資料。記憶體控制晶片除了管理資料流進流出記憶體以外,還負責啟動這些更新週期。然而 SDRAM 也有低電壓的自我更新(self-refresh)模式。在這模式中,記憶體會使用內部時脈來產生自己的更新週期,這讓系統可以在不損及記憶體現有資料的情形下,關閉記憶體控制晶片。Red Hat Enterprise Linux 6 的 kernel 會在 Intel 顯示晶片閒置時,啟動記憶體自我更新功能,這樣可以節省約 0.8 W。
通常 GPU(圖形處理器,Graphical Processing Unit)包含了內部時脈,管理 GPU 的多種內部線路。Red Hat Enterprise Linux 6 的 kernel 可以降低一些 Intel 與 ATI 的 GPU 之頻率。在一定時間內降低 GPU 元件的週期數,可以節省電力。kernel 會在 GPU 閒置時,自動降低時脈速度,並在 GPU 活動增加時調昇速度。降低 GPU 時脈週期可以節省多至 5 W 的電力。
Red Hat Enterprise Linux 6 的 Intel 與 ATI 圖形驅動程式可以偵測電腦是否連接了螢幕;若否,則完全關閉 GPU。這功能對於伺服器尤其好用,因為通常伺服器沒有螢幕。
3.12. RFKill
/dev/rfkill
,其中包含了系統無線電傳輸的現有狀態。每個裝置都有其現有的 RFKill 狀態,註冊於 sysfs
裡。除此之外,RFKill 會對能使用 RFKill 的裝置之每個狀態的改變,發出 uevents。
rfkill list
指令,以取得裝置清單;每個裝置都有 index number(索引編號),從 0
開始。使用者可以使用這個 index number 來告知 rfkill 停用或啟用某一項裝置。
rfkill block 0
rfkill block wifi
rfkill block all
rfkill unblock
而不是 rfkill block
。要取得 rfkill 可以停用的裝置類別之完整清單,請執行 rfkill help
3.13. 使用者空間的最佳化
Red Hat Enterprise Linux 6 使用了「無計時 kernel」(Tickless Kernel,詳情請參閱 節 3.6, “無計時 kernel”),能讓 CPU 處於深層的閒置狀態。然而,timer tick(計時器的計時功能)並不是喚醒 CPU 的唯一理由,應用程式的函數呼叫也可能會讓 CPU 無法進入(或保持)閒置狀態。我們降低了超過 50 個應用程式的不必要函數呼叫。
對於儲存裝置與網路介面的 I/O(輸入與輸出,Input/Output)會迫使裝置消耗電力。有些儲存裝置與網路裝置可以在閒置時降低電力狀態(例如 ALPM 或 ASPM),但 I/O 會讓裝置無法進入(或保持)閒置狀態,或讓非使用中的硬碟仍然轉個不停。之前幾個應用程式會對儲存裝置發出過量、或沒有必要的需求,這些需求已經被降至最少,尤其以讓硬碟轉個不停的應用程式為最。
不管需不需要都會啟動的服務,很有可能會浪費系統資源。請盡可能地把服務的預設值設為「off」(關閉)或「on demand」(視需求啟動)。舉例來說,之前不管系統有沒有藍牙硬體,BlueZ 服務都會在開機時,自動啟動藍牙功能。現在 BlueZ initscript 會在啟動藍牙服務前,先檢查藍牙硬體是否存在。
章 4. 使用的範例
4.1. 範例 — 伺服器
網站伺服器仰賴網路與磁碟 I/O。只依靠 100 Mbit/s 的網路速度應該就足夠了。如果這台伺服器提供的多半是靜態網頁,那麼 CPU 效能就不甚重要。因此電源管理的選項就包括了:
- tuned 不使用磁碟或網路外掛程式。
- 開啟 ALPM。
- 開啟
ondemand
調速程式。 - 把網路卡的速度上限設為 100 Mbit/s。
運算伺服器非常需要 CPU 的運算能力。節能的選項包括:
- 根據工作內容與資料儲存的地方而定,使用 tuned 的磁碟或網路外掛程式;或在批次處理的系統上,完全開啟 tuned。
- 根據使用率,使用
performance
調速程式。
郵件伺服器需要磁碟 I/O 與 CPU 的運算能力。電源管理的選項包括:
- 開啟
ondemand
調速程式,因為 CPU 運算能力差上幾個百分點無關宏旨。 - tuned 不使用磁碟或網路外掛程式。
- 因為郵件多半是由內部網路的電腦所存取,可以獲益於 1 Gbit/s 或 10 Gbit/s 的網路連線,所以網路速度不應該設限。
檔案伺服器跟郵件伺服器的需求類似,但依據所使用的通訊協定,可能更需要 CPU 效能。通常 Samba 伺服器會比 NFS 更需要 CPU 資源;而 NFS 又大於 iSCSI。但即使如此,您還是應該使用 ondemand
調速程式。
通常目錄伺服器對磁碟 I/O 的需求較低,尤其是記憶體足夠時。網路延遲時間的因素會高於 I/O。您不妨使用較低的網路速度,但延遲時間較低的網路;請針對您自己的網路實際測試過,以達最高效能。
4.2. 範例 — 筆記型電腦
- 在系統 BIOS 裡,停用所有不使用的硬體。舉例來說,平行連接埠或序列埠、讀卡機、攝影機、WiFi 無線網路、藍牙等等。
- 在較暗的環境裡使用筆電時,螢幕不需要非常亮也可以閱讀無礙,所以不妨把螢幕的亮度設暗一點。您可以在 GNOME 桌面環境下,透過 系統+偏好設定 → 電源管理程式,或 KDE 桌面的 Kickoff Application Launcher+電腦+系統設定+進階 → 電源管理,抑或使用命令列執行 gnome-power-manager 或 xbacklight,又或是筆記型電腦的功能鍵來達到此一效果。
- 使用 tuned-adm 應用程式的
laptop-battery-powersave
來啟用全套的節能機制。請注意硬碟與網路卡的效能與延遲時間,有決定性的影響。
- 使用
ondemand
調速程式(預設上,Red Hat Enterprise Linux 6 會啟用這個功能) - 啟用筆電模式(
laptop-battery-powersave
的一部分):echo 5 > /proc/sys/vm/laptop_mode
- 增加磁碟的 flush 時間(
laptop-battery-powersave
的一部分):echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
- 停用 nmi watchdog(
laptop-battery-powersave
的一部分):echo 0 > /proc/sys/kernel/nmi_watchdog
- 啟用 AC97 音效的節能模式(預設上,Red Hat Enterprise Linux 6 會啟用這個功能):
echo Y > /sys/module/snd_ac97_codec/parameters/power_save
- 啟用多核心的節能功能(
laptop-battery-powersave
的一部份):echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
- 啟用 USB 的自動暫停功能:
for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done
請注意:不是所有的 USB 裝置都支援此功能。 - 啟用 ALPM 的最低耗電設定(
laptop-battery-powersave
的一部分):echo min_power > /sys/class/scsi_host/host*/link_power_management_policy
- 使用 relatime 參數來掛載檔案系統(預設上 Red Hat Enterprise Linux 6 會啟用此功能):
mount -o remount,relatime mountpoint
- 啟用硬碟的最佳節能模式(
laptop-battery-powersave
的一部分)hdparm -B 1 -S 200 /dev/sd*
- 停用光碟機的輪詢功能(
laptop-battery-powersave
的一部分):hal-disable-polling --device /dev/scd*
- 把螢幕亮度降至
50
以下,例如:xbacklight -set 50
- 啟用螢幕閒置時的 DPMS 功能:
xset +dpms; xset dpms 0 0 300
- 降低 Wi-Fi 的電力(
laptop-battery-powersave
的一部分):for i in /sys/bus/pci/devices/*/power_level ; do echo 5 > $i ; done
- 停用 Wi-Fi:
echo 1 > /sys/bus/pci/devices/*/rf_kill
- 把有線網路的速度設為 100 Mbit/s(
laptop-battery-powersave
的一部分):ethtool -s eth0 advertise 0x0F
附錄 A. 給程式設計師的提示
- 使用執行續。
- 不必要或沒效率地喚醒 CPU。如果真的必要喚醒 CPU,請一次(從 race 到 idle)、儘快完成。
- 不必要地使用
[f]sync()
函數。 - 不必要地啟用輪詢(polling)功能,或使用短暫、一定頻率的 timeout。(請只對事件做出回應。)
- 沒效率地使用喚醒功能。
- 沒效率地存取磁碟。請使用較大的緩衝區空間,以避免過度頻繁存取硬碟。一次寫入大空間的磁區。
- 沒效率地使用計時器。可能的話,請跨應用程式(甚至跨系統)使用計時器。
- 過度頻繁的 I/O、消耗電力、或使用記憶體(包括記憶體逸漏)
- 進行不必要的運算。
A.1. 使用執行續
Python 使用了 Global Lock Interpreter[1],因此只有在大規模的 I/O 運作時,執行續才有其效用。Python 的 Unladen-swallow [2] 較快,更適用於程式碼最佳化。
Perl 的執行續一開始是給沒有 fork 功能的系統(例如 32 位元的 Windows 作業系統)之應用程式使用的。在 Perl 執行續裡,資料會複製給每個執行續(Copy On Write)。預設上,資料不會共享,因為使用者應該可以定義資料共享的等級。為了資料共享,threads::shared 模組已經包括在 Perl 裡面。然而,資料不但會被複製(Copy On Write),這模組還會為資料建立相關的變數,耗費更多時間,變得更慢。[3]
C 的執行續會共享同樣的記憶體,每個執行續都有自己的堆疊,kernel 不需要建立新的檔案描述或分配新的記憶體空間。C 可以善用多 CPU,執行多執行續。因此,要讓執行續的效能最大化,請使用較低階的語言,如 C 或 C++。如果您使用的是描述式語言,請考慮使用與 C 相關的語言。並使用剖析程式來找出程式中效能不彰的地方。[4]
A.2. 喚醒功能
int fd; fd = inotify_init(); int wd; /* checking modification of a file - writing into */ wd = inotify_add_watch(fd, "./myConfig", IN_MODIFY); if (wd < 0) { inotify_cant_be_used(); switching_back_to_previous_checking(); } ... fd_set rdfs; struct timeval tv; int retval; FD_ZERO(&rdfs); FD_SET(0, &rdfs); tv.tv_sec = 5; value = select(1, &rdfs, NULL, NULL, &tv); if (value == -1) perror(select); else { do_some_stuff(); } ...
/proc/sys/fs/inotify/max_user_watches
得知;雖然這個值可以改變,但不建議您這樣作。同時,如果 inotify 失效的話,程式碼就會回到不同檢查方式,這多半意味著原始碼的 #if #define
會常常發生。
A.3. Fsync
Fsync
是 I/O 密集的運作,但這並不完全正確。
fsync
,同時因為檔案系統的設定(主要是 ext3 與資料的排序模式),在什麼都沒發生時,會產生很長的延遲時間。如果同時間有另一個程序正在複製大檔案時,這延遲時間會多達 30 秒。
fsync
的情形下,轉換到 ext4 檔案系統上問題就會接踵而來。Ext3 的設定是資料順序模式,每幾秒鐘就會清空記憶體,寫入磁碟去。但在 ext4 與 laptop_mode(筆電模式)下,儲存的間隔較長,系統無預期關機時,資料就會流失。雖然現在 ext4 已經更新,但撰寫應用程式時,還是要注意,並適當地使用 fsync
。
/* open and read configuration file e.g. ./myconfig */ fd = open("./myconfig", O_RDONLY); read(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd); ... fd = open("./myconfig", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR); write(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd);
/* open and read configuration file e.g. ./myconfig */ fd = open("./myconfig", O_RDONLY); read(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd); ... fd = open("./myconfig.suffix", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR write(fd, myconfig_buf, sizeof(myconfig_buf)); fsync(fd); /* paranoia - optional */ ... close(fd); rename("./myconfig", "./myconfig~"); /* paranoia - optional */ rename("./myconfig.suffix", "./myconfig");
附錄 B. 修訂記錄
修訂記錄 | ||||||
---|---|---|---|---|---|---|
修訂 1.0-35.2 | Mon Apr 20 2015 | Terry Chuang | ||||
| ||||||
修訂 1.0-35.1 | Mon Apr 20 2015 | Terry Chuang | ||||
| ||||||
修訂 1.0-35 | Fri Oct 10 2014 | Yoana Ruseva | ||||
| ||||||
修訂 1.0-34 | Fri Aug 8 2014 | Yoana Ruseva | ||||
| ||||||
修訂 1.0-33 | Wed Sep 25 2013 | Yoana Ruseva | ||||
| ||||||
修訂 1.0-25 | Tue Feb 19 2013 | Jack Reed | ||||
| ||||||
修訂 1.0-22 | Mon Feb 18 2013 | Jack Reed | ||||
| ||||||
修訂 1.0-21 | Wed Nov 7 2012 | Jack Reed | ||||
| ||||||
修訂 1.0-20 | Wed Oct 31 2012 | Jack Reed | ||||
| ||||||
修訂 1.0-19 | Wed Oct 31 2012 | Jack Reed | ||||
| ||||||
修訂 1.0-18 | Tue Oct 30 2012 | Jack Reed | ||||
| ||||||
修訂 1.0-15 | Thu Oct 18 2012 | Jack Reed | ||||
| ||||||
修訂 1.0-14 | Fri Feb 10 2012 | Jack Reed | ||||
| ||||||
修訂 1.0-12 | Fri Dec 16 2011 | Jack Reed | ||||
| ||||||
修訂 1.0-11 | Thu Dec 15 2011 | Jack Reed | ||||
| ||||||
修訂 1.0-10 | Thu Dec 15 2011 | Jack Reed | ||||
| ||||||
修訂 1.0-9 | Wed Dec 14 2011 | Jack Reed | ||||
| ||||||
修訂 1.0-8 | Mon Dec 12 2011 | Jack Reed | ||||
| ||||||
修訂 1.0-7 | Thu Sep 29 2011 | Jack Reed | ||||
| ||||||
修訂 1.0-6 | Tue May 24 2011 | Rüdiger Landmann | ||||
| ||||||
修訂 1.0-2 | Fri Oct 22 2010 | Rüdiger Landmann | ||||
| ||||||
修訂 1.0-1 | Thu Oct 7 2010 | Rüdiger Landmann | ||||
| ||||||
修訂 1.0-0 | Thu Oct 7 2010 | Rüdiger Landmann | ||||
|