API Compute Pressure

Ricevi informazioni sulla pressione di calcolo del tuo sistema.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

L'API Compute Pressure offre stati di alto livello che rappresentano la pressione sul sistema. Consente all'implementazione di utilizzare le giuste metriche hardware di base per garantire che gli utenti possano sfruttare tutta la potenza di elaborazione a loro disposizione, purché il sistema non sia sotto stress ingestibile.

Stato attuale

Passaggio Stato
1. Crea messaggio esplicativo Completato
2. Crea una bozza iniziale della specifica Completato
3. Raccogli feedback e ottimizza il design In corso
4. Prova dell'origine Completo
5. Lancio Completata (Chrome 125)

Prova l'API Compute Pressure

Per sperimentare con l'API Compute Pressure in locale, leggi questa pagina.

Registrati per la prova dell'origine

A partire da Chrome 115, l'API Compute Pressure è disponibile come prova dell'origine. Dovrebbe terminare con Chrome 123 (29 maggio 2024). Registrati per la prova dell'origine.

Casi d'uso

I casi d'uso principali migliorati dall'attuale API Compute Pressure sono le videoconferenze e i videogiochi.

Queste popolari applicazioni in tempo reale sono classificate come soft. In altre parole, la qualità del servizio si riduce se il sistema viene utilizzato al di fuori di determinati stati, ma non comporta un guasto totale del sistema. Queste applicazioni soft in tempo reale traggono grande vantaggio dalla capacità di adattare i carichi di lavoro in base al consumo o alla pressione della CPU.

In particolare, la prima versione di questa API mira a consentire le seguenti decisioni di adattamento.

Videoconferenze

  • Regola il numero di feed video mostrati contemporaneamente durante chiamate con più partecipanti.
  • Ridurre la qualità dell'elaborazione video (risoluzione video, frame al secondo).
  • Ignora l'elaborazione video non essenziale, ad esempio alcuni filtri della videocamera.
  • Disattiva l'elaborazione audio non essenziale, come la soppressione del rumore WebRTC.
  • Sposta le manopole qualità/velocità e dimensione/velocità verso la "velocità" nella codifica video e audio (in WebRTC, WebCodecs o codifica software).

Videogiochi

  • Utilizza asset di qualità inferiore per comporre il video (modelli 3D, texture, shader) e audio (voci, effetti sonori) del gioco.
  • Disattiva gli effetti che producono dettagli non essenziali meno realistici (acqua, tessuti, animazioni di fuoco, luminanza della pelle, effetti di riflessi o simulazioni fisiche che non incidono sul gameplay).
  • Modifica le manopole di qualità e velocità nel motore di rendering del gioco (qualità ombre, filtro delle texture, distanza di visualizzazione).

Tecnicamente, è possibile raggiungere questi obiettivi conoscendo gli stati di pressione della CPU (ad esempio, il sistema viene raffreddato passivamente) per il thread principale e i worker utilizzati dal sito. Lo stato termico del sistema è uno stato globale e può essere influenzato da app e siti diversi dal sito di osservazione.

Interfacce

L'API Compute Pressure può essere eseguita nei seguenti contesti:

  • Finestra o thread principale
  • Worker dedicato
  • Worker condiviso

L'API Compute Pressure definisce due nuove interfacce.

PressureObserver: un oggetto per osservare la pressione di calcolo di un numero qualsiasi di origini a un intervallo di campionamento predefinito. La prima iterazione in Chromium mostra "cpu" come source. Per ulteriori dettagli, consulta la sezione sui parametri. Ogni osservatore può osservare in modo asincrono le tendenze delle variazioni della pressione in un sistema.

PressureRecord: descrive la tendenza della pressione in un momento specifico di transizione. Gli oggetti di questo tipo possono essere ottenuti solo in due modi: come input per il callback PressureObservationr o chiamando il metodo takeRecords() sull'istanza PressureObserver.

PressureObserver

Quando viene creato un oggetto PressureObserver, è configurato in modo da osservare la pressione delle origini supportate in un determinato intervallo di esempio. Le origini supportate possono essere osservate o non osservate singolarmente in qualsiasi momento durante il ciclo di vita dell'oggetto PressureObserver. L'intervallo di campionamento non può essere modificato dopo la creazione dell'oggetto.

Costruttore

PressureObserver(callback): crea un nuovo oggetto PressureObserver che evoca una funzione di callback specificata quando rileva che si è verificata una modifica nei valori dell'origine osservata.

Il costruttore accetta una funzione di callback obbligatoria.

