Compute Pressure 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 の最初のバージョンでは、次のような適応の決定を可能にすることを目指しています。

ビデオ会議

  • 多数の参加者との通話中に、同時に表示される動画フィードの数を調整します。
  • 動画処理の品質(動画の解像度、1 秒あたりのフレーム数)を下げます。
  • 一部のカメラフィルタなど、重要でない動画処理をスキップする。
  • WebRTC ノイズ サプレッションなど、重要でない音声処理を無効にします。
  • 動画と音声のエンコード(WebRTC、WebCodecs、ソフトウェア エンコード)では、品質と速度、サイズと速度のノブを「速度」に合わせます。

ビデオゲーム

  • 低品質のアセットを使用して、ゲームの動画(3D モデル、テクスチャ、シェーダー)と音声(音声、効果音)を作成します。
  • 重要性の低いディテールを表現する効果を無効にする(水、布、火災のアニメーション、肌の輝度、グレア効果、ゲームプレイに影響しない物理シミュレーションなど)。
  • ゲームのレンダリング エンジンにおける品質と速度のつまみ(シャドウの品質、テクスチャのフィルタリング、視距離)を微調整します。

技術的には、サイトで使用しているメインスレッドとワーカーの熱状態(システムがパッシブに冷却されているかなど)と CPU 圧力の状態を把握することで実現できます。システムの熱状態はグローバルな状態であり、観測サイト以外のアプリやサイトの影響を受ける可能性があります。

インターフェース

Compute Pressure API は、次のコンテキストで実行できます。

  • ウィンドウまたはメインスレッド
  • 専用のワーカー
  • 共有ワーカー

Compute Pressure API では、2 つの新しいインターフェースが定義されています。

PressureObserver: 事前定義されたサンプル間隔で任意の数のソースのコンピューティング プレッシャーをモニタリングするオブジェクト。Chromium の最初の反復処理では、"cpu"source として公開されます。詳しくは、パラメータのセクションをご覧ください。各オブザーバーは、システムの圧力変化の傾向を非同期で監視できます。

PressureRecord: 転移の特定の瞬間における圧力の傾向を表します。このタイプのオブジェクトは、PressureObserver コールバックへの入力として、または PressureObserver インスタンスの takeRecords() メソッドを呼び出す 2 つの方法で取得できます。

PressureObserver

PressureObserver オブジェクトが作成されると、サポートされているソースのプレッシャーを特定のサンプル間隔で監視するように構成されます。PressureObserver オブジェクトの存続期間中は、サポートされているソースをいつでも個別に監視することも、監視しないようにすることもできます。オブジェクトの作成後にサンプリング間隔を変更することはできません。

コンストラクタ

PressureObserver(callback, options): 監視対象のソースの値の変更が検出されたときに、指定されたコールバック関数を呼び出す新しい PressureObserver オブジェクトを作成します。

コンストラクタは、必須のコールバック関数とオプションのオプションをパラメータとして受け取ります。

コールバック

callback(): コールバックは、未読の PressureRecord オブジェクトの配列で呼び出されます。

オプション

PressureObserverOptions: ユーザーが更新をリクエストするサンプル間隔 sampleInterval(ミリ秒単位)が含まれます。

Methods

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 が 2,000 ミリ秒の場合、最大で 2 秒ごとに更新が行われます。

リクエストしたサンプル間隔がシステムで処理できない場合。システムは、存在する最適な間隔でサンプルを提供します。たとえば、2,000 ミリ秒の間隔がリクエストされていて、システムが最大 1,000 ミリ秒のサンプルしか提供できない場合は、1,000 ミリ秒が選択されます。

圧力オブザーバーの使用

圧力オブザーバーを開始する方法は 1 つだけです。ソースごとに 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 でバグを報告します。可能な限り詳細な情報と、再現するための簡単な手順を記載し、[Components] ボックスに Blink>PerformanceAPIs>ComputePressure と入力します。

関連情報