计算压力 API

了解您的系统计算压力。

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

Compute Pressure API 提供表示系统压力的概要状态。它允许实现使用正确的底层硬件指标,以确保用户能够利用所有可用的处理能力,前提是系统不会承受过多的压力。

当前状态

步骤 状态
1. 创建铺垫消息 完成
2. 创建规范的初始草稿 完成
3. 收集反馈并不断改进设计 进行中
4. 源试用 全面完整
5. 发布 完成 (Chrome 125)

试用 Compute Pressure API

如需在本地试用 Compute Pressure API,请参阅此页面

注册源试用

从 Chrome 115 开始,Compute Pressure API 以源试用形式提供。 预计将于 2024 年 5 月 29 日在 Chrome 123 中停用。点此报名

应用场景

当前 Compute Pressure API 的主要用例是视频会议和视频游戏。

这些热门的实时应用被归类为应用。也就是说,如果系统在某些状态之外运行,服务质量会下降,但不会导致系统整体故障。这些软实时应用能够根据 CPU 耗用情况或压力调整工作负载,因而对它们大有裨益。

具体而言,此 API 的第一个版本旨在实现以下调整决策。

视频会议

  • 调整在与多位参与者通话时同时显示的视频画面数量。
  • 降低视频处理质量(视频分辨率、每秒帧数)。
  • 跳过非必要的视频处理,例如某些相机滤镜。
  • 停用非必要的音频处理,例如 WebRTC 噪声抑制。
  • 在视频和音频编码(在 WebRTC、WebCodecs 或软件编码中)中,将质量与速度和大小与速度旋钮改为“速度”。

视频游戏

  • 使用较低质量的资源合成游戏的视频(3D 模型、纹理、着色器)和音频(语音、音效)。
  • 停用会产生不太真实的非基本细节(水、布、火动画、皮肤亮度、眩光效果或不影响游戏的物理模拟)的效果。
  • 调整游戏渲染引擎中的质量与速度旋钮(阴影质量、纹理过滤、视图距离)。

从技术上讲,了解网站使用的主线程和工作器的热状态(例如,系统是否被动冷却)和 CPU 压力状态可以实现此目的。系统热状态是一种全局状态,可能会受观测网站以外的应用和网站的影响。

接口

Compute Pressure API 可在以下情况下运行:

  • 窗口或主线程
  • 专用工作器
  • 共享工作器

Compute Pressure API 定义了两个新接口。

PressureObserver:该对象用于以预定义的样本间隔观察任意数量的来源的计算压力。Chromium 中的第一次迭代将 "cpu" 公开为 source。如需了解详情,请参阅有关参数的部分。每个观察者都可以异步观察系统中的压力变化趋势。

PressureRecord:描述特定过渡时刻的压力趋势。此类对象只能通过以下两种方式获取:作为 PressureObserver 回调的输入,或对 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

Compute Pressure API 的 PressureRecord 接口描述了来源在特定过渡时刻的压力趋势。

实例属性

PressureRecord.source(只读):返回一个字符串,表示记录的来源。

PressureRecord.state(只读):返回一个表示记录的压力状态的字符串。

PressureRecord.time(只读):返回一个数字,表示高分辨率时间戳。

示例

是否支持 Compute Pressure API?

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

创建压力观察器

通过使用要在发生压力更新时运行的回调函数来调用其构造函数来创建压力观察器:

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

采样间隔 sampleInterval 为 2,000 毫秒,表示最多每两秒更新一次。

系统无法提供请求的采样间隔时。系统将以现有的最合适的时间间隔提供样本。例如,如果请求的是 2,000 毫秒的时间间隔,但系统最多只能提供 1,000 毫秒的样本,则会选择 1,000 毫秒。

使用压力观察器

启动压力观察器只有一种方式。对于每个来源,调用 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");

用户还可以通过调用 takeRecords() 方法来强制读取 PressureRecord

PressureObserver 接口的 takeRecords() 方法会返回存储在压力观察器中的 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 提交 bug。请务必提供尽可能多的详细信息和简单的重现说明,并在组件框中输入 Blink>PerformanceAPIs>ComputePressure

实用链接