Richiamata

callback(): il callback viene chiamato con un array di oggetti PressureRecord da leggere.

Metodi

PressureObserver.observe(source, options): indica a "PressureObservationr" quale fonte osservare e options facoltativa come parametri.

Opzioni

PressureObserverOptions: contiene l'intervallo di campionamento, sampleInterval in millisecondi, in cui l'utente richiede gli aggiornamenti.

PressureObserver.unobserve(source): comunica a "PressureHighlightr" di interrompere l'osservazione di una fonte.

PressureObserver.disconnect(): indica a "PressureObservationr" di interrompere l'osservazione di tutte le fonti.

PressureObserver.takeRecords(): restituisce una sequenza di record, dall'ultima chiamata di callback.

static PressureObserver.knownSources() (sola lettura): restituisce i tipi di origine noti dello user agent in ordine alfabetico.

Parametri

source: la sorgente da osservare, ad esempio "cpu". Deve essere uno dei tipi di origine supportati.

Nella versione attuale di Compute Pressure, è supportato solo "cpu".

PressureRecord

L'interfaccia PressureRecord dell'API Compute Pressure descrive l'andamento della pressione di una sorgente in un momento specifico della transizione.

Proprietà istanza

PressureRecord.source (sola lettura): restituisce una stringa che rappresenta l'origine di origine da cui proviene il record.

PressureRecord.state (sola lettura): restituisce una stringa che rappresenta lo stato di pressione registrato.

PressureRecord.time (sola lettura): restituisce un numero che rappresenta un timestamp ad alta risoluzione.

Esempi

Le seguenti sezioni elencano alcuni esempi di utilizzo.

Determinare il supporto delle API

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

Crea un osservatore della pressione

Crea l'osservatore della pressione chiamando il suo costruttore con una funzione di callback da eseguire ogni volta che si verifica un aggiornamento della pressione:

const observer = new PressureObserver((records) => {
  /* ... */
});

Utilizzo dell'osservatore della pressione

C'è solo un modo per avviare un osservatore della pressione. Per ogni chiamata di origine observer.observe(source).

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

In questo esempio, "cpu" è la fonte di pressione che ci interessa. Per il momento, è l'unica origine disponibile. In futuro, potrebbero esserci altre origini, come "gpu", "power" o "thermals".

Un intervallo di esempio, sampleInterval, di 2000 ms, indica che ci saranno aggiornamenti al massimo ogni due secondi.

Se l'intervallo di campionamento richiesto non può essere fornito dal sistema, quest'ultimo fornirà i campioni all'intervallo migliore esistente. Ad esempio, se viene richiesto un intervallo di 2000 ms, ma il sistema può fornire campioni solo a un massimo di 1000 ms, verrà selezionato 1000 ms.

Per interrompere l'osservazione di un'origine, usa il metodo unobserve(), come nell'esempio seguente:

observer.unobserve('cpu');

Per non osservare tutte le origini contemporaneamente, utilizza il metodo disconnect(), come nel seguente esempio:

observer.disconnect();

Recuperare i record di pressione

I record sulla pressione possono essere recuperati con una funzione di callback, che viene richiamata ogni volta che si verifica una modifica nello stato di pressione.

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 });

L'utente può anche forzare la lettura di PressureRecord chiamando il metodo takeRecords().

Il metodo takeRecords() dell'interfaccia PressureObserver restituisce un array di oggetti PressureRecords archiviati nell'osservatore della pressione, svuotandolo.

Il caso d'uso più comune è il recupero immediato di tutti i record di pressione in sospeso, non ancora elaborati dalla funzione di callback dell'osservatore, prima di scollegare l'osservatore, in modo che gli eventuali record in sospeso possano essere elaborati quando chiudi l'osservatore.

La chiamata a questo metodo cancella l'elenco dei record in attesa, quindi il callback non verrà eseguito.

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);

Condividi il tuo feedback

C'è qualcosa nell'API che non funziona come previsto? Vedi qualche metodo o proprietà mancante per il tuo utilizzo dell'API? Segnala un problema o un commento relativi alle specifiche esistenti nel repository GitHub corrispondente.

Segnala un problema con l'implementazione

Hai trovato un bug nell'implementazione di Chromium? Oppure l'implementazione è diversa dalle specifiche? Segnala un bug all'indirizzo new.crbug.com. Assicurati di includere il maggior numero possibile di dettagli e le istruzioni per la riproduzione e inserisci Blink>PerformanceAPIs>ComputePressure nella casella Componenti.

Risorse