沃卡惠移动端logo

沃卡惠  行业资讯

资讯详情

如何将混合核心带入Web

2022-11-05 11:56:354636

根据微软对用户应用程序的使用统计,人们在 PC 上花费的60%时间是在网络浏览器上。Google Chrome是谷歌基于Chromium项目开发的跨平台网络浏览器。根据StatCounter网站统计,到2022年1月,Chrome浏览器在全球所有平台的市场份额超过63%。

结合高性能核心和节能核心的混合核心架构越来越受欢迎,尤其是在英特尔推出 Alder Lake CPU 产品之后。性能核心旨在提供最大的计算性能,而高效核心旨在提供最大的电源效率。通常操作系统调度程序可以管理混合核心调度,但它们缺乏应用程序行为的细节,如关键路径。操作系统调度程序很难涵盖所有场景。

我们来自 Web 优化团队,专注于 Web 平台(主要是 Chromium)的功率和性能优化,旨在为 IA 提供更好的用户体验。本文介绍了我们利用混合核心能力将 Chrome 浏览器中特定线程/进程的执行调度到高效核心的工作,该核心采用动态策略来根据设备状态在不同级别降低功耗。下面所有的分析和测试都是在 Chrome OS 平台上进行的。

概述

在混合核心平台上,Chrome 可以将线程调度到高效核心,以节省功耗。但是,始终将浏览器线程放在高效的内核上是不切实际的,因为大量线程可能会激增并需要更高的性能。因此,我们在 Chrome 浏览器中提出了一种混合核心调度技术,通过将特定的非关键线程调度到高效的核心来执行,从而对特定的非关键线程应用动态限制。该技术基于 Web 运行时场景,例如背景/空闲/广告/视频,因为线程的重要性会在不同的场景中发生变化。此外,设备信息,如电池/热状态和混合核心信息,需要暴露给 Chrome。基于它们,混合核心调度将应用不同的核心分配策略来平衡功率和性能。通常我们将低优先级线程调度到高效核心。但是当设备处于电池耗尽等关键阶段时,调度策略会更积极地延长设备使用时间。调度策略的应用依赖于操作系统的支持,我们可以根据操作系统的习惯使用线程优先级或QoS机制。在 Chrome OS 上,目前我们更改线程优先级及其 cgroup 关联。该提案的整体架构如图 1 所示。目前我们更改线程优先级及其 cgroup 关联。该提案的整体架构如图 1 所示。目前我们更改线程优先级及其 cgroup 关联。该提案的整体架构如图 1 所示。

图 1:Chrome 浏览器中的混合核心调度

执行

混合核心调度技术的实现主要包含三个部分,场景检测、调度策略、操作系统支持工作。

场景检测

首先,我们需要根据来自各种浏览器组件的输入来确定进程的当前场景。例如,Chrome 渲染进程有一个关于后台状态的状态,表示该进程是前台还是后台场景。再举一个例子,Chrome 有一个广告标记机制来检测广告及其在浏览器中加载的资源。广告标记通过将资源请求与过滤器列表进行匹配来确定它们是否是广告请求。如果 iframe 的 url 与过滤器列表匹配,如果标记的脚本参与 iframe 的创建,或者其父框架是广告 iframe,则 iframe 将被标记为广告 iframe。如果所有帧都是广告帧,则渲染进程将被标记为广告进程。浏览器收集所有这些输入并使用优先级机制来决定流程的整体模式。

调度策略

调度策略因设备状态而异。如图 1 所示,浏览器会通过操作系统提供的 API 监控设备的电源状态,包括电池电量、充电状态和热状态。对于混合核心调度,下面定义了两个阶段。

第一个是正常阶段,表示电池电量超过20%或设备正在充电,同时热状态正常。在这个阶段,用户更关心性能而不是功耗,所以我们只将低优先级的线程/进程调度到高效的核心,如后台进程或处理低优先级任务的线程,如日志/分析。

第二个是临界阶段,这意味着电池电量非常低而没有充电,或者设备处于临界热状态,或者 Web 开发人员明确想要进入省电模式,例如使用省电元标记。在这个阶段,我们将采用更积极的策略来节省更多电量、延长设备使用时间或避免由于 CPU 温度过高而导致的热节流。在这种情况下,只要不涉及用户体验关键任务,许多正常优先级的线程/进程将被调度到高效核心。

操作系统支持工作

需要做一些工作才能使 Chrome 使用操作系统功能。电池和热状态是 UX 的两个重要因素。基于它们,Chrome 可以制定适当的策略来平衡性能和功耗。以前,只有电池状态会暴露给 Chrome。我们的团队在 Chrome 中实现了热状态通知功能。在该功能中,我们引入了 4 个热级别:标称、一般、严重和严重,指的是 Apple 的热提示 API。这样Chrome就可以得到实时的热状态。报告电池电量、充电和热状态后,Chrome 将决定进入哪个阶段并应用不同的调度策略。

此外,我们使用现有的 cgroup 机制在 Chrome OS 上的 Chrome 线程和高效内核之间建立了一座桥梁。后台优先级线程被放置在具有指定 CPU 集的特定 cgroup 中。在混合核心平台上,可能会为组分配高效的核心。所以如果我们想把不重要的线程调度到高效的核心去执行,我们可以降低线程优先级,把它们放到非紧急cgroup中。调度是动态的。当线程变得重要时(例如切换到前台),我们会立即将线程优先级提高到正常,从而从特定的 cgroup 中删除。

实验

我们使用本地构建的 Chromium 浏览器来评估每个场景混合核心调度的功率影响,目前主要关注后台渲染器进程、广告进程和空闲进程(空闲是 Chrome RAIL 模型中定义的状态)。根据在 Alder Lake Chromebook 上进行的实验,我们观察到在将空闲进程调度到高效核心时,网页浏览的 CPU 包功耗降低了 4.2%,调度广告进程时 CPU 包功耗降低了 3.8%。同时,我们使用 4-tab 浏览工作负载来测试将后台进程放置在高效内核上的功耗影响,发现 CPU 封装功耗降低了 0.9%。当后台标签和页面活动的数量增加时,省电会更大。

实验数据表明,我们利用 Chromium 浏览器中的混合核心功能将非 UX 关键进程/线程调度到选定场景中的高效核心,从而实现了明显的功耗降低,这有助于延长设备电池寿命。

未来的工作

我们会继续探索更多的场景,对性能要求不高,对应的进程/线程可以调度到高效核上。另外,对于ads、idle等一些场景,在高效核上运行可能会对性能产生影响,我们即将进行性能评估,并相应调整调度策略。此外,我们打算将我们的分析和混合核心调度优化扩展到 Windows 和 Linux 平台。

Baidu
map