API Compute Pressure

Informe-se sobre a press�o de computa��o do sistema.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

A API Compute Pressure oferece estados de alto n�vel que representam a press�o no sistema. Ele permite que a implementa��o use as m�tricas de hardware subjacentes corretas para garantir que os usu�rios possam aproveitar toda a capacidade de processamento dispon�vel, desde que o sistema n�o esteja sob estresse imposs�vel de gerenciar.

Status atual

Step Status
1. Criar explica��o Conclu�do
2. Criar rascunho inicial da especifica��o Conclu�do
3. Reunir feedbacks e iterar no design Em andamento
4. Teste de origem Completos
5. Lan�amento Conclu�do (Chrome 125)

Testar a API Compute Pressure

Para testar a API Compute Pressure localmente, leia esta p�gina.

Registrar-se no teste de origem

No Chrome 115, a API Compute Pressure est� dispon�vel como um teste de origem. Ela deve terminar no Chrome 123 (29 de maio de 2024). Inscreva-se no teste de origem.

Casos de uso

Os principais casos de uso aprimorados pela API Compute Pressure atual s�o videoconfer�ncias e videogames.

Esses aplicativos conhecidos em tempo real s�o classificados como soft. Ou seja, a qualidade do servi�o diminui se o sistema for exercido al�m de determinados estados, mas n�o leva a uma falha total do sistema. Esses aplicativos flex�veis em tempo real se beneficiam muito da capacidade de adaptar as cargas de trabalho com base no consumo ou na press�o da CPU.

Especificamente, a primeira vers�o dessa API visa permitir as seguintes decis�es de adapta��o.

Videoconfer�ncias

  • Ajuste o n�mero de feeds de v�deo mostrados simultaneamente durante chamadas com muitos participantes.
  • Reduza a qualidade do processamento de v�deo (resolu��o de v�deo, quadros por segundo).
  • Pule o processamento de v�deos n�o essenciais, como alguns filtros de c�mera.
  • Desative o processamento de �udio n�o essencial, como a supress�o de ru�do WebRTC.
  • Mude os bot�es de qualidade versus velocidade e tamanho versus velocidade em "velocidade" na codifica��o de v�deo e �udio (no WebRTC, WebCodecs ou codifica��o de software).

Videogames

  • Use recursos de qualidade mais baixa para compor o v�deo (modelos 3D, texturas, sombreadores) e o �udio (vozes e efeitos sonoros) do jogo.
  • Desative efeitos que resultem em detalhes n�o essenciais menos realistas, como �gua, pano, anima��es de fogo, lumin�ncia da pele, efeitos de reflexo ou simula��es f�sicas que n�o afetam a jogabilidade.
  • Ajustes de qualidade versus velocidade no mecanismo de renderiza��o do jogo (qualidade de sombras, filtragem de textura e dist�ncia de visualiza��o).

Tecnicamente, isso pode ser feito sabendo os estados t�rmico (por exemplo, o sistema est� sendo resfriado passivamente) e os estados de press�o da CPU para a linha de execu��o principal e os workers que o site est� usando. O estado t�rmico do sistema � um estado global e pode ser afetado por apps e sites diferentes do local de observa��o.

Interfaces

A API Compute Pressure pode ser executada nos seguintes contextos:

  • Linha de execu��o principal ou da janela
  • Worker dedicado
  • Worker compartilhado

A API Compute Pressure define duas novas interfaces.

PressureObserver: um objeto para observar a press�o de computa��o de qualquer n�mero de fontes em um intervalo de amostra predefinido. A primeira itera��o no Chromium exp�e "cpu" como source. Consulte a se��o sobre par�metros para mais detalhes. Cada observador pode observar de maneira ass�ncrona as tend�ncias de mudan�as de press�o em um sistema.

PressureRecord: descreve a tend�ncia de press�o em um momento espec�fico de transi��o. Objetos desse tipo s� podem ser recebidos de duas maneiras: como uma entrada para o callback do PressureObserver ou chamando o m�todo takeRecords() na inst�ncia PressureObserver.

PressureObserver

Quando um objeto PressureObserver � criado, ele � configurado para monitorar a press�o das fontes com suporte em um determinado intervalo de amostragem. As fontes com suporte podem ser observadas individualmente ou n�o a qualquer momento durante o ciclo de vida do objeto PressureObserver. N�o � poss�vel mudar o intervalo da amostra ap�s a cria��o do objeto.

Construtor

