Infórmate sobre la presión de procesamiento de tu sistema.
La API de presión de procesamiento 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 para ellos, siempre que 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 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 defectuosas. Es decir, la calidad del servicio se degrada si el sistema se ejerce más allá de ciertos estados, pero no conduce a una falla total del sistema. Estas aplicaciones flexibles en tiempo real 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, 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) del juego.
- Inhabilita los efectos que generen detalles no esenciales menos realistas (agua, ropa, 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, 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 cambios de presión en un sistema.
PressureRecord
: Describe la tendencia de presión en un momento específico de transición. Los objetos de este tipo solo se pueden obtener de dos maneras: como 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 la vida útil del objeto PressureObserver
. El intervalo de muestra no se puede cambiar después de crear el 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()
(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 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
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 manera de iniciar un observador de presión. Para cada llamada de origen 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, puede haber otras fuentes, como "gpu"
, "power"
o "thermals"
.
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 muestras solicitado, este proporcionará las 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 en un máximo de 1,000 ms, 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();
Recupera 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, 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 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 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 sobre uno existente en el repositorio de GitHub correspondiente.
Informar un problema con la implementación
¿Encontraste un error en la implementación de Chromium? ¿La implementación es diferente de las especificaciones? Informa un error en new.crbug.com. Asegúrate de incluir tantos detalles como puedas, instrucciones para reproducir el problema y, luego, ingresa Blink>PerformanceAPIs>ComputePressure en el cuadro Componentes.
Recursos
- 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