RFC-0203:推出「zx_system_energy_info」

RFC-0203:導入「zx_system_energy_info」
狀態已接受
區域
  • 核心
  • 功率
說明

與核心通訊以存取能源資訊的介面。

問題
  • 103700
變更
作者
審查人員
提交日期 (年/月)2022-11-18
審查日期 (年/月)2022-12-15

摘要

這項 RFC 提議採用的機制,讓使用者空間代理程式可與核心互動,藉此在支援執行平均電力限制 (RAPL) 介面的平台上,透過一組電源取得能源消耗資訊。

提振精神

能源效率與消耗是筆電設計的重要元素,不會永久透過電源供應網路。X86 RAPL 是新型 X86 CPU 的介面,可透過硬體效能計數器和 I/O 模型準確估算一系列電源領域的耗電量。如果我們有一種機制讓開發人員能夠在核心外部存取能源消耗資訊,就可以建構供開發人員使用和車隊追蹤工具,以人體工學方式檢查裝置上的執行時間繪圖,這對於最佳化開發期間的電力消耗最大化,以及識別整個機群的電力迴歸。

設計

背景

Intel x86 RAPL MSR

在 RAPL 中,平台分為多個網域,方便您製作精細的報表和控管。RAPL 網域是適合電源管理的實體網域,平台中可用的特定 RAPL 網域會因處理器系列/模型而異,包括:

  • PSys:整個 SoC
  • 套件:處理器死亡 (所有核心、整合式圖形、快取、記憶體控制器)。
  • Power Plane PP0:所有處理器核心和私人快取。
  • 電源 PP1:非核心中特定裝置的電源變壓器,通常是整合式 GPU。
  • 記憶體:已連接整合式記憶體控制器的 DRAM。

RAPL 介麵包含非架構的 MSR。每個 RAPL 網域都支援下列功能組合,其中部分功能為選用功能,如下所示:

  • Power Limit:MSR 介面可指定電源限制、時間範圍、鎖定位元、限制位元等。
  • Energy Status:電源計量介面,提供耗電量資訊。
  • Perf Status (選用):因應電源限製而產生效能影響 (迴歸) 的介面。定義為持續時間指標,用於測量在個別網域中計算功率限制的影響。時間長度的意義會因領域而異。
  • Power Info (選用):提供特定網域的參數範圍資訊、最低功率、最高功率等資訊的介面。
  • Policy (選用):4 位元優先順序資訊,提示將預算劃分到上層網域中的子網域。

上述每項功能都需要特定的單位來描述。單位會在唯讀 MSR_RAPL_POWER_UNIT MSR 中公開,為各個單位提供縮放比例係數,讓資訊能以有限的位元數呈現有意義的資訊。

儲存不同網域能源消耗資訊的 MSR 是唯讀的 Energy Status MSR:

  • MSR_PLATFORM_ENERGY_STATUS (0x0000064d)
  • MSR_PKG_ENERGY_STATUS (0x00000611)
  • MSR_DRAM_ENERGY_STATUS (0x00000619)
  • MSR_PP0_ENERGY_STATUS (0x00000639)
  • MSR_PP1_ENERGY_STATUS (0x00000641)

上述 MSR 的能量單位是透過 MSR_RAPL_POWER_UNITEnergy Status Units 欄位指定。

Energy Status MSR 支援有限的處理器系列/模型。如果程式碼存取非架構 MSR,且在不支援 MSR 的處理器上執行的程式碼,則會產生例外狀況。下列僅列舉部分支援各 MSR 的處理器模型:

MSR_PLATFORM_ENERGY_STATUS 適用於下列處理器:

  • Skylake,系列:6,型號:0x4e、0x5e
  • Kaby Lake,系列:6,型號:0x8e、0x9e
  • 坎農湖,系列:6,型號:0x66

MSR_PKG_ENERGY_STATUS 適用於下列處理器:

  • Sandy Bridge,系列:6,型號:0x2a,0x2d
  • Ivy Bridge,系列:6,型號:0x3a、0x3e
  • 哈斯威爾,系列:6,型號:0x3c、0x3f、0x45、0x46
  • Broadwell,系列:6,型號:0x3d、0x47、0x56、0x4f
  • Skylake,系列:6,型號:0x4e、0x5e
  • Kaby Lake,系列:6,型號:0x8e、0x9e
  • Skylake X/SP,系列:6,型號:0x55
  • 坎農湖,系列:6,型號:0x66
  • Ice Lake-SP,系列:6,型號:0x6a

MSR_DRAM_ENERGY_STATUS 適用於下列處理器:

  • 哈斯威爾,系列:6,型號:0x3c、0x3f、0x45、0x46
  • Broadwell,系列:6,型號:0x3d、0x47、0x56、0x4f
  • Skylake,系列:6,型號:0x4e、0x5e
  • Kaby Lake,系列:6,型號:0x8e、0x9e
  • Skylake X/SP,系列:6,型號:0x55
  • 坎農湖,系列:6,型號:0x66
  • Ice Lake-SP,系列:6,型號:0x6a

MSR_PP0_ENERGY_STATUS 適用於下列處理器:

  • Sandy Bridge,系列:6,型號:0x2a,0x2d
  • Ivy Bridge,系列:6,型號:0x3a、0x3e
  • 哈斯威爾,系列:6,型號:0x3c、0x3f、0x45、0x46
  • Broadwell,系列:6,型號:0x3d、0x47、0x56、0x4f
  • Skylake,系列:6,型號:0x4e、0x5e
  • Kaby Lake,系列:6,型號:0x8e、0x9e
  • Skylake X/SP,系列:6,型號:0x55
  • 坎農湖,系列:6,型號:0x66
  • Ice Lake-SP,系列:6,型號:0x6a

