API расчета давления

Получите информацию о вычислительной нагрузке вашей системы.

Кеннет Кристиансен
Kenneth Christiansen
Arnaud (Arno) Mandy

API Compute Pressure предлагает состояния высокого уровня, которые отражают нагрузку на систему. Это позволяет реализации использовать правильные базовые аппаратные показатели, чтобы пользователи могли использовать всю доступную им вычислительную мощность, пока система не находится в неуправляемой нагрузке.

Текущее состояние

Шаг Положение дел
1. Создайте объяснитель Полный
2. Создайте первоначальный проект спецификации. Полный
3. Соберите отзывы и доработайте дизайн В ходе выполнения
4. Пробная версия происхождения Полный
5. Запуск Полный (Хром 125)

Попробуйте API вычисления давления

Чтобы поэкспериментировать с API Compute Pressure локально, прочитайте эту страницу .

Зарегистрируйтесь для участия в пробной версии Origin

Начиная с Chrome 115, API Compute Pressure доступен в виде пробной версии . Ожидается, что его поддержка закончится в Chrome 123 (29 мая 2024 г.). Зарегистрируйтесь здесь .

Случаи использования

Основными вариантами использования, улучшенными с помощью текущего API Compute Pressure, являются видеоконференции и видеоигры.

Эти популярные приложения реального времени относятся к категории программных . То есть качество обслуживания ухудшается, если система выходит за пределы определенных состояний, но не приводит к полному сбою системы. Эти программные приложения реального времени значительно выигрывают от возможности адаптировать свои рабочие нагрузки в зависимости от потребления или нагрузки ЦП.

В частности, первая версия этого API призвана обеспечить следующие решения по адаптации.

Видео-конференция

  • Настройте количество видеопотоков, показываемых одновременно во время разговоров с большим количеством участников.
  • Уменьшите качество обработки видео (разрешение видео, кадров в секунду).
  • Пропустите несущественную обработку видео, например некоторые фильтры камеры.
  • Отключите ненужную обработку звука, например подавление шума WebRTC.
  • Поверните ручки «качество-скорость» и «размер-зависимость скорости» в сторону «скорости» при кодировании видео и аудио (в WebRTC, WebCodecs или программном кодировании).

Видеоигры

  • Используйте ресурсы более низкого качества для создания игрового видео (3D-модели, текстуры, шейдеры) и звука (голоса, звуковые эффекты).
  • Отключите эффекты, которые приводят к менее реалистичным несущественным деталям (анимация воды, ткани, огня, яркости кожи, эффектов бликов или физических симуляций, которые не влияют на игровой процесс).
  • Настройте регуляторы качества и скорости в движке рендеринга игры (качество теней, фильтрация текстур, расстояние просмотра).

Технически это можно сделать, зная температурные состояния (например, пассивно ли охлаждается система) и нагрузку на процессор для основного потока и рабочих процессов, которые использует сайт. Тепловое состояние системы является глобальным состоянием, на которое могут влиять приложения и сайты, отличные от сайта наблюдения.

Интерфейсы

API Compute Pressure можно запускать в следующих контекстах:

  • Окно или основной поток
  • Преданный работник
  • Общий работник

API Compute Pressure определяет два новых интерфейса.

PressureObserver : объект для наблюдения за расчетным давлением любого количества источников с заранее определенным интервалом выборки. Первая итерация в Chromium предоставляет "cpu" в качестве source . Более подробную информацию смотрите в разделе о параметрах . Каждый наблюдатель может асинхронно наблюдать тенденции изменения давления в системе.

PressureRecord : описывает тенденцию давления в определенный момент перехода. Объекты этого типа можно получить только двумя способами: в качестве входных данных для обратного вызова PressureObserver или путем вызова метода takeRecords() в экземпляре PressureObserver .

ДавлениеОбсервер

При создании объекта PressureObserver он настраивается на наблюдение за давлением поддерживаемых источников с заданным интервалом выборки. Поддерживаемые источники можно наблюдать или не наблюдать по отдельности в любой момент времени существования объекта PressureObserver . Интервал выборки не может быть изменен после создания объекта.

Конструктор

