Infórmate sobre la presión de procesamiento de tu sistema.
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
- Especificaciones
- Explicación pública
- Demostración de la API de Compute Pressure | Fuente de la demostración de la API de Compute Pressure
- Error de seguimiento de Chromium
- Entrada de ChromeStatus.com
- Componente de Blink:
Blink>PerformanceAPIs>ComputePressure
- Revisión de la etiqueta
- Listo para la prueba
- Página de HOWTO
- Intención de experimentar