運算壓力 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 模型、紋理、著色器) 和音訊 (語音、音效)。
  • 停用會導致缺乏真實感的細節 (水、布、火焰動畫、膚色、炫光效果,或不會影響遊戲過程的實體模擬) 的特效。
  • 調整遊戲算繪引擎中的品質與速度旋鈕 (陰影品質、紋理篩選、觀看距離)。

技術上來說,可以藉由瞭解網站目前所用主執行緒和 worker 的熱能 (例如系統被動降溫) 和 CPU 壓力狀態來完成這些作業。系統熱力狀態是全域狀態,除了觀測站外,可能會受應用程式和網站影響。

介面

Compute Pressure API 可在下列情境中執行:

  • 視窗或主執行緒
  • 專門的工作站
  • 共用工作站

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

資源