MSR_PP1_ENERGY_STATUS 適用於下列處理器:

  • Skylake,系列:6,型號:0x4e、0x5e
  • Kaby Lake,系列:6,型號:0x8e、0x9e
  • 坎農湖,系列:6,型號:0x66

AMD x86 RAPL MSR

近期的 AMD 處理器支援與 Intel RAPL MSR 半相容的 MSR 介面。支援的 RAPL MSR 有相同的內容,但 MSR 編號不同。具體來說,AMD Zen (系列:0x17、0x19) 處理器支援下列 Energy Status MSR:

  • MSR_AMD_CORE_ENERGY_STATUS (0xc001029a)

    • 等同於 Power Plane PP0 網域的 Intel MSR_PP0_ENERGY_STATUS
  • MSR_AMD_PKG_ENERGY_STATUS (0xc001029b)

    • 等同於 Package 網域的 Intel MSR_PKG_ENERGY_STATUS

Syscall:zx_system_energy_info

簽章

此系統呼叫可讓使用者代理程式代理程式存取儲存在指定電源領域的 RAPL MSR 所儲存的能源消耗資訊:

zx_status_t zx_system_energy_info(
    zx_handle_t resource,
    uint32_t domain,
    uint64_t* energy_uj
);

其引數如下:

resource:授予這個呼叫權限的資源。必須為 ZX_RSRC_SYSTEM_ENERGY_INFO_BASE,這是專為這個 API 引入的新資源,否則呼叫會失敗。

domain:這個呼叫參照的 RAPL 網域。系統會使用下列任一值指定 RAPL 網域:

  • ZX_ENERGY_X64_PLATFORM_DOMAIN
  • ZX_ENERGY_X64_PKG_DOMAIN
  • ZX_ENERGY_X64_DRAM_DOMAIN
  • ZX_ENERGY_X64_PP0_DOMAIN
  • ZX_ENERGY_X64_PP1_DOMAIN

上述網域會在提案實作時定義。網域會決定寫入 energy_uj 的內容,如下所述。

energy_uj:如果呼叫成功,則傳回 energy_uj 時會包含 uj 能量值。能源值取決於儲存在指定網域的 Energy Status MSR 中的值,以及儲存在 MSR_RAPL_POWER_UNITEnergy Status Units 欄位中的單位。如果呼叫失敗,則無法指定值。

錯誤狀況

ZX_ERR_NOT_SUPPORTED

  • 該處理器並非支援的 x86-64 處理器

  • 這個處理器是支援的 x86-64 處理器,但不支援指定網域的 Energy Status MSR。

  • 該處理器是支援的 x86-64 處理器,且可在此處理器上使用指定網域的 Energy Status MSR,但讀取作業並未啟用。

ZX_ERR_BAD_HANDLE

  • 資源不是有效的帳號代碼。

ZX_ERR_WRONG_TYPE

  • 資源不是有效的資源控制代碼或類型不是 ZX_RSRC_KIND_SYSTEM

ZX_ERR_INVALID_ARGS

  • domain 不是下列其中一項:

    • ZX_ENERGY_X64_PLATFORM_DOMAIN
    • ZX_ENERGY_X64_PKG_DOMAIN
    • ZX_ENERGY_X64_DRAM_DOMAIN
    • ZX_ENERGY_X64_PP0_DOMAIN
    • ZX_ENERGY_X64_PP1_DOMAIN
  • energy_uj 是無效的指標。

ZX_ERR_OUT_OF_RANGE

  • 資源種類為 ZX_RSRC_KIND_SYSTEM,但並不等於 ZX_RSRC_SYSTEM_ENERGY_INFO_BASE

實作

核心

您必須實作新的 Syscall,並受到新資源 ZX_RSRC_SYSTEM_ENERGY_INFO_BASE 的保護。Fuchsia 核心已有 API,可以使用 CPUID 查詢製造商 ID 和處理器簽名/ID。DisplayFamily 和 DisplayModel 已對應至各種 x86 處理器的處理器 ID,可用於判斷 MSR 的可用性。

元件管理工具

必須定義新的通訊協定 EnergyInfoResource,且必須由元件管理服務實作,才能提供 ZX_RSRC_SYSTEM_ENERGY_INFO_BASE 資源。這會遵循現有的模式,適用於限制系統呼叫的資源。

效能

這對效能沒有任何已知的影響。新的 Syscall 只會碰觸少量資料,因此執行的執行時間很少。

安全性考量

系統呼叫是由新的資源控制代碼 ZX_RSRC_SYSTEM_ENERGY_INFO_BASE 管制。這個保護機制可解決對核心受到惡意幹擾的疑慮。

隱私權注意事項

這項提案對隱私權沒有實質影響。

測試

  • 您可以新增單元測試,藉此驗證傳回的 energy_uj 是否能從 MSR 中儲存的值正確轉換。

說明文件

Zircon 系統呼叫說明文件將更新,加入新的 API。

缺點、替代方案和未知

考量到較為籠統的介面,例如能夠產出其他實用 MSR 功能的 zx_get_msr 系統呼叫。不過,非架構的 MSR 存取需要受其在處理器上的可用性管制。一般而言,一般介面的需求和範圍相當可觀。最終,我們選擇了狹窄的介面,藉此保持簡易的實作方式,並讓日後提案的成本相對較低。

先前的圖片和參考資料

透過 cmd ZX_SYSTEM_POWERCTL_X86_SET_PKG_PL1 呼叫的 zx_system_powerctl syscall 會使用 RAPL Power LimitPower Info MSR 操控 CPU 效能等級。用於驗證這個系統呼叫的資源具有 ZX_RSRC_KIND_SYSTEM 及基礎 ZX_RSRC_SYSTEM_POWER_BASE 的資源類型。