運算壓力 API

瞭解系統運算壓力。

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

Compute Pressure API 提供代表系統壓力的概略狀態,這可讓實作使用正確的基礎硬體指標,確保使用者在系統未受到難以管理的壓力下,能充分利用所有可用的處理能力。

目前狀態

步驟 狀態
1. 建立說明 完成
2. 建立規格初稿 完成
3. 收集意見回饋並反覆改進設計 進行中
4. 來源試用 完成
5. 發布 完成 (Chrome 125)

試用 Compute Pressure API

如要在本機測試 Compute Pressure API,請參閱此頁面

註冊參加來源試用

從 Chrome 115 開始,Compute Pressure API 提供來源試用。預計將於 Chrome 123 版 (2024 年 5 月 29 日) 結束。註冊來源試用計畫

使用案例

目前的 Compute Pressure API 強化的主要用途是視訊會議和電玩遊戲。

這些熱門的即時應用程式歸類為軟性內容。也就是說,如果系統超出特定狀態,服務品質會降低,但不會導致系統完全故障。這些軟性即時應用程式能夠根據 CPU 耗用量或壓力調整工作負載,因此可獲得極大助益。

具體來說,此 API 的第一個版本旨在啟用下列調整決策。

視訊會議

  • 調整在多人通話期間同時顯示的影片動態消息數量。
  • 降低影片處理品質 (影片解析度、每秒影格數)。
  • 略過不必要的影片處理作業,例如某些相機濾鏡。
  • 停用非必要的音訊處理作業,例如 WebRTC 雜訊抑制。
  • 在影片和音訊編碼 (在 WebRTC、WebCodecs 或軟體編碼中) 中,將品質與速度和大小與速度的旋鈕轉向「速度」。

電玩遊戲

  • 使用品質較低的素材資源組合遊戲影片 (3D 模型、紋理、著色器) 和音訊 (語音、音效)。
  • 停用會導致非必要細節不夠逼真的效果 (水、布料、火焰動畫、皮膚亮度、眩光效果或不影響遊戲過程的物理模擬)。
  • 調整遊戲算繪引擎中品質與速度的旋鈕 (陰影品質、紋理篩選、檢視距離)。

從技術層面來說,只要瞭解主執行緒和網站使用的背景工作程式所處的熱力 (例如系統是否處於被動冷卻狀態) 和 CPU 壓力狀態,就能達成上述目標。系統熱力狀態是全域狀態,可能會受到觀察網站以外的應用程式和網站影響。

介面

Compute Pressure API 可以在以下環境中執行:

  • 視窗或主執行緒
  • 專屬 Worker
  • 共用工作人員

Compute Pressure API 定義了兩個新的介面。

PressureObserver:這個物件可在預先定義的取樣間隔中觀察任意數量來源的運算壓力。Chromium 的第一次疊代會將 "cpu" 公開為 source。詳情請參閱「參數」一節。每個觀察器都能非同步觀察系統中的壓力變化趨勢。

PressureRecord:說明轉換過程中特定時刻的壓力趨勢。您只能透過兩種方式取得這類型別的物件:做為 PressureObserver 回呼的輸入內容,或是在 PressureObserver 例項上呼叫 takeRecords() 方法。

PressureObserver

建立 PressureObserver 物件時,系統會將其設為在指定的取樣間隔內,監控支援來源的壓力。在 PressureObserver 物件的生命週期中,您隨時可以個別觀察或不觀察支援的來源。物件建立後,您就無法變更取樣間隔。

建構函式

PressureObserver(callback):建立新的 PressureObserver 物件,此物件會在偵測到所觀察到的來源值發生變更時叫用指定的回呼函式。

建構函式會採用必要的 回呼函式。

回撥電話

callback():系統會使用含有未讀取 PressureRecord 物件的陣列呼叫回呼。

方法

PressureObserver.observe(source, options):向「PressureObserver」指出要觀察的來源,以及選用的 options 做為參數。

選項

PressureObserverOptions:包含取樣間隔 (sampleInterval,單位為毫秒)。

