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 casi d'uso principali migliorati dall'attuale API Compute Pressure sono le videoconferenze e i videogiochi.

Queste applicazioni in tempo reale molto diffuse sono classificate come soft. In altre parole, la qualità del servizio peggiora se il sistema viene utilizzato oltre determinati stati, ma non comporta un guasto totale del sistema. Queste applicazioni in tempo reale graduali beneficiano notevolmente della possibilità di adattare i loro carichi di lavoro in base al consumo o alla pressione della CPU.

Nello specifico, la prima versione di questa API ha lo scopo di 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 (modelli 3D, texture, shader) e l'audio (voci, effetti sonori) del gioco.
  • Disattiva gli effetti che rendono meno realistici i dettagli non essenziali (acqua, vestiti, animazioni di fuochi, illuminazione della pelle, effetti di abbagliamento 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, questi obiettivi possono essere raggiunti conoscendo gli stati termici (ad esempio se il sistema è raffreddato passivamente) e 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 al callback PressureObserver o chiamando 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 durante la 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 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 campionamento, sampleInterval in millisecondi, a cui l'utente richiede gli aggiornamenti.

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

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

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 essere 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.

Determinare il supporto dell'API

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

Crea 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 della 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 sorgente 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 campionamento, sampleInterval, di 2000 ms indica che ci saranno aggiornamenti al massimo ogni due secondi.

Se l'intervallo di campioni 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 annullare l'osservazione di 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 nell'API che non funziona come previsto? 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