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 exercée sur le système. Elle permet à la mise en œuvre d'utiliser les métriques matérielles sous-jacentes appropriées pour garantir aux utilisateurs de profiter de toute la puissance de traitement dont ils disposent, à condition que le système ne soit pas soumis à une contrainte 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é(e)
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). S'inscrire à la phase d'évaluation

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 ont tout intérêt à pouvoir 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" pour l'encodage vidéo et audio (dans WebRTC, WebCodecs ou 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'affectent pas le gameplay).
  • Ajustez les commandes de qualité et de vitesse dans le moteur de rendu du jeu (qualité des ombres, filtrage des textures, 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 de transition spécifique. Les objets de ce type ne peuvent être obtenus que de deux manières: en tant qu'entrée dans 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): 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.

Rappel

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

Méthodes

PressureObserver.observe(source, options): indique à "PressureObserver" la source à observer et le options facultatif, en tant que paramètres.

Options

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

PressureObserver.unobserve(source): indique à "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.knownSources() (lecture seule): renvoie les types de sources connus du user-agent dans l'ordre alphabétique.

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

Les sections suivantes répertorient des exemples d'utilisation.

Déterminer la compatibilité de l'API

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 pression est mise à jour:

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

Utilisation de l'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" { sampleInterval: 2_000 });

Dans cet exemple, "cpu" est la source de pression qui nous intéresse. Pour le moment, il s'agit de la seule source disponible. À l'avenir, il se peut que d'autres sources soient disponibles, telles que "gpu", "power" ou "thermals".

Un exemple d'intervalle (sampleInterval) de 2 000 ms 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, celui-ci fournit des échantillons à l'intervalle le plus approprié qui existe. Par exemple, si un 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.

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 les 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);
await observer.observe('cpu', { sampleInterval: 1_000 });

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, de sorte que tous les enregistrements en attente puissent être traités lors de la désactivation 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. */
});

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

Envoyer des commentaires

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 l'implémentation est-elle différente des spécifications ? Signalez un bug à l'adresse new.crbug.com. Veillez à inclure autant de détails que possible, ainsi que des instructions pour reproduire le problème, et saisissez Blink>PerformanceAPIs>ComputePressure dans la zone Composants.

Ressources