Compute Pressure API

Informationen zum Rechenbedarf Ihres Systems

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

Die Compute Pressure API bietet übergeordnete Status, die den Druck auf das System darstellen. So können bei der Implementierung die richtigen zugrunde liegenden Hardwaremesswerte verwendet werden, damit Nutzer die gesamte verfügbare Rechenleistung nutzen können, solange das System nicht übermäßig belastet wird.

Aktueller Status

Schritt Status
1. Erläuternde Mitteilung erstellen Abschließen
2. Ersten Entwurf der Spezifikation erstellen Abschließen
3. Feedback einholen und Design iterieren In Bearbeitung
4. Ursprungstest Abgeschlossen
5. Launch Abgeschlossen (Chrome 125)

Compute Pressure API testen

Informationen zum lokalen Testen der Compute Pressure API finden Sie auf dieser Seite.

Für den Ursprungstest registrieren

Ab Chrome 115 ist die Compute Pressure API als Ursprungstest verfügbar. Er wird voraussichtlich in Chrome 123 (29. Mai 2024) eingestellt. Registrieren Sie sich für den Ursprungstest.

Anwendungsfälle

Die wichtigsten Anwendungsfälle, die durch die aktuelle Compute Pressure API verbessert werden, sind Videokonferenzen und Videospiele.

Diese beliebten Echtzeitanwendungen werden als weich eingestuft. Das heißt, die Dienstqualität verschlechtert sich, wenn das System über bestimmte Zustände hinaus belastet wird, führt aber nicht zu einem vollständigen Systemausfall. Diese Anwendungen mit weicher Echtzeit profitieren erheblich davon, dass ihre Arbeitslasten anhand des CPU-Verbrauchs oder der CPU-Belastung angepasst werden können.

Insbesondere soll mit der ersten Version dieser API die Möglichkeit bestehen, die folgenden Anpassungsentscheidungen zu treffen.

Videokonferenzsysteme

  • Sie können die Anzahl der Videofeeds anpassen, die bei Anrufen mit vielen Teilnehmern gleichzeitig angezeigt werden.
  • Qualität der Videoverarbeitung reduzieren (Videoauflösung, Frames pro Sekunde)
  • Nicht notwendige Videoverarbeitung überspringen, z. B. einige Kamerafilter
  • Deaktivieren Sie nicht notwendige Audioverarbeitung, z. B. die WebRTC-Geräuschunterdrückung.
  • Stellen Sie die Regler für Qualität und Geschwindigkeit sowie Größe und Geschwindigkeit bei der Video- und Audiocodierung (in WebRTC, WebCodecs oder Softwarecodierung) auf „Geschwindigkeit“.

Videospiele

  • Verwenden Sie Assets mit niedrigerer Qualität, um das Video (3D-Modelle, Texturen, Shader) und den Audioinhalt (Stimmen, Soundeffekte) des Spiels zu erstellen.
  • Deaktivieren Sie Effekte, die zu weniger realistischen, nicht wesentlichen Details führen (Wasser, Stoff, Feueranimationen, Hauthelligkeit, Blendeffekte oder physikalische Simulationen, die sich nicht auf das Gameplay auswirken).
  • Passen Sie die Qualität und Geschwindigkeit in der Rendering-Engine des Spiels an (Schattenqualität, Texturfilterung, Sichtweite).

Technisch gesehen ist dies möglich, wenn Sie die Temperatur (z. B. wird das System passiv gekühlt) und den CPU-Druckstatus für den Haupt-Thread und die Worker kennen, die von der Website verwendet werden. Der thermische Systemstatus ist ein globaler Status und kann von Apps und Websites beeinflusst werden, die nicht die beobachtete Website sind.

Interfaces

Die Compute Pressure API kann in den folgenden Kontexten ausgeführt werden:

  • Fenster oder Hauptthread
  • Dedizierter Worker
  • Shared Worker

Die Compute Pressure API definiert zwei neue Schnittstellen.

PressureObserver: Ein Objekt, mit dem der Rechendruck einer beliebigen Anzahl von Quellen in einem vordefinierten Stichprobenintervall beobachtet werden kann. In der ersten Iteration in Chromium wird "cpu" als source angezeigt. Weitere Informationen finden Sie im Abschnitt Parameter. Jeder Beobachter kann asynchron Trends bei Druckänderungen in einem System beobachten.

PressureRecord: Beschreibt den Drucktrend zu einem bestimmten Zeitpunkt der Umwandlung. Objekte dieses Typs können nur auf zwei Arten abgerufen werden: als Eingabe für Ihren PressureObserver-Callback oder durch Aufrufen der takeRecords()-Methode auf der PressureObserver-Instanz.

PressureObserver

Wenn ein PressureObserver-Objekt erstellt wird, wird es so konfiguriert, dass es den Druck unterstützter Quellen in einem bestimmten Stichprobenintervall überwacht. Die unterstützten Quellen können während der Lebensdauer des PressureObserver-Objekts jederzeit einzeln beobachtet oder nicht beobachtet werden. Das Stichprobenintervall kann nach dem Erstellen des Objekts nicht mehr geändert werden.

Konstruktor

PressureObserver(callback): Erstellt ein neues PressureObserver-Objekt, das eine angegebene Rückruffunktion aufruft, wenn eine Änderung an den Werten der beobachteten Quelle erkannt wird.

Der Konstruktor nimmt eine obligatorische Callback-Funktion an.

