Saiba mais sobre a pressão de computação do sistema.
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
- Especificações
- Explicação para o público
- Demonstração da API Compute Pressure | Fonte da demonstração da API Compute Pressure
- Bug de rastreamento do Chromium
- Entrada do ChromeStatus.com
- Componente do Blink:
Blink>PerformanceAPIs>ComputePressure
- Análise do TAG
- Pronto para teste
- Página de instruções
- Intenção de fazer um experimento