PressureObserver(callback): cria um novo objeto PressureObserver que invoca uma fun��o de callback especificada quando detecta que ocorreu uma mudan�a nos valores da origem observada.

O construtor usa uma fun��o de callback obrigat�ria.

Chamada de retorno

callback(): o callback � chamado com uma matriz de objetos PressureRecord n�o lidos.

M�todos

PressureObserver.observe(source, options): informa ao "PressureObserver" qual fonte deve ser observada e options opcional, como par�metros.

Op��es

PressureObserverOptions: cont�m o intervalo de amostra, sampleInterval em milissegundos, em que o usu�rio solicita atualiza��es.

PressureObserver.unobserve(source): instrui o "PressureObserver" a parar de observar uma fonte.

PressureObserver.disconnect(): instrui o "PressureObserver" a parar de observar todas as fontes.

PressureObserver.takeRecords(): retorna uma sequ�ncia de registros, desde a �ltima invoca��o do callback.

static PressureObserver.knownSources() (somente leitura): retorna os tipos de origem conhecidas do user agent em ordem alfab�tica.

Par�metros

source: a fonte a ser observada, por exemplo, "cpu". Precisa ser um dos tipos de origem compat�veis.

Na vers�o atual do Compute Pressure, apenas "cpu" � compat�vel.

PressureRecord

A interface PressureRecord da API Compute Pressure descreve a tend�ncia de press�o de uma fonte em um momento espec�fico de transi��o.

Propriedades da inst�ncia

PressureRecord.source (somente leitura): retorna uma string que representa a fonte de origem do registro.

PressureRecord.state (somente leitura): retorna uma string que representa o estado de press�o registrado.

PressureRecord.time (somente leitura): retorna um n�mero que representa um carimbo de data/hora de alta resolu��o.

Exemplos

As se��es a seguir listam exemplos de uso exemplares.

Determinar o suporte � API

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

Criar um observador de press�o

Crie o observador de press�o chamando o construtor com uma fun��o de callback a ser executada sempre que houver uma atualiza��o de press�o:

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

Uso do observador de press�o

H� apenas uma maneira de iniciar um observador de press�o. Para cada chamada de origem, chame observer.observe(source).

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

Neste exemplo, "cpu" � a fonte de press�o em que estamos interessados. No momento, � a �nica fonte dispon�vel. No futuro, pode haver outras fontes, como "gpu", "power" ou "thermals".

Um intervalo de amostra, sampleInterval, de 2.000 ms significa que haver� atualiza��es a cada dois segundos, no m�ximo.

Se o intervalo de amostragem solicitado n�o puder ser atendido pelo sistema, ele fornecer� amostras no melhor intervalo adequado. Por exemplo, se um intervalo de 2.000 ms for solicitado, mas o sistema s� puder fornecer amostras de no m�ximo 1.000 ms, 1.000 ms ser�o selecionados.

Para deixar de observar uma origem, use o m�todo unobserve(), como no exemplo a seguir:

observer.unobserve('cpu');

Para deixar de observar todas as fontes de uma s� vez, use o m�todo disconnect(), como no exemplo abaixo:

observer.disconnect();

Recuperar registros de press�o

Os registros de press�o podem ser recuperados com uma fun��o de callback, que � invocada sempre que ocorre uma altera��o no estado de press�o.

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

O usu�rio tamb�m pode for�ar a leitura de PressureRecord chamando o m�todo takeRecords().

O m�todo takeRecords() da interface PressureObserver retorna uma matriz de objetos PressureRecords armazenados no observador de press�o, esvaziando-a.

O caso de uso mais comum para isso � buscar imediatamente todos os registros de press�o pendentes, ainda n�o processados pela fun��o de callback do observador, antes de desconectar o observador, para que todos os registros pendentes possam ser processados ao encerrar o observador.

Chamar esse m�todo limpa a lista de registros pendentes. Assim, o callback n�o ser� executado.

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

Envie feedback

H� algo na API que n�o funciona como esperado? H� algum m�todo ou propriedade ausente para o uso da API? Registre um problema espec�fico ou comente sobre um problema existente no reposit�rio do GitHub correspondente.

Informar um problema com a implementa��o

Voc� encontrou um bug na implementa��o do Chromium? Ou a implementa��o � diferente da especifica��o? Registre um bug em new.crbug.com. Inclua o m�ximo de detalhes poss�vel, instru��es para reproduzir o problema e insira Blink>PerformanceAPIs>ComputePressure na caixa Componentes.

Recursos