功耗限制框架

功耗限制框架在核心和使用者空間之間提供了一致的介面,使功耗限制驅動程式能夠以統一的方式向用戶空間公開設定。

術語

該框架透過 sysfs 以物件樹的形式向用戶空間公開功耗限制裝置。樹根級別的物件表示“控制型別”,對應於不同的功耗限制方法。例如,intel-rapl 控制型別表示英特爾“執行平均功耗限制”(RAPL)技術,而“空閒注入”控制型別則對應於使用空閒注入來控制功耗。

功耗區域代表系統的不同部分,可以使用給定區域所屬的控制型別所確定的功耗限制方法進行控制和監控。每個功耗區域都包含用於監控功耗的屬性,以及以功耗約束形式表示的控制。如果不同功耗區域所代表的系統部分是分層的(即,一個較大的部分由多個較小的部分組成,每個部分都有自己的功耗控制),則這些功耗區域也可以分層組織,其中一個父功耗區域包含多個子區域,以此類推,以反映系統的功耗控制拓撲。在這種情況下,可以使用父功耗區域對一組裝置一起應用功耗限制,如果需要更精細的控制,則可以透過子區域進行應用。

sysfs 介面樹示例

/sys/devices/virtual/powercap
└──intel-rapl
    ├──intel-rapl:0
    │   ├──constraint_0_name
    │   ├──constraint_0_power_limit_uw
    │   ├──constraint_0_time_window_us
    │   ├──constraint_1_name
    │   ├──constraint_1_power_limit_uw
    │   ├──constraint_1_time_window_us
    │   ├──device -> ../../intel-rapl
    │   ├──energy_uj
    │   ├──intel-rapl:0:0
    │   │   ├──constraint_0_name
    │   │   ├──constraint_0_power_limit_uw
    │   │   ├──constraint_0_time_window_us
    │   │   ├──constraint_1_name
    │   │   ├──constraint_1_power_limit_uw
    │   │   ├──constraint_1_time_window_us
    │   │   ├──device -> ../../intel-rapl:0
    │   │   ├──energy_uj
    │   │   ├──max_energy_range_uj
    │   │   ├──name
    │   │   ├──enabled
    │   │   ├──power
    │   │   │   ├──async
    │   │   │   []
    │   │   ├──subsystem -> ../../../../../../class/power_cap
    │   │   └──uevent
    │   ├──intel-rapl:0:1
    │   │   ├──constraint_0_name
    │   │   ├──constraint_0_power_limit_uw
    │   │   ├──constraint_0_time_window_us
    │   │   ├──constraint_1_name
    │   │   ├──constraint_1_power_limit_uw
    │   │   ├──constraint_1_time_window_us
    │   │   ├──device -> ../../intel-rapl:0
    │   │   ├──energy_uj
    │   │   ├──max_energy_range_uj
    │   │   ├──name
    │   │   ├──enabled
    │   │   ├──power
    │   │   │   ├──async
    │   │   │   []
    │   │   ├──subsystem -> ../../../../../../class/power_cap
    │   │   └──uevent
    │   ├──max_energy_range_uj
    │   ├──max_power_range_uw
    │   ├──name
    │   ├──enabled
    │   ├──power
    │   │   ├──async
    │   │   []
    │   ├──subsystem -> ../../../../../class/power_cap
    │   ├──enabled
    │   ├──uevent
    ├──intel-rapl:1
    │   ├──constraint_0_name
    │   ├──constraint_0_power_limit_uw
    │   ├──constraint_0_time_window_us
    │   ├──constraint_1_name
    │   ├──constraint_1_power_limit_uw
    │   ├──constraint_1_time_window_us
    │   ├──device -> ../../intel-rapl
    │   ├──energy_uj
    │   ├──intel-rapl:1:0
    │   │   ├──constraint_0_name
    │   │   ├──constraint_0_power_limit_uw
    │   │   ├──constraint_0_time_window_us
    │   │   ├──constraint_1_name
    │   │   ├──constraint_1_power_limit_uw
    │   │   ├──constraint_1_time_window_us
    │   │   ├──device -> ../../intel-rapl:1
    │   │   ├──energy_uj
    │   │   ├──max_energy_range_uj
    │   │   ├──name
    │   │   ├──enabled
    │   │   ├──power
    │   │   │   ├──async
    │   │   │   []
    │   │   ├──subsystem -> ../../../../../../class/power_cap
    │   │   └──uevent
    │   ├──intel-rapl:1:1
    │   │   ├──constraint_0_name
    │   │   ├──constraint_0_power_limit_uw
    │   │   ├──constraint_0_time_window_us
    │   │   ├──constraint_1_name
    │   │   ├──constraint_1_power_limit_uw
    │   │   ├──constraint_1_time_window_us
    │   │   ├──device -> ../../intel-rapl:1
    │   │   ├──energy_uj
    │   │   ├──max_energy_range_uj
    │   │   ├──name
    │   │   ├──enabled
    │   │   ├──power
    │   │   │   ├──async
    │   │   │   []
    │   │   ├──subsystem -> ../../../../../../class/power_cap
    │   │   └──uevent
    │   ├──max_energy_range_uj
    │   ├──max_power_range_uw
    │   ├──name
    │   ├──enabled
    │   ├──power
    │   │   ├──async
    │   │   []
    │   ├──subsystem -> ../../../../../class/power_cap
    │   ├──uevent
    ├──power
    │   ├──async
    │   []
    ├──subsystem -> ../../../../class/power_cap
    ├──enabled
    └──uevent

