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

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 deteriora 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 visualizzati contemporaneamente durante le chiamate con molti 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 qualita/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, mesh) e audio (voci, effetti sonori) del gioco.
  • Disattiva gli effetti che generano 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à delle ombre, filtro delle texture, distanza di visualizzazione).

Tecnicamente, questi obiettivi possono essere raggiunti 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 dei cambiamenti di 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 per osservare la pressione delle origini supportate, in un determinato intervallo di esempio. Le origini supportate possono essere osservate singolarmente o non osservate in qualsiasi momento durante il ciclo di vita dell'oggetto PressureObserver. L'intervallo di esempio non può essere modificato dopo la creazione dell'oggetto.

Costruttore

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

Il costruttore prende come parametri una funzione di callback obbligatoria e opzioni facoltative.

Richiamata

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

Opzioni

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

Metodi

PressureObserver.observe(source): indica a "PressureObservationr" la fonte da osservare.

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

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

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

static PressureObserver.supportedSources() (sola lettura): restituisce i tipi di origine supportati dall'hardware.

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 fonte 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

L'API Compute Pressure è supportata?

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

Creare 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) => { /* ... */ },
  { sampleInterval: 2000 }
);

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. Il sistema fornirà i campioni all'intervallo migliore adeguato 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 il valore 1000 ms.

Utilizzare un osservatore della pressione

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

observer.observe("cpu");

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

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 nell'esempio seguente:

observer.disconnect();

Recupero dei dati sulle pressioni

I record di pressione possono essere recuperati con una funzione di callback, che viene richiamata ogni volta che viene apportata una modifica allo 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, { sampleInterval: 1000 });
await observer.observe("cpu");

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

Il metodo takeRecords() dell'interfaccia PressureObserver restituisce un array di PressureRecords oggetti 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 disconnettere l'osservatore, in modo che eventuali record in sospeso possano essere elaborati quando si arresta l'osservatore.

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

const observer = new PressureObserver(
  (records) => { /* Do something with records. */ },
  { sampleInterval: 1000 }
);

await observer.observe("cpu");

setTimeout(() => {
  // Forced records reading.
  const records = observer.takeRecords();
  observer.disconnect();
  // Do something with last records if any.
}, 2000);

Parlaci della progettazione dell'API

C'è qualcosa nell'API che non funziona come previsto? Vedi qualche metodo o proprietà mancante per il tuo utilizzo dell'API? Registra un problema di specifica o commentane uno esistente 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 di dettagli possibile, semplici istruzioni per la riproduzione e inserisci Blink>PerformanceAPIs>ComputePressure nella casella Componenti.

Link utili