API Compute Pressure

Soyez informé de la pression de calcul de votre système.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

L'API Compute Pressure propose des états généraux qui représentent la pression sur le système. Elle permet à la mise en œuvre d'utiliser les métriques matérielles sous-jacentes appropriées pour que les utilisateurs puissent profiter de toute la puissance de traitement à leur disposition, à condition que le système ne soit pas soumis à un stress ingérable.

État actuel

Step État
1. Créer une vidéo explicative Fin
2. Créer un brouillon initial de la spécification Fin
3. Recueillir des commentaires et itérer sur la conception En cours
4. Phase d'évaluation Terminé
5. Lancement Terminé (Chrome 125)

Essayer l'API Compute Pressure

Pour tester l'API Compute Pressure en local, consultez cette page.

S'inscrire à la phase d'évaluation

À partir de Chrome 115, l'API Compute Pressure est disponible en tant qu'phase d'évaluation. Elle devrait se terminer dans Chrome 123 (29 mai 2024). Inscrivez-vous ici.

Cas d'utilisation

Les principaux cas d'utilisation améliorés par l'API Compute Pressure actuelle sont la visioconférence et les jeux vidéo.

Ces applications en temps réel populaires sont classées comme des applications soft. Autrement dit, la qualité de service se dégrade si le système est utilisé au-delà de certains états, mais n'entraîne pas une défaillance totale du système. Ces applications douces en temps réel bénéficient grandement de leur capacité à adapter leurs charges de travail en fonction de la consommation ou de la pression du processeur.

Plus précisément, la première version de cette API vise à permettre les décisions d'adaptation suivantes.

Visioconférence

  • Ajustez le nombre de flux vidéo affichés simultanément lors d'appels avec de nombreux participants.
  • Réduire la qualité du traitement vidéo (résolution vidéo, images par seconde).
  • Ignorez les traitements vidéo non essentiels, tels que certains filtres d'appareil photo.
  • Désactivez le traitement audio non essentiel, comme la suppression du bruit WebRTC.
  • Tournez les boutons qualité/vitesse et taille/vitesse vers la "vitesse" dans l'encodage vidéo et audio (dans WebRTC, WebCodecs ou l'encodage logiciel).