上述示例說明了使用英特爾® IA-64 和 IA-32 處理器架構中可用的英特爾 RAPL 技術的情況。有一個名為 intel-rapl 的控制型別,它包含兩個功耗區域,intel-rapl:0 和 intel-rapl:1,分別代表 CPU 封裝。這些功耗區域中的每一個都包含兩個子區域,intel-rapl:j:0 和 intel-rapl:j:1(j = 0, 1),分別代表給定 CPU 封裝的“核心”和“非核心”部分。所有區域和子區域都包含能量監控屬性 (energy_uj, max_energy_range_uj) 和約束屬性 (constraint_*),允許應用控制(“封裝”功耗區域中的約束適用於整個 CPU 封裝,而子區域約束僅分別適用於給定封裝的各個部分)。由於英特爾 RAPL 不提供瞬時功耗值,因此沒有 power_uw 屬性。

此外,每個功耗區域都包含一個名稱屬性,允許識別該區域所代表的系統部分。例如:

cat /sys/class/power_cap/intel-rapl/intel-rapl:0/name

package-0

根據不同的功耗區域,英特爾 RAPL 技術允許將一個或多個約束(如短期、長期和峰值功耗)以及不同的時間視窗應用於每個功耗區域。所有區域都包含表示約束名稱、功耗限制和時間視窗大小的屬性。請注意,時間視窗不適用於峰值功耗。這裡,constraint_j_* 屬性對應於第 j 個約束(j = 0,1,2)。

例如:

constraint_0_name
constraint_0_power_limit_uw
constraint_0_time_window_us
constraint_1_name
constraint_1_power_limit_uw
constraint_1_time_window_us
constraint_2_name
constraint_2_power_limit_uw
constraint_2_time_window_us

功耗區域屬性

監控屬性

energy_uj (讀寫)

當前能量計數器,單位微焦。寫入“0”復位。如果計數器無法復位,則此屬性為只讀。

max_energy_range_uj (只讀)

上述能量計數器的範圍,單位微焦。

power_uw (只讀)

當前功耗,單位微瓦。

max_power_range_uw (只讀)

上述功耗值的範圍,單位微瓦。

name (只讀)

此功耗區域的名稱。

某些域可能同時具有功耗範圍和能量計數器範圍;但是,其中一個為必選。

約束

constraint_X_power_limit_uw (讀寫)

功耗限制,單位微瓦,應適用於“constraint_X_time_window_us”指定的時間視窗。

constraint_X_time_window_us (讀寫)

時間視窗,單位微秒。

constraint_X_name (只讀)

約束的可選名稱

constraint_X_max_power_uw(只讀)

允許的最大功耗,單位微瓦。

constraint_X_min_power_uw(只讀)

允許的最小功耗,單位微瓦。

constraint_X_max_time_window_us(只讀)

允許的最大時間視窗,單位微秒。

constraint_X_min_time_window_us(只讀)

允許的最小時間視窗,單位微秒。

除 power_limit_uw 和 time_window_us 之外,其他欄位均為可選。

通用區域和控制型別屬性

enabled (讀寫): 在區域級別或使用控制型別對所有區域啟用/停用控制。

功耗限制客戶端驅動介面

API 摘要

呼叫 powercap_register_control_type() 註冊控制型別物件。呼叫 powercap_register_zone() 註冊功耗區域(在給定控制型別下),可以作為頂層功耗區域,也可以作為先前註冊的另一個功耗區域的子區域。在呼叫 powercap_register_zone() 註冊該區域之前,必須定義功耗區域中的約束數量和相應的回撥函式。

要釋放功耗區域,請呼叫 powercap_unregister_zone()。要釋放控制型別物件,請呼叫 powercap_unregister_control_type()。可以使用 kernel-doc 在 include/linux/powercap.h 上生成詳細的 API 文件。