ACPI (Advanced configuration and power interface) 的 Power States 狀態被定義成許多類別.除了系統的 Global states , ACPI 還支援了 CPU (Processor , Performance states) 與 device (Device states) 的電源管理.在 wiki 的 ACPI 中把 Power states 定義的很清楚 http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface
Sleep States (Global states)
Global states 從 G0 到 G3 – Go(S0) ,G1(S1 ,S2 ,S3 ,S4) ,G2(S5) ,G3 ,對應到 Linux ACPI 的 Sleep states (S1 ~ S4) 但 S0 = G0 , S5 = G2.
在 Linux 下 ACPI 的功能要在 kernel 2.6 版才支援下面是他的 state 所代表的意義
- S1 – “Sleep”
CPU保持供電,但不執行指令,當 CPU 停止運行時,其他相關裝置也一樣被關閉. - S2
在規範定義該狀態是當前未在使用。 - S3 – “Suspend to RAM”
所有 CPU 供電被切斷,並且其暫存器的內容被刷新到RAM. - S4 – “Suspend to Disk”
CPU的電源關閉如同 S3,但RAM的資料寫入到磁盤.稱為S4BIOS一種變型是最普遍的,S4 必須由 BIOS 來實現而不是透過作業系統.在以前 Linux 2.4.x 的核心 S4 不被支援. - S5 – “Soft Off”
這個狀態下系統是關閉,但某一些設備還是保有部分電力(像是 LAN 或 USB 等設備),這些設備主要是在等待接收喚醒的事件,接受到會讓系統開機.
檢視系統核心是否有支援.
[root@localhost ~]# cat /boot/config-2.6.18-53.el5 | grep -i acpi_sleep CONFIG_ACPI_SLEEP=y CONFIG_ACPI_SLEEP_PROC_FS=y # CONFIG_ACPI_SLEEP_PROC_SLEEP is not set
檢視系統有支援哪一些 state 要看 /sys/power/state
[root@localhost ~]# cat /sys/power/state standby disk mem
可以看到你的系統有支援 standby(S1), mem(S3), disk(S4).可以用下面的方法來測試一下.
[root@localhost ~]# echo -n standby > /sys/power/state [root@localhost ~]# echo -n mem > /sys/power/state [root@localhost ~]# echo -n disk > /sys/power/state
如果動作正常你會看到系統依據不同的 state 有不同的 ACPI 狀態出現.
Processor Operating States (C-states)
不光是系統有 Power states ,Device 和 Processor 也有自己的 Power states.
CPU 在沒有使用時可以被停用或以比較低的效能模式來運行,依據不同的狀態可以區分成為幾種 C-state ,C-state 從 C0 (不閒置)開始,數字越高表示越省電(每一家的 CPU 定義 C-state 會稍微不同).
CPU 的 C-state 有下面幾種.
- C0 – Operating State
- C1 – Halt
- C1E – Enhanced Halt
- C2 – Stop Grant
- C2 – Stop Clock
- C2E – Extended Stop Grant
- C3 – Sleep
- C3 – Deep Sleep
- C3 – AltVID
- C4 – Deeper Sleep
- C4E/C5 -Enhanced Deeper Sleep
- C6 – Deep Power Down
- C7 – C6 + LLC may be flushed
- C8 – C7 + LLC must be flushed
要看 CPU 有支援哪一些 C-state 可以透過指令 cpupower,參數 idle-info 可以看到有支援的 C-State.
[root@localhost ~]# cpupower idle-info CPUidle driver: none CPUidle governor: menu analyzing CPU 0: CPU 0: No idle states
參數 monitor 可以檢視目前的 C-State 為哪一種.
POLL = C0
[root@localhost ~]# cpupower monitor -l Monitor "SandyBridge" (3 states) - Might overflow after 922000000 s C7 [C] -> Processor Core C7 PC2 [P] -> Processor Package C2 PC7 [P] -> Processor Package C7 [root@localhost ~]# cpupower monitor |SandyBridge PKG |CORE|CPU | C7 | PC2 | PC7 0| 0| 0| 0.00| 0.00| 0.00 2| 0| 1| 0.00| 0.00| 0.00
MPERF increasing with maxium (P0) frequency in C0
APERF increasing with current/actual frequency in C0
Processor Performance States (P-states)
剛剛的 D0 (Devices) , C0(CPU) 定義為 operating state 也就是在運作階段,在這個階段中處理器還區分為不同的 Performance states 從 P0 ~ P16, P0 是效能最高的狀態.依序效能往下 Pn , Pn-1 …P16.
P-States 就是指 CPU 依據目前狀態自行調整工作頻率,用以省電.
透過指令 cpupower ,參數 frequency-info 可以得知目前這個 CPU 支援的工作頻率.
[root@localhost ~]# cpupower frequency-info analyzing CPU 0: no or unknown cpufreq driver is active on this CPU CPUs which run at the same hardware frequency: Not Available CPUs which need to have their frequency coordinated by software: Not Available maximum transition latency: Cannot determine or is not supported. hardware limits: Not Available available cpufreq governors: Not Available Unable to determine current policy current CPU frequency: Unable to call hardware current CPU frequency: Unable to call to kernel boost state support: Supported: no Active: no
透過 turbostat – https://benjr.tw/99181 與 powertop – https://benjr.tw/99175 , 一樣可以觀察目前 CPU 狀態.
如果要設定 CPU 的工作頻率,可以透過指令 # cpupower frequency-set
Device states
Device states 從 D0 ~ D3 (D0 ,D1 ,D2).
Dump ACPI Table
我們在 Linux 下面可以透過一些方式把 ACPI 定義的表格抓出來,這相容 ACPI 表格,紀錄了作業系統和系統韌體之間的介面。
- DSDT – Differentiated System Description Table
- SSDT – Secondary System Description Table
測試環境為 CentOS7 x86_64 (虛擬機)
透過 # cat /sys/firmware/acpi/tables/DSDT > dsdt.aml 我們可以找到 DSDT (Differentiated System Description Table) 檔案,不過這不是給人看的,所以還要透過 # iasl -d dsdt.aml (iasl 由 acpica-tools 套件提供,大部分的系統預設皆沒該項工具.) 來做轉換.
[root@localhost ~]# cat /sys/firmware/acpi/tables/DSDT > dsdt.aml
[root@localhost ~]# iasl -d dsdt.aml Intel ACPI Component Architecture ASL+ Optimizing Compiler version 20160527-64 Copyright (c) 2000 - 2016 Intel Corporation Input file dsdt.aml, Length 0x13331 (78641) bytes ACPI: DSDT 0x0000000000000000 013331 (v01 PTLTD Custom 06040000 MSFT 03000001) Pass 1 parse of [DSDT] Pass 2 parse of [DSDT] Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions) Parsing completed Disassembly completed ASL Output: dsdt.dsl - 726215 bytes
或是直接使用 # acpidump ( acpidump 一樣由 acpica-tools 套件提供)來看.
[root@localhost ~]# acpidump