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): モニタリング対象のソースの値の変更が検出されたときに、指定されたコールバック関数を呼び出す新しい PressureObserver オブジェクトを作成します。

コンストラクタは、必須のコールバック関数を受け取ります。

コールバック

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

メソッド

PressureObserver.observe(source, options): 監視するソースとオプションの options をパラメータとして「PressureObserver」に指示します。

オプション

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) => {
  /* ... */
});

圧力オブザーバーの使用

圧力オブザーバーを開始する方法は 1 つだけです。ソースごとに observer.observe(source) を呼び出します。

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

この例では、"cpu" が目的の圧力ソースです。現時点では、利用可能な唯一のソースです。将来的には、"gpu""power""thermals" などの他のソースが存在する可能性があります。

サンプル間隔 sampleInterval が 2,000 ミリ秒の場合、最大で 2 秒ごとに更新が行われます。

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

ソースの監視を停止するには、次の例のように 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 と入力します。

リソース