Jeux vidéo

  • Utilisez des assets de qualité inférieure pour composer la vidéo (modèles 3D, textures, nuanceurs) et l'audio (voix, effets sonores) du jeu.
  • Désactivez les effets qui génèrent des détails non essentiels moins réalistes (eau, tissu, animations de feu, luminance de la peau, effets de reflet ou simulations physiques qui n'ont pas d'incidence sur la jouabilité).
  • Ajustez les commandes de qualité et de vitesse dans le moteur de rendu du jeu (qualité des ombres, filtrage de texture, distance d'affichage).

Techniquement, cela peut être accompli en connaissant les états thermiques (par exemple, si le système est refroidi de manière passive) et de pression du processeur pour le thread principal et les nœuds de calcul utilisés par le site. L'état thermique du système est un état global et peut être affecté par des applications et des sites autres que le site d'observation.

Interfaces

L'API Compute Pressure peut être exécutée dans les contextes suivants:

  • Fenêtre ou thread principal
  • Nœud de calcul dédié
  • Nœud de calcul partagé

L'API Compute Pressure définit deux nouvelles interfaces.

PressureObserver: objet permettant d'observer la pression de calcul d'un nombre illimité de sources à un intervalle d'échantillonnage prédéfini. La première itération dans Chromium expose "cpu" en tant que source. Pour en savoir plus, consultez la section sur les paramètres. Chaque observateur peut observer de manière asynchrone les tendances des changements de pression dans un système.

PressureRecord: décrit la tendance de pression à un moment spécifique de la transition. Les objets de ce type ne peuvent être obtenus que de deux manières: en tant qu'entrée de votre rappel PressureObserver, ou en appelant la méthode takeRecords() sur l'instance PressureObserver.

PressureObserver

Lorsqu'un objet PressureObserver est créé, il est configuré pour surveiller la pression des sources compatibles, à un intervalle d'échantillonnage donné. Les sources compatibles peuvent être observées individuellement ou non à tout moment pendant la durée de vie de l'objet PressureObserver. L'intervalle d'échantillonnage ne peut pas être modifié après la création de l'objet.

Constructeur

PressureObserver(callback, options): crée un objet PressureObserver qui appelle une fonction de rappel spécifiée lorsqu'il détecte qu'un changement dans les valeurs de la source observée s'est produit.

Le constructeur utilise une fonction de rappel obligatoire et des options facultatives comme paramètres.

Rappel

callback(): le rappel est appelé avec un tableau d'objets PressureRecord non lus.

Options

PressureObserverOptions: contient l'intervalle d'échantillonnage (sampleInterval, en millisecondes) auquel l'utilisateur demande des mises à jour.

Méthodes

PressureObserver.observe(source): indique à "PressureObserver" la source à observer.

PressureObserver.unobserve(source): demande à "PressureObserver" d'arrêter d'observer une source.

PressureObserver.disconnect(): demande à "PressureObserver" d'arrêter d'observer toutes les sources.

PressureObserver.takeRecords(): renvoie une séquence d'enregistrements depuis le dernier appel de rappel.

static PressureObserver.supportedSources() (lecture seule): renvoie les types de sources compatibles avec le matériel.

Paramètres

source: source à observer, par exemple "cpu". Il doit s'agir de l'un des types de sources compatibles.

Dans la version actuelle de Compute Pressure, seul "cpu" est pris en charge.

PressureRecord

L'interface PressureRecord de l'API Compute Pressure décrit l'évolution de la pression d'une source à un moment spécifique de la transition.

Propriétés de l'instance

PressureRecord.source (lecture seule): renvoie une chaîne représentant la source d'origine de l'enregistrement.

PressureRecord.state (lecture seule): affiche une chaîne représentant l'état de pression enregistré.

PressureRecord.time (lecture seule): renvoie un nombre représentant un horodatage haute résolution.

Exemples

L'API Compute Pressure est-elle compatible ?

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

Créer un observateur de pression

Créez l'observateur de pression en appelant son constructeur avec une fonction de rappel à exécuter chaque fois qu'une mise à jour de pression est effectuée:

const observer = new PressureObserver(
  (records) => { /* ... */ },
  { sampleInterval: 2000 }
);

Un intervalle d'échantillonnage de 2 000 ms (sampleInterval) signifie qu'il y aura des mises à jour au maximum toutes les deux secondes.

Si l'intervalle d'échantillonnage demandé ne peut pas être diffusé par le système. Le système fournit des échantillons à l'intervalle le plus approprié qui existe. Par exemple, si l'intervalle de 2 000 ms est demandé, mais que le système ne peut fournir des échantillons qu'à 1 000 ms au maximum, la valeur 1 000 ms sera sélectionnée.

Utiliser un observateur de pression

Il n'y a qu'une seule façon de démarrer un observateur de pression. Pour chaque appel source, observer.observe(source).

observer.observe("cpu");

Dans cet exemple, "cpu" est la source de pression qui nous intéresse. Pour l'instant, c'est la seule source disponible. Il est possible que d'autres sources soient disponibles à l'avenir, telles que "gpu", "power" ou "thermals".

Pour arrêter d'observer une source, utilisez la méthode unobserve(), comme dans l'exemple suivant:

observer.unobserve("cpu");

Pour désobserver toutes les sources en même temps, utilisez la méthode disconnect(), comme dans l'exemple suivant:

observer.disconnect();

Récupérer des enregistrements de pression

Les enregistrements de pression peuvent être récupérés à l'aide d'une fonction de rappel, qui sera invoquée chaque fois qu'un changement se produit dans l'état de pression.

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'utilisateur peut également forcer la lecture de PressureRecord en appelant la méthode takeRecords().

La méthode takeRecords() de l'interface PressureObserver renvoie un tableau d'objets PressureRecords stockés dans l'observateur de pression, ce qui le vide.

Le cas d'utilisation le plus courant consiste à récupérer immédiatement tous les enregistrements de pression en attente, qui n'ont pas encore été traités par la fonction de rappel de l'observateur, avant de déconnecter l'observateur, afin que tous les enregistrements en attente puissent être traités lors de l'arrêt de l'observateur.

L'appel de cette méthode efface la liste des enregistrements en attente, de sorte que le rappel n'est pas exécuté.

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

Décrivez-nous la conception de l'API.

Y a-t-il quelque chose dans l'API qui ne fonctionne pas comme prévu ? Voyez-vous une méthode ou une propriété manquante pour votre utilisation de l'API ? Signalez un problème de spécification ou commentez un problème existant dans le dépôt GitHub correspondant.

Signaler un problème d'implémentation

Avez-vous détecté un bug dans l'implémentation de Chromium ? Ou la mise en œuvre est-elle différente des spécifications ? Signalez un bug à l'adresse new.crbug.com. Veillez à inclure autant de détails que possible et des instructions simples pour reproduire le problème, puis saisissez Blink>PerformanceAPIs>ComputePressure dans la zone Composants.

Liens utiles