API de Compute Pressure

Obtén información sobre la presión de procesamiento del sistema.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

La API de Compute Pressure ofrece estados de alto nivel que representan la presión sobre el sistema. Permite que la implementación use las métricas de hardware subyacentes correctas para garantizar que los usuarios puedan aprovechar toda la potencia de procesamiento disponible, siempre y cuando el sistema no esté bajo una tensión inmanejable.

Estado actual

Paso Estado
1. Crea una explicación Completar
2. Crea un borrador inicial de la especificación Completo
3. Recopila comentarios y itera en el diseño En curso
4. Prueba de origen Completado
5. Lanzamiento Completada (Chrome 125)

Prueba la API de Compute Pressure

Para experimentar con la API de Compute Pressure de forma local, lee esta página.

Regístrate para la prueba de origen

A partir de Chrome 115, la API de Compute Pressure está disponible como una prueba de origen. Se espera que finalice en Chrome 123 (29 de mayo de 2024). Regístrate para la prueba de origen.

Casos de uso

Los casos de uso principales mejorados por la API de Compute Pressure actual son las videoconferencias y los videojuegos.

Estas aplicaciones populares en tiempo real se clasifican como flexibles. Es decir, la calidad del servicio se degrada si el sistema se ejercita más allá de ciertos estados, pero no genera una falla total del sistema. Estas aplicaciones en tiempo real suaves se benefician en gran medida de poder adaptar sus cargas de trabajo en función del consumo o la presión de la CPU.

Específicamente, el objetivo de la primera versión de esta API es habilitar las siguientes decisiones de adaptación.

Videoconferencias

  • Ajusta la cantidad de feeds de video que se muestran de forma simultánea durante las llamadas con muchos participantes.
  • Reduce la calidad del procesamiento de video (resolución de video, fotogramas por segundo).
  • Omitir el procesamiento de video no esencial, como algunos filtros de cámara
  • Inhabilita el procesamiento de audio no esencial, como la supresión de ruido de WebRTC.
  • Gira los controles de calidad frente a la velocidad y el tamaño frente a la velocidad en la codificación de audio y video (en WebRTC, WebCodecs o codificación de software).

Videojuegos

  • Usa recursos de menor calidad para componer el video (modelos 3D, texturas y sombreadores) y el audio (voces y efectos de sonido) del juego.
  • Inhabilita los efectos que generen detalles menos realistas y no esenciales (agua, tela, animaciones de fuego, luminancia de la piel, efectos de reflejo o simulaciones físicas que no afecten el juego).
  • Ajusta los controles de calidad y velocidad en el motor de renderización del juego (calidad de las sombras, filtrado de texturas, distancia de visualización).

Técnicamente, estos se pueden lograr si conoces los estados de temperatura (por ejemplo, si el sistema se enfría de forma pasiva) y los estados de presión de la CPU del subproceso principal y los trabajadores que usa el sitio. El estado térmico del sistema es global y puede verse afectado por apps y sitios que no sean el sitio de observación.

Interfaces

La API de Compute Pressure se puede ejecutar en los siguientes contextos:

  • Ventana o subproceso principal
  • Trabajador dedicado
  • Trabajador compartido

La API de Compute Pressure define dos interfaces nuevas.

PressureObserver: Es un objeto para observar la presión de procesamiento de cualquier cantidad de fuentes en un intervalo de muestra predefinido. La primera iteración en Chromium expone "cpu" como source. Consulta la sección sobre los parámetros para obtener más detalles. Cada observador puede observar de forma asíncrona las tendencias de los cambios de presión en un sistema.

PressureRecord: Describe la tendencia de presión en un momento específico de la transición. Los objetos de este tipo solo se pueden obtener de dos maneras: como entrada a la devolución de llamada de PressureObserver o llamando al método takeRecords() en la instancia PressureObserver.

PressureObserver

Cuando se crea un objeto PressureObserver, se configura para observar la presión de las fuentes compatibles, en un intervalo de muestra determinado. Las fuentes compatibles se pueden observar o no de forma individual en cualquier momento durante la vida útil del objeto PressureObserver. El intervalo de muestra no se puede cambiar después de la creación del objeto.

Constructor

PressureObserver(callback): Crea un nuevo objeto PressureObserver que invocará una función de devolución de llamada especificada cuando detecte que se produjo un cambio en los valores de la fuente que se observa.

