API Compute Pressure

Ricevi informazioni sulla pressione di calcolo del 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 metriche hardware di base corrette per garantire che gli utenti possano sfruttare tutta la potenza di elaborazione a loro disposizione, a condizione che il sistema non sia sottoposto a uno stress incontrollabile.

Stato attuale

Passaggio Stato
1. Creare un'animazione esplicativa Completato
2. Creare una bozza iniziale della specifica Completato
3. Raccogli feedback e esegui l'iterazione sul design In corso
4. Prova dell'origine Completa
5. Lancio Completato (Chrome 125)

Prova l'API Compute Pressure

Per eseguire esperimenti con l'API Compute Pressure a livello 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 in Chrome 123 (29 maggio 2024). Registrati per la prova dell'origine.

Casi d'uso

I principali casi d'uso avanzati grazie all'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 peggiora se il sistema viene esercitato oltre determinati stati, ma non porta a un errore totale del sistema. Queste applicazioni software in tempo reale traggono grandi vantaggi dalla possibilità di adattare i carichi di lavoro in base al consumo o alla pressione della CPU.

In particolare, la prima versione di questa API mira ad abilitare le seguenti decisioni di adattamento.

Videoconferenze

  • Modificare il numero di feed video visualizzati contemporaneamente durante le chiamate con molti partecipanti.
  • Riduci la qualità dell'elaborazione video (risoluzione video, frame al secondo).
  • Salta l'elaborazione video non essenziale, ad esempio alcuni filtri della fotocamera.
  • Disattiva l'elaborazione audio non essenziale, ad esempio la soppressione del rumore WebRTC.
  • Regola i cursori della qualità rispetto alla velocità e delle dimensioni rispetto alla velocità in direzione di "Velocità" nella codifica video e audio (in WebRTC, WebCodecs o codifica software).

Videogiochi

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

Tecnicamente ciò può essere ottenuto conoscendo il livello termico (ad esempio se il sistema viene raffreddato passivamente) e gli stati di pressione della CPU 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 sorgenti a un intervallo di campionamento predefinito. La prima iterazione in Chromium espone "cpu" come source. Per ulteriori dettagli, consulta la sezione sui parametri. Ogni osservatore può osservare in modo asincrono le tendenze delle variazioni di pressione in un sistema.

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

PressureObserver

Quando viene creato un oggetto PressureObserver, viene configurato per monitorare la pressione delle sorgenti supportate a un determinato intervallo di campionamento. Le origini supportate possono essere osservate o non osservate singolarmente in qualsiasi momento per tutta la durata dell'oggetto PressureObserver. L'intervallo di esempio non può essere modificato dopo la creazione dell'oggetto.

Costruttore

PressureObserver(callback): crea un nuovo oggetto PressureObserver che invoca una funzione di callback specificata quando rileva una variazione dei valori della sorgente 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 "PressureObserver" quale fonte osservare e options facoltativo, come parametri.

Opzioni

PressureObserverOptions: contiene l'intervallo di esempio, sampleInterval in millisecondi, a cui l'utente richiede un aggiornamento.

PressureObserver.unobserve(source): indica a "PressureObserver" di interrompere l'osservazione di una sorgente.

PressureObserver.disconnect(): Chiede a "PressureObserver" di smettere di osservare tutte le fonti.

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

static PressureObserver.knownSources() (sola lettura): restituisce i tipi di origine noti dell'agente utente in ordine alfabetico.

Parametri

source: l'origine da osservare, ad esempio "cpu". Deve trattarsi di uno dei tipi di origine supportati.

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

PressureRecord

L'interfaccia PressureRecord dell'API Compute Pressure descrive la tendenza della pressione di un'origine in un determinato momento di transizione.

Proprietà istanza

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

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

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

Esempi

Le sezioni seguenti elencano esempi di utilizzo.

Supporto di determinate API

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

Creare un osservatore della pressione

Crea l'osservatore della pressione chiamando il relativo costruttore con una funzione di callback da eseguire ogni volta che viene eseguito un aggiornamento della pressione:

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

Utilizzo dell'osservatore di pressione

Esiste un solo 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 ora, è l'unica fonte disponibile. In futuro potrebbero essere disponibili altre origini, come "gpu", "power" o "thermals".

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

Se l'intervallo di campionamento richiesto non può essere fornito dal sistema, il sistema fornirà i campioni con l'intervallo più adatto esistente. Ad esempio, se viene richiesto un intervallo di 2000 ms, ma il sistema può fornire campioni solo con un massimo di 1000 ms, verranno selezionati 1000 ms.

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

observer.unobserve('cpu');

Per ignorare tutte le origini contemporaneamente, utilizza il metodo disconnect(), come nell'esempio seguente:

observer.disconnect();

Recuperare i record della pressione

I record della pressione possono essere recuperati con una funzione di callback, che verrà invocata ogni volta che si verifica una modifica dello stato della 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 memorizzati nell'osservatore della pressione, svuotandolo.

Il caso d'uso più comune è recuperare immediatamente tutti i record di pressione in attesa, non ancora elaborati dalla funzione di callback dell'osservatore, prima di scollegare l'osservatore, in modo che eventuali record in attesa possano essere elaborati al momento dell'arresto dell'osservatore.

La chiamata a questo metodo cancella l'elenco dei record in attesa, pertanto 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 che non funziona come ti aspettavi in merito all'API? Noti metodi o proprietà mancanti per l'utilizzo dell'API? Invia una segnalazione relativa alle specifiche o commenta una esistente nel repository GitHub corrispondente.

Segnalare un problema con l'implementazione

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

Risorse