第二次試用 Compute 壓力來源試用

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

過去一年,Intel 一直與 Google 和其他單位合作,開發 Compute Pressure API。在 Chrome 115 中,您可以註冊來源試用,以便測試這個新的 API。本篇文章將說明這個 API 的設計目的,以及如何使用這個 API。

問題

網路正成為重要的應用程式平台,透過新功能,不僅可實現視訊會議等應用程式,還能為使用者提供絕佳體驗。以網頁為基礎的體驗可立即載入,可從任何地方存取,且無需預先安裝。

使用者希望應用程式可以快速載入並即時回應。他們也希望電池續航力能盡可能延長,並希望裝置能保持安靜,不會過熱。在創造進階體驗的同時,要達到這些效果有時不太容易,因為流暢的動畫和背景影片模糊效果會消耗大量處理效能,導致硬體效能達到極限並耗盡電池電量。

此外,用於存取網路應用程式的裝置種類繁多。即使使用相同版本的瀏覽器,五年舊的筆記型電腦與全新的電腦功能差異極大。

開發人員通常會選擇以最小公約數為目標進行開發,避免使用會耗用較舊或效能較低裝置資源的功能。不過,如果可以為擁有合適裝置且處於適當環境的使用者提供最佳體驗,何不這麼做呢?舉例來說,當您透過手機加入視訊通話時,只看見目前發言者可能會是最佳體驗。不過,在電腦上,我們建議您盡量讓所有通話參與者都能看到畫面,而且硬體通常也能勝任這項任務。為此,您需要使用實時硬體遙測資料,且不犧牲使用者的隱私權,以便安排工作,並逐步開啟和關閉功能,確保順暢的使用者體驗。這時,Compute Pressure API 就能派上用場。

什麼是 Compute Pressure API?

Compute Pressure API 提供高層級狀態,代表系統的壓力。這些高層級狀態可確保在隱私權 (不分享過多可識別使用者的特定資訊) 和開發人員可輕鬆推論的資訊之間取得平衡。此外,這項功能還可讓實作使用正確的基礎硬體指標,確保使用者在系統未受到難以控管的壓力下,能充分利用所有可用的處理能力。

舉例來說,現代 CPU 在單一核心或所有核心上,在大多數情況下都能以 100% 的使用率順利運作,因此將 80% 使用率硬編碼為關鍵的 API,可能會導致開發人員未充分利用硬體功能,並提供不理想的使用者體驗。另一方面,系統可能沒有適當的冷卻功能,或是環境溫度可能很高 (例如夏季),因此系統可能會在 CPU 使用率達到高水準之前就開始降速。目前的 API 可處理全域 CPU 壓力,但我們打算嘗試在主執行緒和 worker 上啟用每個頁面的 CPU 壓力。

運算壓力有下列狀態:

  • 正常:目前的工作負載會造成最小壓力,讓系統以較低的時脈頻率運作,以節省電力。
  • 良好:系統運作正常,一切順利,可順利執行額外工作。
  • 嚴重:系統有嚴重壓力,但可控管,且系統運作良好,但可能接近極限:
    • 時脈速度 (視交流電或直流電而定) 持續維持在高水準。
    • 熱力過高,但仍可控管,不會導致降速。

此時如果您增加更多工作,系統可能會進入危急狀態。

  • 重要:系統即將達到限制,但尚未達到限制。系統狀態為「Critical」不代表系統正在積極節流,但這類狀態無法長期維持,如果工作負載維持不變,可能會導致節流。這個信號是網頁應用程式最後一次呼叫,可減輕其工作負載。

啟用 Compute Pressure API

根據預設,Chrome 不會啟用 Compute Pressure API,但您可以明確啟用這項功能,在 Chrome 115 中進行實驗。您可以啟用 enable-experimental-web-platform-features 標記,在本機啟用此功能。

為讓所有應用程式訪客都能使用這項功能,我們目前正在進行來源測試,並已設定在 Chrome 118 版本 (2023 年 7 月 18 日) 結束。如要參與試用,請註冊並在 HTML 或 HTTP 標頭中加入含有來源試用權杖的中繼標記元素。詳情請參閱「開始使用原點試驗」一文。

觀察運算壓力

以下程式碼片段說明如何監控及因應運算壓力變化:

// The `records` parameter is a sequence of records between two
// consecutive callbacks. Currently it contains ten entries, but
// this is an implementation detail.
function callback(records) {
  const lastRecord = records.pop();
  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, {
  // Sample rate in Hertz.
  sampleRate: 1,
});
observer.observe('cpu');

以下程式碼片段說明如何透過 iframe 使用 Compute Pressure API:

<iframe src="https://mysite.com/" allow="compute-pressure">
  <script>
    // Use Compute Pressure API.
  </script>
</iframe>

平台支援

在 Linux、ChromeOS、macOS 和 Windows 的 Chrome 115 中,Compute Pressure API 已可供使用。

示範

請試試下方嵌入的示範,瞭解計算壓力狀態如何根據某些人為壓力而變更。

如果您的瀏覽器不支援 API,請觀看下方錄製的示範影片。

意見回饋

在這個階段,開發人員的意見回饋非常重要,因此請在 GitHub 回報問題,提供建議和問題。

特別銘謝

主圖片由 Robert Anasch 在 Unsplash 上建立。本文由 Rachel AndrewThomas Steiner 共同審查。