El constructor toma una función de devolución de llamada obligatoria.

Devolución de llamada

callback(): Se llama a la devolución de llamada con un array de objetos PressureRecord no leídos.

Métodos

PressureObserver.observe(source, options): Le indica a "PressureObserver" qué fuente observar y options opcional, como parámetros.

Opciones

PressureObserverOptions: Contiene el intervalo de muestra, sampleInterval en milisegundos, en el que el usuario solicita actualizaciones.

PressureObserver.unobserve(source): Le indica a "PressureObserver" que deje de observar una fuente.

PressureObserver.disconnect(): Le indica a "PressureObserver" que deje de observar todas las fuentes.

PressureObserver.takeRecords(): Muestra una secuencia de registros desde la última invocación de devolución de llamada.

static PressureObserver.knownSources() (de solo lectura): Muestra los tipos de fuentes conocidos del usuario-agente en orden alfabético.

Parámetros

source: Es la fuente que se observará, por ejemplo, "cpu". Debe ser uno de los tipos de fuentes admitidos.

En la versión actual de Compute Pressure, solo se admite "cpu".

PressureRecord

La interfaz PressureRecord de la API de Compute Pressure describe la tendencia de presión de una fuente en un momento específico de transición.

Propiedades de la instancia

PressureRecord.source (solo lectura): Muestra una string que representa la fuente de origen de la que proviene el registro.

PressureRecord.state (solo lectura): Muestra una cadena que representa el estado de presión registrado.

PressureRecord.time (de solo lectura): Muestra un número que representa una marca de tiempo de alta resolución.

Ejemplos

En las siguientes secciones, se enumeran ejemplos de uso.

Determina la compatibilidad de la API

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

Crea un observador de presión

Para crear el observador de presión, llama a su constructor con una función de devolución de llamada que se ejecutará cada vez que haya una actualización de presión:

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

Uso del observador de presión

Solo hay una forma de iniciar un observador de presión. Para cada fuente, llama a observer.observe(source).

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

En este ejemplo, "cpu" es la fuente de presión que nos interesa. Por ahora, es la única fuente disponible. En el futuro, es posible que haya otras fuentes, como "gpu", "power" o "thermals".

Un intervalo de muestra, sampleInterval, de 2, 000 ms significa que habrá actualizaciones como máximo cada dos segundos.

Si el sistema no puede entregar el intervalo de muestra solicitado, proporcionará muestras en el intervalo más adecuado que exista. Por ejemplo, si se solicita un intervalo de 2,000 ms, pero el sistema solo puede proporcionar muestras de 1,000 ms como máximo, se seleccionarán 1,000 ms.

Para dejar de observar una fuente, usa el método unobserve(), como en el siguiente ejemplo:

observer.unobserve('cpu');

Para dejar de observar todas las fuentes a la vez, usa el método disconnect(), como en el siguiente ejemplo:

observer.disconnect();

Cómo recuperar registros de presión

Los registros de presión se pueden recuperar con una función de devolución de llamada, que se invocará cada vez que se produzca un cambio en el estado de presión.

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

El usuario también puede forzar la lectura de PressureRecord llamando al método takeRecords().

El método takeRecords() de la interfaz PressureObserver muestra un array de objetos PressureRecords almacenados en el observador de presión y lo vacía.

El caso de uso más común para esto es recuperar de inmediato todos los registros de presión pendientes que aún no procesa la función de devolución de llamada del observador antes de desconectarlo, de modo que se puedan procesar los registros pendientes cuando se cierre el observador.

Si llamas a este método, se borrará la lista de registros pendientes, por lo que no se ejecutará la devolución de llamada.

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

Comparte tus comentarios

¿Hay algo en la API que no funcione como esperabas? ¿Falta algún método o propiedad para tu uso de la API? Informa un problema de especificación o comenta uno existente en el repositorio de GitHub correspondiente.

Denuncia un problema con la implementación

¿Encontraste un error con la implementación de Chromium? ¿O la implementación es diferente de la especificación? Informa un error en new.crbug.com. Asegúrate de incluir la mayor cantidad de detalles posible, así como instrucciones para la reproducción, y, luego, ingresa Blink>PerformanceAPIs>ComputePressure en el cuadro Componentes.

Recursos