第二次 ComputePressure 源试用宣布

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

去年,Intel 一直在与 Google 及其他各方就 Compute Pressure API 开展合作。在 Chrome 115 中,您可以注册参加源试用以帮助测试这个新 API。本博文介绍了此 API 旨在解决哪些问题,以及如何使用它。

问题

Web 正成为重要的应用平台,其新功能使得视频会议等应用不仅成为可能,而且还能为用户提供愉悦的体验。基于网络的体验可即时加载,可从任何位置访问,无需预先安装。

用户希望应用能够快速加载、响应迅速。他们还希望尽可能地延长电池续航时间以及不方便轻触的静音设备。在打造高级体验时,这些目标有时可能很难实现,因为流畅的动画和背景视频模糊处理会占用大量的处理资源,致使硬件达到极限,而且费时费力。

此外,人们还使用各种各样的设备访问 Web 应用。与全新台式电脑相比,5 年用过的笔记本电脑具有截然不同的功能,即使运行的是相同的浏览器版本也是如此。

开发者通常会选择针对最低标准进行开发,避免使用会给旧版或功能较低的设备带来负担的功能。但是,如果可以优化用户体验,让拥有相关设备并处于适当环境的用户受益,那为什么不这样做呢?例如,通过手机加入视频通话时,只看到当前扬声器很可能是最佳体验。不过,在桌面设备上,最好能看到所有参与者都在通话中,而硬件通常可以胜任任务。为了实现这一点,您需要实时硬件遥测,同时又不会牺牲用户隐私,而且可以将其用于安排任务并逐步开启和关闭功能,以确保流畅的用户体验。这正是 Compute Pressure API 的用武之地。

什么是 Compute Pressure API?

Compute Pressure API 可提供表示系统压力的概要状态。这些高级状态可确保在隐私保护(而不是分享过多能够识别用户身份的特定信息)和开发者可以轻松推理的信息之间取得良好平衡。此外,它还允许实现使用正确的底层硬件指标,以确保只要系统不会处于无法控制的压力下,用户就可以利用所有可用的处理能力。

例如,在大多数情况下,在单个核心或所有核心上,现代 CPU 都能以 100% 的利用率正常运行,因此如果某个 API 将 80% 的利用率硬编码为至关重要,可能会导致开发者未能充分利用硬件的功能,进而导致用户体验不佳。另一方面,系统可能没有适当的制冷,或者环境温度可能像夏季一样非常高,并且系统甚至可能在 CPU 利用率达到较高利用率之前就开始节流。当前的 API 可应对全局 CPU 压力,但我们计划尝试为主线程和工作器中的每个页面启用 CPU 压力。

计算压力具有以下状态:

  • 标称:当前工作负载产生的压力极小,使系统能够以较低的时钟频率运行以节省电量。
  • 一般:系统运行良好;一切都很顺利,可以接受额外的工作,而不会出现问题。
  • 严重:系统存在一些严重的压力,但可以管理、系统运行良好,但可能接近其极限:
    • 时钟速度(取决于交流电或直流电源)始终很高。
    • 散热很高,但仍然易于管理,不会导致节流。

此时,如果您添加更多工作,系统可能会进入临界状态。

  • 关键:系统现在即将达到其上限,但尚未达到上限。“严重”并不意味着系统正在受到主动限制,但此状态无法长期保持,如果工作负载保持不变,则可能会导致受限。此信号是 Web 应用减轻其工作负载的最后一次调用。

启用 Compute Pressure API

默认情况下,Compute Pressure API 未在 Chrome 中启用,但可以通过明确启用该功能在 Chrome 115 中对其进行实验。您可以在本地通过启用 enable-experimental-web-platform-features 标志将其激活。

为了向应用的所有访问者启用此测试,我们目前正在进行一项源试用,并将在 Chrome 118 中结束(2023 年 7 月 18 日)。若要参与试用,请注册并在 HTML 或 HTTP 标头中添加带有源试用令牌的元元素。如需了解详情,请参阅开始进行源试用一文。

观察计算压力

以下代码段说明了如何监控计算压力的变化并采取相应措施:

// The `records` parameter is a sequence of records between two
// consecutive callbacks. Currently it contains ten entries, but
// this is an implementation detail.
function callback(records) {
  const lastRecord = records.pop();
  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, {
  // Sample rate in Hertz.
  sampleRate: 1,
});
observer.observe('cpu');

以下代码段说明了如何在 iframe 中使用 Compute Pressure API:

<iframe src="https://mysite.com/" allow="compute-pressure">
  <script>
    // Use Compute Pressure API.
  </script>
</iframe>

平台支持

Compute Pressure API 适用于 Linux、ChromeOS、macOS 和 Windows 上的 Chrome 115。

演示

试用下面嵌入的演示,了解计算压力状态如何因某种人为压力而变化。

如果您的浏览器不支持该 API,请观看以下视频:

反馈

在此阶段,开发者反馈非常重要,因此请在 GitHub 上提交问题,并附上建议和问题。

致谢

主打图片由 Robert Anasch 在 Unsplash 用户创建。本文由 Rachel AndrewThomas Steiner 审核。