運算壓力 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 可在下列情境中執行:

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

Compute Pressure API 定義了兩個介面。

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

PressureRecord:說明特定轉場時的壓力趨勢。此類型的物件只能以下列兩種方式取得:做為 PressureObserver 回呼的輸入,或是對 PressureObserver 執行個體呼叫 takeRecords() 方法。

PressureObserver

建立 PressureObserver 物件後,系統會按照指定的取樣間隔觀察支援來源的壓力。在 PressureObserver 物件的生命週期內,您可以隨時個別觀察或未觀察支援的來源。建立物件後即無法變更取樣間隔。

建構函式

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

建構函式會將必要的回呼函式和選用的選項做為參數。

回撥電話

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

選項

PressureObserverOptions:包含樣本時間間隔 (以毫秒為單位),使用者要求更新時sampleInterval

方法

PressureObserver.observe(source):告知「PressureObserver」要觀察的資料來源。

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

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

PressureObserver.takeRecords():傳回自上次回呼叫用以來的一系列記錄

static PressureObserver.supportedSources() (唯讀):傳回硬體支援的來源類型。

參數

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

在目前版本的 Compute Pressure 中,僅支援 "cpu"

PressureRecord

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

執行個體屬性

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

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

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

示例

是否支援 Compute Pressure API?

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

建立壓力觀察器

呼叫其建構函式來建立壓力觀察器,方法是在每次有壓力更新時執行的回呼函式:

const observer = new PressureObserver(
  (records) => { /* ... */ },
  { sampleInterval: 2000 }
);

如果取樣間隔 sampleInterval 為 2000 毫秒,表示最多每兩秒鐘就會更新一次。

如果無法提供要求的樣本間隔。系統將以存在的最佳時間間隔提供樣本。舉例來說,如果要求間隔為 2000 毫秒,但系統提供的樣本不得超過 1000 毫秒,則系統會選取 1000 毫秒。

使用壓力觀察器

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

observer.observe("cpu");

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

如要停止觀察來源,請使用 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, { sampleInterval: 1000 });
await observer.observe("cpu");

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

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

最常見的用途是在中斷觀察器之前,立即擷取所有尚未由觀察器的回呼函式處理的待處理壓力記錄,這樣在關閉觀察器時,系統就能處理所有待處理的記錄。

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

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

await observer.observe("cpu");

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

告訴我們 API 設計

有什麼 API 功能不如預期嗎?您認為 API 使用方式中,是否缺少任何方法或屬性?在對應的 GitHub 存放區中提交規格問題,或是對現有存放區加註。

回報導入問題

你在 Chromium 的實作方式中發現錯誤嗎?還是實作與規格不同?前往 new.crbug.com 回報錯誤。請務必盡可能提供詳細資訊、重現簡易操作說明,並在「元件」方塊中輸入 Blink>PerformanceAPIs>ComputePressure

實用連結