PressureObserver(callback, options) : Создает новый объект PressureObserver , который будет вызывать указанную функцию обратного вызова, когда обнаружит, что произошло изменение значений наблюдаемого источника.

Конструктор принимает обязательную функцию обратного вызова и необязательные параметры в качестве параметров.

Перезвонить

callback() : обратный вызов вызывается с массивом непрочитанных объектов PressureRecord .

Параметры

PressureObserverOptions : содержит интервал выборки sampleInterval в миллисекундах, с которым пользователь запрашивает обновления.

Методы

PressureObserver.observe(source) : сообщает PressureObserver, какой источник наблюдать.

PressureObserver.unobserve(source) : сообщает «PressureObserver» прекратить наблюдение за источником.

PressureObserver.disconnect() : сообщает «PressureObserver» прекратить наблюдение за всеми источниками.

PressureObserver.takeRecords() : возвращает последовательность записей с момента последнего вызова обратного вызова.

static PressureObserver.supportedSources() (только чтение): возвращает типы источников, поддерживаемые оборудованием.

Параметры

source : источник, который нужно наблюдать, например "cpu" . Это должен быть один из поддерживаемых типов источника .

В текущей версии Compute Pressure поддерживается только "cpu" .

ДавлениеРекорд

Интерфейс PressureRecord API Compute Pressure описывает динамику давления источника в определенный момент перехода.

Свойства экземпляра

PressureRecord.source (только для чтения): возвращает строку, представляющую исходный источник, из которого поступает запись.

PressureRecord.state (только для чтения): возвращает строку, представляющую записанное состояние давления.

PressureRecord.time (только для чтения): возвращает число, представляющее временную метку высокого разрешения.

Примеры

Поддерживается ли API Compute Pressure?

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

Создание наблюдателя давления

Создайте наблюдатель давления, вызвав его конструктор с функцией обратного вызова, которая будет запускаться при каждом обновлении давления:

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

Интервал выборки sampleInterval , равный 2000 мс, означает, что обновления будут происходить не чаще, чем каждые две секунды.

Если запрошенный интервал выборки не может быть обслужен системой. Система предоставит образцы через наиболее подходящий интервал из существующих. Например, если запрошен интервал 2000 мс, но система может предоставить образцы только с максимальной длительностью 1000 мс, будет выбрано 1000 мс.

Использование наблюдателя давления

Есть только один способ запустить наблюдатель давления. Для каждого источника вызовите observer.observe(source) .

observer.observe("cpu");

В этом примере "cpu" — это интересующий нас источник давления. На данный момент это единственный доступный источник. В будущем могут появиться и другие источники, такие как "gpu" , "power" или "thermals" .

Чтобы прекратить наблюдение за источником, используйте метод unobserve() , как в следующем примере:

observer.unobserve("cpu");

Чтобы отменить наблюдение всех источников одновременно, используйте метод disconnect() , как в следующем примере:

observer.disconnect();

Получение записей давления

Записи давления можно получить с помощью функции обратного вызова, которая будет вызываться каждый раз, когда происходит изменение состояния давления.

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

Пользователь также может принудительно прочитать PressureRecord , вызвав метод takeRecords() .

Метод takeRecords() интерфейса PressureObserver возвращает массив объектов PressureRecords , хранящихся в наблюдателе давления, и очищает его.

Наиболее распространенным вариантом использования этого является немедленная выборка всех ожидающих записей о давлении, еще не обработанных функцией обратного вызова наблюдателя, перед отключением наблюдателя, чтобы любые ожидающие записи могли быть обработаны при выключении наблюдателя.

Вызов этого метода очищает список ожидающих записей, поэтому обратный вызов не будет запущен.

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

Расскажите нам о дизайне API

Что-то в API работает не так, как вы ожидали? Видите ли вы какой-либо недостающий метод или свойство для использования API? Сообщите о проблеме со спецификацией или прокомментируйте существующую в соответствующем репозитории GitHub .

Сообщить о проблеме с реализацией

Вы нашли ошибку в реализации Chromium? Или реализация отличается от спецификации? Сообщите об ошибке на сайте new.crbug.com . Обязательно включите как можно больше подробностей, простые инструкции по воспроизведению и введите Blink>PerformanceAPIs>ComputePressure в поле «Компоненты» .

Полезные ссылки