章 18. 電源管理

目錄

18.1. 省電功能
18.2. 進階組態與電源介面 (ACPI)
18.3. 硬碟的休眠
18.4. 疑難排解
18.5. 如需更多資訊

電源管理對筆記型電腦十分重要,對其他系統也很有用。ACPI (Advanced Configuration and Power Interface,進階組態和電源介面) 可以在所有現代電腦 (筆記型電腦、桌上型電腦和伺服器) 上使用。電源管理技術需要配備合適的硬體與 BIOS 常式。大多數筆記型電腦和許多新式的桌上型電腦及伺服器都符合這些需求。此技術還可以控制 CPU 頻率比例,這有助於省電及降低噪音。

18.1. 省電功能

省電功能不僅對於筆記型電腦的行動用途很重要,對於桌上型系統也很重要。主要功能以及在 ACPI 中的用途包括:

待命

不支援。

暫停 (記憶體)

此模式會將整個系統狀態寫入 RAM 中。接著,除了 RAM 以外,整個系統都會進入睡眠狀態。在此狀態中,電腦所使用的電源極少。此狀態的好處是可以在幾秒內將工作復原到暫停之前的狀態,而不用開機或重新啟動應用程式。此功能等同於 ACPI 狀態 S3。對此狀態的支援仍在開發中,因此支援程度多半因硬體而異。

睡眠 (暫停磁碟)

在此操作模式,會將整個系統狀態寫入硬碟,然後關閉系統。至少要有與 RAM 一樣大的交換分割區,才能寫入所有作用中資料。要從此狀況重新啟用需耗時 30 到 90 秒。還原時會回到暫停前的狀態。有些製造商會為此模式提供有用的混合功能,例如 IBM Thinkpad 中的 RediSafe。對應的 ACPI 狀態為 S4。在 Linux 中,暫停寫入到磁碟是由獨立於 ACPI 之外的核心常式來執行。

電池監視器

ACPI 會檢查電池充電狀態並提供相關資訊。此外,ACPI 會在電力到達某個關鍵狀態時,協調要執行的動作。

自動關閉電源

關機後,電腦會關閉電源。此功能很重要,尤其是在電池用盡前所執行的自動關機。

處理器速度控制

與 CPU 連結時有三種方式可節省電源:頻率和電壓比例 (也稱為 PowerNow!Speedstep)、調節,以及讓處理器進入睡眠狀態 (C 狀態)。依據電腦的操作模式,也可以合併這些操作方法。

18.2. 進階組態與電源介面 (ACPI)

ACPI 主要用於讓作業系統設定和控制個別的硬體元件。ACPI 取代了「電源管理隨插即用 (PnP)」與「進階電源管理 (APM)」。它能提供一些資訊,包括電池、交流電轉接器、溫度、風扇以及關閉蓋子或電池電力不足等系統事件。

BIOS 會提供一些表格,內含關於個別元件與硬體的存取方法等資訊。作業系統會使用這此資訊來執行任務,像是指定中斷或啟用和停用元件。因為作業系統會執行儲存於 BIOS 中的指令,所以 BIOS 實行會決定其功能。ACPI 能偵測和載入的表格在 /var/log/boot.msg 中可以找到。請參閱第 18.2.3 節「疑難排解」,以取得更多有關 ACPI 問題疑難排解的資訊。

18.2.1. 控制 CPU 效能

CPU 可以使用三種方式省電:

依據電腦的操作模式的不同,這些方法可合併使用。省電也表示能降低系統溫度,減低風扇的使用頻率。

頻率比例及調節只在處理器忙碌時使用,因為在處理器閒置時,必定會套用最經濟的 C 狀態。如果 CPU 正忙碌,頻率比例是建議的省電方法。通常處理器僅有部份的工作負載。在此情況中,可以使用較低的頻率。通常,最佳方法是使用依核心需求調節器來控制動態頻率比例。

調節應做最後手段使用,例如,在高度系統負載下仍要延伸電池操作時間時。不過在調節過多時,有些系統無法運作順暢。此外,當 CPU 要做的事不多時,調節 CPU 是無意義的動作。

18.2.1.1. 頻率和電壓比例

PowerNow!Speedstep 是 AMD 與 Intel 分別針對此技術所使用的實作。不過,此技術也套用於其他製造商的處理器中。CPU 的時脈頻率及其核心電壓會同時降低,產生高於線性的省電效能。也就是當頻率減半 (效能減半),使用的電量卻能遠低於原本的一半。此技術與 ACPI 無關。