Rückruf

callback(): Der Rückruf wird mit einem Array von ungelesenen PressureRecord-Objekten aufgerufen.

Methoden

PressureObserver.observe(source, options): Gibt dem „PressureObserver“ an, welche Quelle beobachtet werden soll, und optional options als Parameter.

Optionen

PressureObserverOptions: Enthält das Stichprobenintervall sampleInterval in Millisekunden, in dem der Nutzer Aktualisierungen anfordert.

PressureObserver.unobserve(source): Hiermit wird dem „PressureObserver“ mitgeteilt, dass er die Beobachtung einer Quelle beenden soll.

PressureObserver.disconnect(): Hiermit wird dem „PressureObserver“ mitgeteilt, die Beobachtung aller Quellen zu beenden.

PressureObserver.takeRecords(): Gibt eine Sequenz von Eintragselementen seit der letzten Rückrufausführung zurück.

static PressureObserver.knownSources() (Lesezugriff): Gibt die bekannten Quelltypen des User-Agents in alphabetischer Reihenfolge zurück.

Parameter

source: Die zu beobachtende Quelle, z. B. "cpu". Dies muss einer der unterstützten Quelltypen sein.

In der aktuellen Version von „Compute Pressure“ wird nur "cpu" unterstützt.

PressureRecord

Die PressureRecord-Schnittstelle der Compute Pressure API beschreibt den Drucktrend einer Quelle zu einem bestimmten Übergangszeitpunkt.

Instanzattribute

PressureRecord.source (schreibgeschützt): Gibt einen String zurück, der die Herkunftsquelle des Datensatzes darstellt.

PressureRecord.state (Lesezugriff): Gibt einen String zurück, der den aufgezeichneten Druckstatus darstellt.

PressureRecord.time (schreibgeschützt): Gibt eine Zahl zurück, die einen Zeitstempel mit hoher Auflösung darstellt.

Beispiele

In den folgenden Abschnitten finden Sie beispielhafte Anwendungsfälle.

API-Support ermitteln

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

Drucksensor erstellen

Erstellen Sie den Druckbeobachter, indem Sie seinen Konstruktor mit einer Callback-Funktion aufrufen, die jedes Mal ausgeführt wird, wenn es eine Druckaktualisierung gibt:

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

Verwendung des Drucksensors

Es gibt nur eine Möglichkeit, einen Drucksensor zu starten. Rufe für jede Quelle observer.observe(source) auf.

observer.observe("cpu" { sampleInterval: 2_000 });

In diesem Beispiel ist die "cpu" die Druckquelle, für die wir uns interessieren. Derzeit ist dies die einzige verfügbare Quelle. In Zukunft werden möglicherweise weitere Quellen wie "gpu", "power" oder "thermals" hinzukommen.

Bei einem Stichprobenintervall (sampleInterval) von 2.000 Millisekunden werden maximal alle zwei Sekunden Aktualisierungen durchgeführt.

Wenn das angeforderte Stichprobenintervall vom System nicht bereitgestellt werden kann, stellt das System Stichproben im bestmöglichen Intervall bereit. Wenn beispielsweise ein Intervall von 2.000 ms angefordert wird, das System aber nur Daten mit maximal 1.000 ms liefern kann, wird 1.000 ms ausgewählt.

Wenn Sie die Beobachtung einer Quelle beenden möchten, verwenden Sie die Methode unobserve(), wie im folgenden Beispiel gezeigt:

observer.unobserve('cpu');

Wenn Sie die Beobachtung aller Quellen gleichzeitig aufheben möchten, verwenden Sie die Methode disconnect(), wie im folgenden Beispiel gezeigt:

observer.disconnect();

Druckdatensätze abrufen

Druckdatensätze können mit einer Rückruffunktion abgerufen werden, die jedes Mal aufgerufen wird, wenn sich der Druckstatus ändert.

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

Der Nutzer kann das Lesen von PressureRecord auch erzwingen, indem er die Methode takeRecords() aufruft.

Die takeRecords()-Methode der PressureObserver-Schnittstelle gibt ein Array von PressureRecords-Objekten zurück, die im Drucksensor gespeichert sind, und leert ihn.

Der häufigste Anwendungsfall hierfür ist das sofortige Abrufen aller ausstehenden Druckdatensätze, die noch nicht von der Callback-Funktion des Beobachters verarbeitet wurden, bevor die Verbindung zum Beobachter getrennt wird. So können alle ausstehenden Datensätze beim Herunterfahren des Beobachters verarbeitet werden.

Durch Aufrufen dieser Methode wird die Liste der ausstehenden Einträge geleert, sodass der Callback nicht ausgeführt wird.

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

Feedback geben

Funktioniert die API nicht wie erwartet? Fehlt bei der Nutzung der API eine Methode oder ein Attribut? Reichen Sie ein Problem mit der Spezifikation ein oder kommentieren Sie ein vorhandenes Problem im entsprechenden GitHub-Repository.

Problem mit der Implementierung melden

Haben Sie einen Fehler in der Chromium-Implementierung gefunden? Oder unterscheidet sich die Implementierung von der Spezifikation? Melden Sie den Fehler unter new.crbug.com. Geben Sie so viele Details wie möglich an, eine Anleitung zur Reproduktion und geben Sie Blink> PerformanceAPIs> ComputePressure in das Feld Components ein.

Ressourcen