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

ビデオ会議

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

ビデオゲーム

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

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

インターフェース

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

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

Compute Pressure API は、2 つの新しいインターフェースを定義します。

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

PressureRecord: 遷移の特定の時点での圧力トレンドを表します。このタイプのオブジェクトは、PressureObserver コールバックへの入力として、または PressureObserver インスタンスで takeRecords() メソッドを呼び出すことでのみ取得できます。

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 でバグを報告します。できるだけ詳細な情報と再現手順を記載し、[コンポーネント] ボックスに [Blink>PerformanceAPIs>ComputePressure] と入力します。

リソース