執行 CPU 頻率比例的主要方式有兩種︰利用核心本身 (具有內核調節器的 CPUfreq 基礎架構) 或利用使用者空間應用程式。內核調節器屬於規則調節器,可以根據不同的準則變更 CPU 頻率 (一種預先設定的 CPU 電源配置)。下列調節器可用於 CPUfreq 子系統:

效能調節器

CPU 頻率固定設為可能的最大值,以取得最佳效能。因此,省電不是此調節器的重點。

省電調節器

CPU 頻率固定設為可能的最小值。這可能會嚴重影響效能,因為不論處理器多忙碌,系統速度也永遠不會超過此頻率。

依需求調節器

動態 CPU 頻率規則的核心實作:該調節器會監控處理器使用率。一旦處理器使用率超過特定的限定值,調節器就會將頻率設定為可用的最高值。如果使用率低於該限定值,則會使用次低的頻率。如果系統持續處於使用率過低狀態,頻率會接著降低,直到設定為可用的最低頻率為止。

保守調節器

與依需求實作相似,此調節器也可以根據處理器使用率動態地調節頻率,只不過可以設定更精細的增長幅度。如果處理器使用率超過特定的限定值,調節器不會立即切換到可用的最高頻率 (依需求調節器會這樣做),而是調節到可用的次高頻率。

核心調節器的相關檔案位於 /sys/devices/system/cpu/cpu*/cpufreq/。如果您的機器有多個 CPU,/sys/devices/system/cpu/ 中將存放每個處理器的子目錄:cpu0cpu1 等等。如果您的系統目前使用依需求或保守調節器,將可在 cpufreq 中看到這些調節器各自的子目錄,內含調節器的參數。

18.2.1.2. 調節時鐘頻率 (T 狀態)

此技術會忽略部分 CPU 的時脈訊號脈衝。到達 25% 調節時,會省略四分之一脈衝,到達 87.5% 時則每八次脈衝僅有一次會到達處理器。不過,節省用電量稍低於線性。通常調節功能僅在無此頻率比例時使用,或是為了最大化省電效果時使用。而且,此技術必須使用特定程序進行控制。「處理器調節狀態」(T 狀態) 的系統介面是 /proc/acpi/processor/*/throttling

18.2.1.3. 使處理器進入睡眠狀態 (C 狀態)

現代處理器具有幾種省電模式 (稱為 C 狀態)。它們會反映閒置處理器的容量,以關閉未使用的元件,從而達到省電的目的。作業系統會在沒有任何工作時讓處理器進入睡眠狀態。此時,作業系統會向 CPU 傳送 halt 指令。閒置狀態有三種:C1C2C3。在最經濟的 C3 狀態下,連處理器快取與主記憶體間的同步也會暫停。因此,僅能在沒有任何設備透過 Bus master 活動來修改主記憶體內容時可以套用此狀態。有些驅動程式會禁止使用 C3。目前的狀態會顯示在 /proc/acpi/processor/*/power 中。

如需詳細資訊,請參閱第 11.1.1 節「C-States (Processor Operating States)」 (第 11 章「Power Management」, ↑系統分析與調整指南)。

18.2.2. 工具

若要檢視或調整 CPUfreq 子系統的目前設定,請使用 cpufrequtils 為此目的提供的工具。安裝 cpufrequtils 套件之後,請使用 cpufreq-info 來擷取 CPUfreq 核心資訊。使用 cpufreq-set 指令可以修改 CPUfreq 設定。例如,以 root 身分執行以下指令,可在執行時期啟動依需求調節器:

cpufreq-set -g ondemand

有關更多詳細資料和可用的選項,請參閱 cpufreq-infocpufreq-set man 頁面,或者分別執行 cpufreq-info --helpcpufreq-set --help

功能多樣的 ACPI 公用程式包含多種有用的工具,包括僅顯示電池充電水平與溫度等資訊的工具 (acpi、klaptopdaemon 等等)、協助在 /proc/acpi 中存取結構或協助監控變更的工具 (akpi、acpiw、gtkacpiw),以及在 BIOS 中編輯 ACPI 表格的工具 (pmtools 套件)。

18.2.3. 疑難排解