PressureObserver.unobserve(source):指示「PressureObserver」停止觀察來源。

PressureObserver.disconnect():要求「PressureObserver」停止觀察所有來源。

PressureObserver.takeRecords():自上次回呼呼叫以來,傳回一連串記錄

static PressureObserver.knownSources() (唯讀):依字母順序傳回使用者代理程式的已知來源類型。

參數

source:要觀察的來源,例如 "cpu"。這必須是支援的來源類型

目前的 Compute Pressure 僅支援 "cpu"

PressureRecord

Compute Pressure API 的 PressureRecord 介面會說明來源在特定轉換時刻的壓力趨勢。

執行個體屬性

PressureRecord.source (唯讀):傳回字串,代表記錄的來源。

PressureRecord.state (唯讀):傳回字串,代表已記錄的壓力狀態。

PressureRecord.time (唯讀):傳回代表高解析度時間戳記的數字。

範例

下列各節列出實用的使用範例。

判斷 API 支援情形

if ('PressureObserver' in globalThis) {
  // The Compute Pressure API is supported.
}

建立壓力觀察器

使用回呼函式呼叫其建構函式,建立壓力觀察器,以便在有壓力更新時執行:

const observer = new PressureObserver((records) => {
  /* ... */
});

壓力觀察器的使用方式

啟動壓力觀察器的方法只有一種。針對每個來源呼叫 observer.observe(source)

observer.observe("cpu" { sampleInterval: 2_000 });

在本例中,"cpu" 是我們感興趣的壓力來源。目前這是唯一可用的來源。日後可能會有其他來源,例如 "gpu""power""thermals"

若取樣間隔 sampleInterval 為 2000 毫秒,表示更新頻率最多為每兩秒一次。

如果系統無法提供要求的取樣間隔,就會以最合適的間隔提供樣本。舉例來說,如果要求的間隔為 2000 毫秒,但系統只能提供最多 1000 毫秒的樣本,系統會選取 1000 毫秒。

如要停止觀察來源,請使用 unobserve() 方法,如以下範例所示:

observer.unobserve('cpu');

如要一次取消觀察所有來源,請使用 disconnect() 方法,如以下範例所示:

observer.disconnect();

擷取壓力記錄

您可以使用回呼函式擷取壓力記錄,每次壓力狀態發生變更時,系統都會叫用回呼函式。

function callback(records) {
  const lastRecord = records[records.length - 1];
  console.log(`Current pressure ${lastRecord.state}`);
  if (lastRecord.state === 'critical') {
    // Reduce workers load by 4.
  } else if (lastRecord.state === 'serious') {
    // Reduce workers load by 2.
  } else {
    // Do not reduce.
  }
}

const observer = new PressureObserver(callback);
await observer.observe('cpu', { sampleInterval: 1_000 });

使用者也可以呼叫 takeRecords() 方法,強制讀取 PressureRecord

PressureObserver 介面的 takeRecords() 方法會傳回壓力觀察器中儲存的 PressureRecords 物件陣列,並將其清空。

最常見的用途是,在中斷觀測器之前,立即擷取所有待處理的壓力記錄 (尚未由觀測器的回呼函式處理),以便在關閉觀測器時處理所有待處理的記錄。

呼叫這個方法會清除待處理記錄清單,因此不會執行回呼。

const observer = new PressureObserver((records) => {
  /* Do something with records. */
});

await observer.observe('cpu', { sampleInterval: 1_000 });

setTimeout(() => {
  // Forced records reading.
  const records = observer.takeRecords();
  observer.disconnect();
  // Do something with last records if any.
}, 2000);

提供意見

API 是否有任何功能無法正常運作?您是否發現任何缺少使用 API 的方法或屬性?在對應的 GitHub 存放區中提交規格問題或對現有問題發表意見。

回報實作問題

你是否發現 Chromium 實作項目有錯誤?或者實作方式與規格不同?請前往 new.crbug.com 回報錯誤。請務必提供盡可能多的詳細資料和重現步驟,並在「Components」方塊中輸入「Blink>PerformanceAPIs>ComputePressure」

資源