Berekeningsdruk-API

Blijf op de hoogte van de computerdruk van uw systeem.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

De Compute Pressure API biedt statussen op hoog niveau die de druk op het systeem vertegenwoordigen. Het maakt het voor de implementatie mogelijk om de juiste onderliggende hardware-metrieken te gebruiken om ervoor te zorgen dat gebruikers kunnen profiteren van alle beschikbare verwerkingskracht, zolang het systeem niet onder onbeheersbare stress staat.

Huidige status

Stap Status
1. Maak een uitleg Compleet
2. Maak een eerste ontwerp van specificatie Compleet
3. Verzamel feedback en herhaal het ontwerp In uitvoering
4. Oorsprongsproces Compleet
5. Lancering Compleet (Chroom 125)

Probeer de Compute Pressure-API

Lees deze pagina om lokaal met de Compute Pressure API te experimenteren.

Meld u aan voor de origin-proefperiode

Vanaf Chrome 115 is de Compute Pressure API beschikbaar als origin-proefversie . De verwachting is dat het eindigt in Chrome 123 (29 mei 2024). Meld u aan voor de origin-proefperiode .

Gebruiksscenario's

De belangrijkste gebruiksscenario's die door de huidige Compute Pressure API worden verbeterd, zijn videoconferenties en videogames.

Deze populaire real-time applicaties worden geclassificeerd als soft . Dat wil zeggen dat de kwaliteit van de dienstverlening afneemt als het systeem buiten bepaalde toestanden wordt uitgeoefend, maar dit leidt niet tot een totaal falen van het systeem. Deze zachte real-time applicaties profiteren enorm van de mogelijkheid om hun werklast aan te passen op basis van CPU-verbruik of -druk.

Concreet heeft de eerste versie van deze API tot doel de volgende aanpassingsbeslissingen mogelijk te maken.

Videoconferenties

  • Pas het aantal videofeeds aan dat tegelijkertijd wordt weergegeven tijdens gesprekken met veel deelnemers.
  • Verminder de kwaliteit van de videoverwerking (videoresolutie, frames per seconde).
  • Sla niet-essentiële videoverwerking over, zoals sommige camerafilters.
  • Schakel niet-essentiële audioverwerking uit, zoals WebRTC-ruisonderdrukking.
  • Draai de knoppen voor kwaliteit versus snelheid en grootte versus snelheid naar 'snelheid' bij video- en audiocodering (in WebRTC, WebCodecs of softwarecodering).

Videogames

  • Gebruik middelen van lagere kwaliteit om de video (3D-modellen, texturen, shaders) en audio (stemmen, geluidseffecten) van de game samen te stellen.
  • Schakel effecten uit die resulteren in minder realistische, niet-essentiële details (water, stof, vuuranimaties, helderheid van de huid, verblindingseffecten of fysieke simulaties die geen invloed hebben op de gameplay).
  • Pas de kwaliteit-versus-snelheid-knoppen aan in de rendering-engine van de game (kwaliteit van schaduwen, textuurfiltering, kijkafstand).

Technisch gezien kunnen deze worden bereikt door de thermische status (bijvoorbeeld of het systeem passief wordt gekoeld) en de CPU-drukstatus te kennen voor de hoofdleiding en de werknemers die de locatie gebruikt. De thermische toestand van het systeem is een mondiale toestand en kan worden beïnvloed door andere apps en sites dan de waarneemlocatie.

Interfaces

De Compute Pressure API kan in de volgende contexten worden uitgevoerd:

  • Venster of hoofddraad
  • Toegewijde werker
  • Gedeelde werknemer

De Compute Pressure API definieert twee nieuwe interfaces.

PressureObserver : een object om de rekendruk van een willekeurig aantal bronnen te observeren met een vooraf gedefinieerd monsterinterval. Bij de eerste iteratie in Chromium wordt "cpu" als source weergegeven. Zie het gedeelte over parameters voor meer details. Elke waarnemer kan asynchroon trends in drukveranderingen in een systeem waarnemen.

PressureRecord : Beschrijft de druktrend op een specifiek overgangsmoment. Objecten van dit type kunnen slechts op twee manieren worden verkregen: als invoer voor uw PressureObserver-callback, of door de methode takeRecords() aan te roepen op de PressureObserver instantie.

Drukwaarnemer

Wanneer een PressureObserver object wordt gemaakt, wordt het geconfigureerd om de druk van ondersteunde bronnen te bekijken, met een bepaald monsterinterval. De ondersteunde bronnen kunnen op elk moment tijdens de levensduur van het PressureObserver object afzonderlijk worden waargenomen of niet worden waargenomen. Het monsterinterval kan niet worden gewijzigd nadat het object is gemaakt.

Constructeur

PressureObserver(callback) : Creëert een nieuw PressureObserver object dat een gespecificeerde callback-functie zal aanroepen wanneer het detecteert dat er een verandering in de waarden van de waargenomen bron heeft plaatsgevonden.

