计算压力 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 以源试用形式提供。该版本预计将于 Chrome 123(2024 年 5 月 29 日)中停用。注册源试用

应用场景

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

这些热门的实时应用被归类为应用。也就是说,如果系统在某些状态之外执行时,服务质量会降低,但不会导致系统完全故障。这些软实时应用能够根据 CPU 消耗或压力调整工作负载,这对这些软实时应用非常有利。

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

视频会议

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

视频游戏

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

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

接口

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

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

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

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

PressureRecord:描述特定过渡时刻的压力趋势。此类对象只能通过以下两种方式获取:作为 PressureObserver 回调的输入,或对 PressureObserver 实例调用 takeRecords() 方法。

PressureObserver

创建 PressureObserver 对象后,系统会将其配置为以指定的采样间隔监测受支持来源的压力。在 PressureObserver 对象的生命周期内,您可以随时单独观察或未观察受支持的来源。创建对象后,便无法更改采样间隔。

构造函数

PressureObserver(callback):创建一个新的 PressureObserver 对象,该对象将在检测到被观察的来源的值发生更改时调用指定的回调函数。

构造函数采用强制性的回调函数。

回拨电话

callback():使用未读 PressureRecord 对象数组调用该回调函数。

方法

PressureObserver.observe(source, options):告知“PressureObserver”要观察哪个来源,以及可选的 options 作为参数。

选项

PressureObserverOptions:包含用户请求更新的采样间隔 sampleInterval(以毫秒为单位)。

PressureObserver.unobserve(source):告知“PressureObserver”停止观察来源。

PressureObserver.disconnect():告知“PressureObserver”停止观察所有来源。

PressureObserver.takeRecords():返回自上次回调调用以来的一系列记录

static PressureObserver.knownSources()(只读):按字母顺序返回用户代理的已知来源类型。

参数

source:要观察的来源,例如 "cpu"。它必须是受支持的来源类型之一。

当前版本的 Compute Pressure 中仅支持 "cpu"

PressureRecord

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

实例属性

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

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

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

示例

以下部分列出了示例用法示例。

确定 API 支持情况

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

创建压力观察器

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

const observer = new PressureObserver((records) => {
  /* ... */
});

压力观测器的使用

启动压力观察器只有一种方式。对于每个来源,调用 observer.observe(source)

observer.observe("cpu" { sampleInterval: 2_000 });

在此示例中,"cpu" 是我们感兴趣的压力源。目前,它是唯一可用的来源。将来可能会存在其他来源,例如 "gpu""power""thermals"

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

如果系统无法处理所请求的采样间隔,系统将以现有的最合适间隔提供样本。例如,如果请求 2000 毫秒的时间间隔,但系统只能提供不超过 1,000 毫秒的样本,则会选择 1,000 毫秒。

如需停止观察某个来源,请使用 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);
await observer.observe('cpu', { sampleInterval: 1_000 });

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

PressureObserver 接口的 takeRecords() 方法会返回存储在压力观察器中的 PressureRecords 对象数组,并将其清空。

最常见的用例是在断开观察者的连接之前立即提取所有待处理的压力记录,但尚未由观察者的回调函数进行处理,以便在关闭观察者时可以处理所有待处理的记录。

调用此方法会清除待处理记录列表,因此不会运行回调。

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

欢迎分享反馈

是否有任何 API 无法按预期运行?您是否发现使用此 API 时缺少任何方法或属性?在相应的 GitHub 代码库中提交规范问题或对现有问题发表评论。

报告实施方面的问题

您是否发现了 Chromium 实现中存在的错误?或者实现方式是否不同于规范?在 new.crbug.com 提交 bug。请务必提供尽可能多的详细信息和有关重现的说明,并在 Components 框中输入 Blink>PerformanceAPIs>ComputePressure

资源