共有兩種不同類型的問題。一方面是核心的 ACPI 程式碼包含無法及時偵測到的錯誤。在這種情況中,將會有可供下載的解決方案。問題通常是因 BIOS 而起。有時,會刻意在 BIOS 中整合與 ACPI 規格不符的技術,以避免在其他常見作業系統中出現 ACPI 實作錯誤。會在黑名單中將那些在 ACPI 實行中有重大錯誤的硬體元件記錄下來,以避免 Linux 核心對這些元件使用 ACPI。

發生問題時要做的第一件事是更新 BIOS。如果電腦未能開機,下列中的某一個開機參數也許有幫助:

pci=noacpi

不使用 ACPI 來設定 PCI 設備。

acpi=ht

僅執行一個簡單的資源組態。不將 ACPI 用於其他目的。

acpi=off

關閉 ACPI。

[Warning]未使用 ACPI 的開機問題

有些較新的機器 (尤其是 SMP 系統及 AMD64 系統) 需透過 ACPI 以正確設定硬體。關閉這些機器的 ACPI 會發生隨之而來的問題。

有時,透過 USB 或 FireWire 連接的硬體會另機器混淆。如果機器拒絕開機,則拔除所有不需要的硬體插頭,並再試一次。

開機後,可使用 dmesg | grep -2i acpi 指令來監控系統的開機訊息 (或所有訊息,因為也可能是 ACPI 以外的因素構成問題)。如果在分析 ACPI 表格時發生問題,可以將最重要的表格 DSDT (Differentiated System Description Table,區分系統描述表) 替換為改良版本。在此情況中,會忽略 BIOS 的錯誤 DSDT。程序在 第 18.4 節「疑難排解」 中描述。

在核心組態中,有個啟用 ACPI 除錯訊息的切換。如果已編譯並安裝好一個具有 ACPI 除錯能力的核心,則專家將能取得詳細資訊支援,以便搜尋錯誤。

如果您曾遇到 BIOS 問題或硬體問題,建議您聯絡製造商。尤其是哪些一直未提供 Linux 支援的製造商,更應該出面解決這些問題。唯有讓製造商得知他們有不少使用 Linux 的客戶,他們才會嚴肅地處理這些問題。

18.2.3.1. 如需更多資訊

18.3. 硬碟的休眠

在 Linux 中,可在不需使用硬碟時,讓硬碟完全進入睡眠狀態,或是讓硬碟以更省電、更安靜的方式來運作。在目前的筆記型電腦中,您不用手動關閉硬碟,因為它們會在不用的時候自動進入省電操作模式。不過,如果您想最大限度地省電,可以使用 hdparm 指令嘗試下面的幾種方法。

該指令能修改各種硬碟設定。-y 選項能立即將硬碟切換到待命模式。-Y 能讓它進入睡眠。hdparm -s x 則會讓硬碟閒置一段時期後關閉。如下所示取代 x0 會停用此機制,使得硬碟持續執行。1240 的值將乘以 5 秒。241251 的值則是以 30 分鐘為一個單位,依序從 30 分鐘的閒置到 11 倍的 330 分鐘的閒置。

可以使用 -B 選項來控制硬碟內部的省電選項。可從 0255 中選取一個值,以最大化省電效果或最大化電力輸出。其結果視硬碟用途而定,難以評估。如果要減少硬碟噪音,請使用 -M 選項。從 128254 中選取一個值,以決定要安靜或快速。

通常,要讓硬碟進入睡眠不是件容易的事。在 Linux 中,會有多個程序寫入硬碟中,因而重複喚醒硬碟。因此,有必要去瞭解 Linux 如何處理那些要寫入硬碟的資料 首先,會將所有資料在 RAM 中做緩衝處理。pdflush 精靈會監控此緩衝區。當資料到達特定的時間限制,或當緩衝區已填滿至某一程度時,會將緩衝區的內容注入硬碟。緩衝區的大小則動態地由記憶體地的大小及系統負載來決定。依預設,pdflush 會設成較短的間隔,以最大化資料的完整性。pdflush 每 5 秒檢查一次緩衝區,並將資料寫入硬碟。以下變數較為重要:

/proc/sys/vm/dirty_writeback_centisecs

包含 pdflush 執行緒喚醒前的延遲時間 (以百分之一秒為單位)。

/proc/sys/vm/dirty_expire_centisecs

定義最遲應在其後將改動分頁寫出的時間框架。預設值為 3000,即 30 秒。