De constructor gebruikt een verplichte callback- functie.

Terugbellen

callback() : De callback wordt aangeroepen met een array van ongelezen PressureRecord objecten.

Methoden

PressureObserver.observe(source, options) : Vertelt de 'PressureObserver' welke bron moet worden geobserveerd en optionele options , als parameters.

Opties

PressureObserverOptions : Bevat het monsterinterval, sampleInterval in milliseconden, waarop de gebruiker om updates vraagt.

PressureObserver.unobserve(source) : Vertelt de 'PressureObserver' om te stoppen met het observeren van een bron.

PressureObserver.disconnect() : Vertelt de 'PressureObserver' om te stoppen met het observeren van alle bronnen.

PressureObserver.takeRecords() : Retourneert een reeks records sinds de laatste callback-aanroep.

static PressureObserver.knownSources() (alleen-lezen): retourneert de bekende brontypen van de user-agent in alfabetische volgorde.

Parameters

source : De te observeren bron, bijvoorbeeld "cpu" . Dit moet een van de ondersteunde brontypen zijn.

In de huidige versie van Compute Pressure wordt alleen "cpu" ondersteund.

Drukrecord

De PressureRecord interface van de Compute Pressure API beschrijft de druktrend van een bron op een specifiek transitiemoment.

Instantie-eigenschappen

PressureRecord.source (alleen-lezen): Retourneert een tekenreeks die de oorspronkelijke bron vertegenwoordigt waarvan de record afkomstig is.

PressureRecord.state (alleen-lezen): Retourneert een tekenreeks die de geregistreerde drukstatus vertegenwoordigt.

PressureRecord.time (alleen-lezen): Retourneert een getal dat een tijdstempel met hoge resolutie vertegenwoordigt.

Voorbeelden

In de volgende secties vindt u voorbeeldgebruiksvoorbeelden.

Bepaal API-ondersteuning

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

Creëer een drukwaarnemer

Creëer de drukwaarnemer door de constructor ervan aan te roepen met een callback-functie die moet worden uitgevoerd wanneer er een drukupdate is:

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

Gebruik van de drukwaarnemer

Er is maar één manier om een ​​drukwaarnemer te starten. Roep voor elke bron observer.observe(source) aan.

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

In dit voorbeeld is de "cpu" de drukbron waarin we geïnteresseerd zijn. Voorlopig is dit de enige beschikbare bron. In de toekomst kunnen er andere bronnen zijn, zoals "gpu" , "power" of "thermals" .

Een bemonsteringsinterval, sampleInterval , van 2000 ms betekent dat er maximaal elke twee seconden updates plaatsvinden.

Als het gevraagde monsterinterval niet door het systeem kan worden uitgevoerd, zal het systeem monsters leveren met het best geschikte interval dat bestaat. Als er bijvoorbeeld om een ​​interval van 2000 ms wordt verzocht, maar het systeem alleen monsters kan leveren op maximaal 1000 ms, wordt 1000 ms geselecteerd.

Om het observeren van een bron te stoppen, gebruikt u de methode unobserve() , zoals in het volgende voorbeeld:

observer.unobserve('cpu');

Om alle bronnen tegelijk niet meer te observeren, gebruikt u de methode disconnect() , zoals in het volgende voorbeeld:

observer.disconnect();

Drukgegevens ophalen

Drukrecords kunnen worden opgehaald met een callback-functie, die wordt geactiveerd telkens wanneer er een verandering plaatsvindt in de drukstatus.

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

De gebruiker kan het lezen van PressureRecord ook forceren door de methode takeRecords() aan te roepen.

De takeRecords() methode van de PressureObserver interface retourneert een array van PressureRecords objecten die zijn opgeslagen in de drukwaarnemer, waardoor deze wordt leeggemaakt.

De meest gebruikelijke toepassing hiervoor is het onmiddellijk ophalen van alle in behandeling zijnde drukrecords, die nog niet zijn verwerkt door de terugbelfunctie van de waarnemer, voordat de verbinding met de waarnemer wordt verbroken, zodat alle in behandeling zijnde records kunnen worden verwerkt bij het afsluiten van de waarnemer.

Als u deze methode aanroept, wordt de lijst met openstaande records gewist, zodat de callback niet wordt uitgevoerd.

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

Deel uw feedback

Is er iets aan de API dat niet werkt zoals je had verwacht? Ziet u een ontbrekende methode of eigenschap voor uw gebruik van de API? Dien een specificatieprobleem in of geef commentaar op een bestaand probleem in de overeenkomstige GitHub-opslagplaats .

Meld een probleem met de implementatie

Heb je een bug gevonden in de implementatie van Chromium? Of wijkt de uitvoering af van de specificaties? Dien een bug in op new.crbug.com . Zorg ervoor dat u zoveel mogelijk details en instructies voor het reproduceren opneemt en voer Blink>PerformanceAPIs>ComputePressure in het vak Componenten in.

Bronnen