API de Compute Pressure

Infórmate sobre la presión de procesamiento de tu sistema.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

La API de Compute Pressure ofrece estados de alto nivel que representan la presión que se ejerce 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 un estrés inmanejable.

Estado actual

Step Estado
1. Crear explicación Completo
2. Crea el borrador inicial de la especificación Completo
3. Recopila comentarios e itera en el diseño En curso
4. Prueba de origen Completo
5. Lanzamiento Completo (Chrome 125)

Prueba la API de Compute Pressure

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

Registrarse para la prueba de origen

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

Casos de uso

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

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

Específicamente, la primera versión de esta API tiene como objetivo permitir las siguientes decisiones de adaptación.

Videoconferencias

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

Videojuegos

  • Usa elementos de menor calidad para componer el video (modelos 3D, texturas, sombreadores) y audio (voces, efectos de sonido).
  • Inhabilita los efectos que generen detalles no esenciales menos realistas (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 frente a velocidad en el motor de renderización del juego (calidad de las sombras, filtrado de texturas y distancia de visualización).

Técnicamente, esto se puede lograr si se conocen los estados térmicos (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 un estado global y puede verse afectado por apps y sitios distintos del sitio de observación.

Interfaces

La API de presión de procesamiento se puede ejecutar en los siguientes contextos:

  • Ventana o subproceso principal
  • Trabajador dedicado
  • Trabajador compartido

La API de presión de procesamiento 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 una entrada para la devolución de llamada de PressureObserver o mediante una llamada 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 admitidas se pueden observar o no observar de forma individual en cualquier momento durante el ciclo de vida del objeto PressureObserver. El intervalo de muestra no se puede cambiar después de la creación del objeto.

Constructor

PressureObserver(callback, options): 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 y opciones opcionales como parámetros.

Devolución de llamada

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

Opciones

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

Métodos

PressureObserver.observe(source): Indica a "PressureObserver" qué fuente observar.

PressureObserver.unobserve(source): 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.supportedSources() (solo lectura): Muestra tipos de fuentes compatibles con el hardware.

Parámetros

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

En la versión actual de presión de procesamiento, solo se admite "cpu".

PressureRecord

En la interfaz PressureRecord de la API de Compute Pressure, se describe la tendencia de presión de una fuente en un momento específico de la 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 string que representa el estado de presión registrado.

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

Ejemplos

¿Es compatible la API de Compute Pressure?

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

Cómo crear 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 ejecute cada vez que haya una actualización de presión:

const observer = new PressureObserver(
  (records) => { /* ... */ },
  { sampleInterval: 2000 }
);

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

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

Usa un observador de presión

Solo hay una manera de iniciar un observador de presión. Para cada llamada de origen a observer.observe(source).

observer.observe("cpu");

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

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, { sampleInterval: 1000 });
await observer.observe("cpu");

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, que lo vacía.

El caso de uso más común para esto es recuperar de inmediato todos los registros de presión pendientes, aún no procesados por la función de devolución de llamada del observador, antes de desconectar al observador, de modo que cualquier registro pendiente se pueda procesar 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. */ },
  { sampleInterval: 1000 }
);

await observer.observe("cpu");

setTimeout(() => {
  // Forced records reading.
  const records = observer.takeRecords();
  observer.disconnect();
  // Do something with last records if any.
}, 2000);

Cuéntanos sobre el diseño de la API

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

Informar un problema con la implementación

¿Encontraste un error en la implementación de Chromium? ¿O es diferente la implementación de la especificación? Informa un error en new.crbug.com. Asegúrate de incluir tantos detalles como puedas, además de instrucciones simples para reproducir el contenido, y, luego, ingresa Blink>PerformanceAPIs>ComputePressure en el cuadro Componentes.

Vínculos útiles