API Compute Pressure

Saiba mais 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 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 incontrolável.

Status atual

Etapa Status
1. Criar uma explicação Concluído
2. Criar um rascunho inicial da especificação Concluído
3. Coletar feedback e iterar o design Em andamento
4. Teste de origem Concluído
5. Lançamento Concluído (Chrome 125)

Testar a API Compute Pressure

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

Inscreva-se no teste de origem

A partir do Chrome 115, a API Compute Pressure está disponível como um teste de origem. A expectativa é que ele seja encerrado no Chrome 123 (29 de maio de 2024). Registre-se para o 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 em tempo real são classificados como soft. Ou seja, a qualidade do serviço se degrada se o sistema for usado 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 ao adaptar as cargas de trabalho com base no consumo ou na pressão da CPU.

Especificamente, a primeira versão dessa API tem como objetivo permitir as seguintes decisões de adaptação.

Videoconferências

  • Ajustar o número de feeds de vídeo exibidos simultaneamente durante chamadas com muitos participantes.
  • Reduzir a qualidade do processamento de vídeo (resolução do vídeo, frames por segundo).
  • Ignorar o processamento de vídeo não essencial, como alguns filtros da câmera.
  • Desative o processamento de áudio não essencial, como a supressão de ruído do WebRTC.
  • Gire os botões de qualidade versus velocidade e tamanho versus velocidade para "velocidade" na codificação de vídeo e áudio (no WebRTC, WebCodecs ou codificação de software).

Videogames

  • Use recursos de qualidade inferior para compor o vídeo do jogo (modelos 3D, texturas e shaders) e o áudio (vozes, efeitos sonoros).
  • Desative efeitos que resultam em detalhes não essenciais menos realistas (água, animações de tecido, fogo, luminância da pele, efeitos de brilho ou simulações físicas que não afetam a jogabilidade).
  • Ajuste os botões de qualidade e velocidade no mecanismo de renderização do jogo (qualidade de sombras, filtragem de texturas, distância de visualização).

Tecnicamente, isso pode ser feito sabendo o térmico (por exemplo, se 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 que não sejam o de observação.

Interfaces

A API Compute Pressure pode ser executada nos seguintes contextos:

  • Janela ou linha de execução principal
  • 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 amostragem 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 forma 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. Os objetos desse tipo só podem ser acessados de duas maneiras: como uma entrada para o callback 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 origens com suporte em um determinado intervalo de amostragem. As fontes com suporte podem ser observadas ou não individualmente a qualquer momento durante a vida útil do objeto PressureObserver. O intervalo de amostragem não pode ser alterado após a criação do objeto.

Construtor

PressureObserver(callback): cria um novo objeto PressureObserver, que invocará uma função de callback especificada quando detectar que houve uma mudança nos valores da origem observada.

O construtor usa uma função 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 observar 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): informa ao PressureObserver para parar de observar uma fonte.

PressureObserver.disconnect(): informa ao PressureObserver para parar de observar todas as fontes.

PressureObserver.takeRecords(): retorna uma sequência de registros desde a última invocação de callback.

static PressureObserver.knownSources() (somente leitura): retorna os tipos de origem conhecidos do agente do usuário 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 da pressão de computação, somente "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 origem de onde o registro está vindo.

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.

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 para 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 fonte, chame observer.observe(source).

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

Neste exemplo, "cpu" é a fonte de pressão de que estamos interessados. Por enquanto, é a única fonte disponível. No futuro, talvez haja outras fontes, como "gpu", "power" ou "thermals".

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

Se o intervalo de amostragem solicitado não puder ser atendido pelo sistema, ele vai fornecer amostras no intervalo mais adequado disponível. 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á selecionado.

Para parar de observar uma origem, use o método unobserve(), como no exemplo abaixo:

observer.unobserve('cpu');

Para desativar todas as origens 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 será invocada sempre que uma mudança acontecer 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-o.

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

Chamar esse método limpa a lista de registros pendentes, para que o callback não seja 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? Você encontra algum método ou propriedade ausente para o uso da API? Registre um problema de especificação ou comente 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 reprodução e insira Blink>PerformanceAPIs>ComputePressure na caixa Components.

Recursos