/proc/sys/vm/dirty_background_ratio

pdflush 開始寫入改動分頁之前改動分頁的最大百分比。預設值為 5%。

/proc/sys/vm/dirty_ratio

改動分頁超過此總記憶體的百分比時,系統會強制執行程序以在其時間片段內將改動寫入緩衝區,而不是繼續寫入改動。

[Warning]損害資料完整性

變更 pdflush 精靈的設定會損害資料的完整性。

除了這些程序之外,ReiserFSExt3Ext4 記錄檔案系統及其他檔案系統不經由 pdflush 即將中繼資料寫入硬碟,也會使得硬碟無法減速。為了避免這類情形,正在開發適用於行動設備的核心延伸程式。若要使用該延伸,請安裝 laptop-mode-tools 套件。如需詳細資料,請參閱 /usr/src/linux/Documentation/laptops/laptop-mode.txt

另一個重要因素在於啟動程式的行為方式。例如,好的編輯器會定期為修改中的檔案,將隱藏備份檔寫入硬碟,因而喚醒硬碟。停用這類功能可能會傷害資料的完整性。

與此相關,postfix 郵件精靈會使用 POSTFIX_LAPTOP 變數。如果將此變數設為 yes,postfix 會減少存取硬碟的頻率。

在 SUSE Linux Enterprise Desktop 中,這些技術是由 laptop-mode-tools 控制的。

18.4. 疑難排解

所有錯誤訊息和警示會記錄在檔案 /var/log/messages 中。下列幾節涵蓋了一些最常見的問題。

18.4.1. 以硬體支援啟用 ACPI,但沒有作用

如果您遇到 ACPI 問題,請使用 dmesg|grep -i acpi 指令搜尋 dmesg 的輸出,以取得 ACPI 特定的訊息。

必須更新 BIOS 以解決問題。請到您筆記型電腦製造商的首頁,尋找更新的 BIOS 版本並安裝。請詢問製造商以符合最新 ACPI 規格。在 BIOS 更新後,如果錯誤持續發生,請繼續以更新的 DSDT 取代您 BIOS 中的錯誤 DSDT 表格:

過程 18.1. 更新 BIOS 中的 DSDT 表格

為執行下面的程序,請確定下列套件已安裝:kernel-sourceacpicamkinitrd

  1. http://acpi.sourceforge.net/dsdt/index.php 下載您系統的 DSDT。檢查檔案是否已解壓縮,並以所示副檔名 .aml (ACPI 機器語言) 編譯。如果是此狀況,請繼續步驟 3。

  2. 如果下載的表格副檔名為 .asl (ACPI 原始語言),請執行以下指令編譯該檔案:

    iasl -sa file.asl
  3. 將 (產生的) 檔案 DSDT.aml 複製到任何位置 (建議複製到 /etc/DSDT.aml)。

  4. 編輯 /etc/sysconfig/kernel 並將路徑與 DSDT 檔案搭配。

  5. 啟動 mkinitrd。每當您安裝核心並使用 mkinitrd 來建立 initrd 檔案時,這個經過修改的 DSDT 都會在系統啟動時整合並載入。

18.4.2. CPU 頻率沒有作用

請參閱核心來源以瞭解您的處理器是否受支援。您需要特殊核心模組或模組選項以啟用 CPU 頻率控制。如果 kernel-source 套件已安裝,則此資訊可在 /usr/src/linux/Documentation/cpu-freq/* 中找到。

18.4.3. 暫停和待命沒有作用

由於 DSDT 實做 (BIOS) 的錯誤,ACPI 系統在暫停或待命時可能會有問題。若這樣的話,請更新 BIOS。

當系統嘗試卸載錯誤模組時,系統會停止或不觸發暫停事件。如果您不卸載模組或停止服務 (導致無法成功暫停),也可能發生此狀況。在兩種情況下,都請嘗試辨識無法啟動休眠模式的錯誤模組。記錄檔案 /var/log/pm-suspend.log 包含了有關目前的狀況及錯誤之所在的詳細資訊。修改 /usr/lib/pm-utils/defaults 中的 SUSPEND_MODULES 變數,在暫停或待機之前先卸載有問題的模組。

請參閱 http://old-en.opensuse.org/Pm-utilshttp://en.opensuse.org/SDB:Suspend_to_RAM,以獲取更多關於如何修改暫停與恢復程序的詳細資訊。

18.5. 如需更多資訊