Intel Uncore 頻率調節

版權所有:

© 2022-2023 Intel Corporation

作者:

Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>

簡介

根據工作負載的特性,uncore 在 Intel 的 Xeon 伺服器中會消耗大量的電能。為了最佳化總功耗並提高整體效能,SoC 具有用於調節 uncore 頻率的內部演算法。這些演算法會監視 uncore 的工作負載使用情況並設定所需的頻率。

使用者可能對 uncore 效能有不同的期望,並且希望對其進行控制。其目標類似於允許使用者透過 cpufreq sysfs 設定頻率調節的最小/最大頻率以提高 CPU 效能。使用者可能有一些對延遲敏感的工作負載,他們不希望 uncore 頻率發生任何變化。此外,使用者可能有一些工作負載需要在不同的階段具有不同的核心和 uncore 效能,並且他們可能希望使用 cpufreq 和 uncore 調節介面來分配功耗並提高整體效能。

Sysfs 介面

為了控制 uncore 頻率,在目錄 /sys/devices/system/cpu/intel_uncore_frequency/ 中提供了一個 sysfs 介面。

對於每個封裝和晶片的組合,都有一個目錄,因為 uncore 調節控制的範圍是每個封裝中多個晶片的每個晶片,或者是每個封裝單個晶片的每個封裝。名稱代表控制的範圍。例如:“package_00_die_00” 表示封裝 ID 0 和晶片 0。

每個 package_*_die_* 包含以下屬性

initial_max_freq_khz

復位後,此屬性表示最大可能的頻率。這是一個只讀屬性。如果使用者調整了 max_freq_khz,他們始終可以使用此屬性中的值返回最大值。

initial_min_freq_khz

復位後,此屬性表示最小可能的頻率。這是一個只讀屬性。如果使用者調整了 min_freq_khz,他們始終可以使用此屬性中的值返回最小值。

max_freq_khz

此屬性用於設定最大 uncore 頻率。

min_freq_khz

此屬性用於設定最小 uncore 頻率。

current_freq_khz

此屬性用於獲取當前的 uncore 頻率。

具有 TPMI(拓撲感知暫存器和 PM 膠囊介面)的 SoC

SoC 可以包含多個具有單獨或集合網格分割槽的電源域。此分割槽稱為結構叢集。

某些型別的網格需要以相同的頻率執行,它們將被放置在同一個結構叢集中。結構叢集的優點是它提供了一種可伸縮的機制來處理 SoC 中的分割槽結構。

當前的 sysfs 介面支援在封裝和晶片級別的控制。此介面不足以支援在結構叢集級別進行更精細的控制。

具有 TPMI(拓撲感知暫存器和 PM 膠囊介面)支援的 SoC 可以具有多個電源域。每個電源域可以包含一個或多個結構叢集。

為了表示在結構叢集級別的控制,以及在封裝和晶片級別的控制(如不支援 TPMI 的系統),sysfs 得到了增強。此精細的介面在 sysfs 中以目錄名稱以 "uncore" 為字首顯示。例如:uncore00、uncore01 等。

控制範圍由目錄中的屬性 "package_id"、"domain_id" 和 "fabric_cluster_id" 指定。

每個目錄中的屬性

domain_id

此屬性用於獲取此例項的電源域 ID。

die_id

此屬性用於獲取此例項的 Linux 晶片 ID。此屬性僅適用於具有核心代理的域,並且當 CPUID 葉 0x1f 顯示晶片 ID 時。

fabric_cluster_id

此屬性用於獲取此例項的結構叢集 ID。

package_id

此屬性用於獲取此例項的封裝 ID。

agent_types

此屬性顯示域中存在的所有硬體代理。每個代理都有能力控制一個或多個硬體子系統,包括:核心、快取、記憶體和 I/O。

其他屬性與 package_*_die_* 級別中呈現的屬性相同。

在當前的大多數用例中,“max_freq_khz” 和 “min_freq_khz” 是在 “package_*_die_*” 級別更新的。此模型將透過以下方法繼續支援

當用戶在 “package_*_die_*” 級別使用控制時,該封裝和晶片中的每個結構叢集都會受到影響。例如:使用者更改 package_00_die_00 中的 “max_freq_khz”,則具有相同封裝 ID 的 uncore* 目錄的 “max_freq_khz” 將被更新。在這種情況下,使用者仍然可以在每個 uncore* 級別更新 “max_freq_khz”,這更具限制性。類似地,使用者可以在 “package_*_die_*” 級別更新 “min_freq_khz” 以應用於每個 uncore* 級別。

對 “current_freq_khz” 的支援僅在每個結構叢集級別(即在 uncore* 目錄中)可用。

效率與延遲的權衡

效率延遲控制 (ELC) 功能提高了每瓦效能。藉助此功能,硬體電源管理演算法可以最佳化延遲和功耗之間的權衡。對於某些對延遲敏感的工作負載,可以透過 SW 進行進一步調整以獲得所需的效能。

硬體會定期監視電源域中所有核心的平均 CPU 利用率,並確定 uncore 頻率。雖然這可能會帶來最佳的每瓦效能,但工作負載可能希望以功耗為代價獲得更高的效能。考慮一個間歇性喚醒以在空閒系統上執行記憶體讀取的應用程式。在這種情況下,如果硬體降低 uncore 頻率,則頻率的提升可能存在延遲,無法滿足目標效能。

ELC 控制定義了一些可以從 SW 更改的引數。如果平均 CPU 利用率低於使用者定義的閾值(下面的 elc_low_threshold_percent 屬性),則將使用使用者定義的 uncore 最低頻率(下面的 elc_floor_freq_khz 屬性),而不是硬體計算的最小值。

類似地,在高負載情況下,當 CPU 利用率高於高閾值(下面的 elc_high_threshold_percent 屬性)時,頻率以 100MHz 的步長增加,而不是立即跳轉到最大 uncore 頻率。這樣可以避免在 CPU 利用率出現峰值時立即消耗不必要的高功耗。

效率延遲控制的屬性

elc_floor_freq_khz

此屬性用於獲取/設定效率延遲最低頻率。如果此變數低於“min_freq_khz”,則韌體會忽略它。

elc_low_threshold_percent

此屬性用於獲取/設定效率延遲控制低閾值。此屬性以 CPU 利用率的百分比表示。

elc_high_threshold_percent

此屬性用於獲取/設定效率延遲控制高閾值。此屬性以 CPU 利用率的百分比表示。

elc_high_threshold_enable

此屬性用於啟用/停用效率延遲控制高閾值。寫入“1”以啟用,寫入“0”以停用。

下面的示例系統配置執行以下操作
  • 當 CPU 利用率低於 10% 時:將 uncore 頻率設定為 800MHz

  • 當 CPU 利用率高於 95% 時:以 100MHz 的步長增加 uncore 頻率,直到達到功率限制

elc_floor_freq_khz:800000 elc_high_threshold_percent:95 elc_high_threshold_enable:1 elc_low_threshold_percent:10