您现在的位置是:首页 > 科技 >正文

2021年12月30日整理:了解谷歌如何试验和跟踪和改进Android功耗

发布时间:2021-12-30 09:45:44伏坚广来源:

导读 随着最新版本的 Android P 开发者预览版的发布,我们正在迅速走向另一个主要 Android 版本的最终版本。对于 Android P(即 9 0 版)

随着最新版本的 Android P 开发者预览版的发布,我们正在迅速走向另一个主要 Android 版本的最终版本。对于 Android P(即 9.0 版)而言,电池寿命是一个主要关注点。自适应电池功能将仅允许您使用的应用程序进行后台访问,设计了新的自动亮度方案,Android 团队对后台工作在 CPU 上的运行方式进行了更改。总之,电池寿命应该是面糊 (错误,更好)比以往任何时候都好。

为了更详细地了解所有这些是如何工作的,我们与两位 Android 工程师坐下来交谈:Android 框架组产品经理 Benjamin Poiesz 和 Android 高级软件工程师 Tim Murray。在我们第二次 Android 炉边聊天的过程中,我们了解了更多关于 Android P 的整体知识以及一些关于谷歌如何诊断和跟踪整个操作系统安装基础范围内的电池寿命的具体事情。

适合工作的合适 CPU 内核

首先是关于 CPU 核心亲和力的讨论。如今,多核 CPU 随处可见,而在台式机上,您会得到许多内核完全相同的 CPU,而在手机上,您通常会得到不同“大小”的内核,用于不同的工作负载. 在典型的八核 ARM 设计中,您会得到一个具有“big.LITTLE”架构的芯片。那是四个速度快且耗电的“大”内核和四个 速度较慢但更容易使用能源的“小”内核。让进程在大内核或小内核上运行会极大地影响它们使用的功率和运行速度。将进程分配给某个 CPU 或内核称为设置 CPU 亲和性。

Android P 正在改变 CPU 内核关联在后台进程中的工作方式,这应该可以节省大量的电池电量。在谷歌 I/O 主题演讲中,这是一次性的,但我认为这是第一次详细讨论它。

Tim Murray:自 2015 年以来,我们实际上一直在为 big.LITTLE 平台进行核心关联性工作。因此,这实际上是我最初致力于性能的原因。早在 2015 年 3 月左右,我实际上阅读了您关于 HTC One 的文章,这是第一款配备骁龙 810 的手机。

Murray 正在谈论 HTC One M9 评论,其中包括 Snapdragon 810 臭名昭著的散热问题。

Murray: 我读过它,我也大致了解了一些 Android 上的性能方面的东西,但我知道那一年我们在 Nexus 6P 上使用了骁龙 810。我读了这篇文章,你说,“嘿,它运行得很热。” 我不得不思考,“我想知道我们是否可以做得更好。” 所以,我开始考虑这个问题,并与我们内核团队和框架团队的人一起努力。我们想出了一种方法来控制来自 ActivityManager 的服务和特定进程的亲和性。

在 Android 中,“活动”是应用程序的单个屏幕,例如您的电子邮件收件箱,因此系统级服务“ActivityManager”执行它在罐头上所说的,它管理活动(和后台服务)——打开和根据请求或内存使用需要关闭它们。

Murray:通过 活动管理器服务,我们跟踪对用户而言重要的内容。我会说,将活动管理器服务视为一种“宏调度程序”。虽然内核调度程序在毫秒或微秒级别做出决策,但活动管理器服务会跟踪这些类型的宏交互,例如正在运行哪些服务?什么应用程序目前处于前台?用户实际上能感知到什么?例如,如果您正在运行导航和听音乐并且屏幕关闭,我们知道即使屏幕关闭并且您没有与手机交互,您也关心导航性能。你关心音乐表现。那个时候你可能不太关心其他的事情。

因此,我们开始使用活动管理器服务中的知识来实施关联控制。我们开始时非常简单,因此后台服务和缓存应用程序只能在小内核上运行。前台服务可以使用一些大核心,但不是全部,您当前与之交互的应用程序可以使用任何核心。当我们尝试这个时,它让我们大吃一惊。在我们尝试的每次测试中,每瓦性能都有两位数的百分比增长。所以,基本上,通知内核调度程序,限制内核调度程序什么对用户重要,使它能够做出更好的决策,从而导致更好的功率和性能权衡。

所以,我们已经这样做了很长时间,即使在 Pixel 1 上,它仍然是一个 big.LITTLE CPU,但它比其他 CPU 少很多 big.LITTLE。它在那里仍然有用,所以我们在所有事情上都使用了它。

我们在 P 中所做的是查看大内核上屏幕关闭时正在运行的内容,因为大内核比小内核消耗的功率要高得多。我们发现有很多与系统相关的东西正在运行。因此,它们是一种正在运行的系统服务。我们查看了其中有多少对性能至关重要,结果发现并不多——至少在屏幕关闭时。如果它们在屏幕关闭时对性能至关重要,那么它最终会被绑定为普通的前台服务或其他东西。还有一些其他的链会通知活动经理这个过程很重要。

在 P 中,我们所做的是,当您关闭屏幕时,这些类型的系统服务会移动到更受限制的 CPU 堆栈中。因此,与其能够使用所有小核和一些大核,我们只是将它们限制为仅使用小核,这样可以节省一些电池。它使您的电池更可预测,因为如果在屏幕关闭时系统服务将使用一定量的电量,现在功耗会显着降低,仅仅因为大核心比大核心大得多小核心,并因此获得更多的力量。

Ars:你说你从谷歌设备上的核心亲和力开始。我一直认为 CPU 调度取决于各个设备制造商。你认为这样的事情会在第三方东西上发生的定制中幸存下来吗?

Murray: 是的,我们确实看到它在第三方设备上使用过。它只是普通 Android 的一部分,因此您可以构建支持 CPU 集的 Android 映像,然后正确的事情就会发生。除了为其特定处理器设置 CPU 集之外,OEM 无需执行任何操作。这不是我们必须做的一些大的、侵入性的事情。这是我们如何从用户空间管理调度的一个非常简单的调整。

Ars:那么在此之前,系统是否从不费心将后台任务转移到其他核心?这只是一场混战?

Murray: 我不会说是免费的(笑)。在 2015 年之前,我们还没有深入研究作为 Nexus 一部分的 big.LITTLE SoC。OEM 有自己的方法来处理这个问题,但大部分时间都专注于内核调度程序,并纯粹在内核调度程序中做出决定以尝试获得相同的效果。我们真正做的就是让这一切变得明确,让任何没有使用的内核调度程序更容易——无论是 HMT 变体之一还是 EAS 或其他什么。我们让调度程序更容易做出正确的决定,在某种程度上降低内核调度程序的复杂性,因为您可以使用来自系统更高级别的所有这些信息。

Benjamin Poiesz:扩展一下,如果你愿意,当你有一个调度程序看到“嘿,有很多工作”时。它认为需要进行大量工作。它不明白是重要的工作还是不重要的工作,活动管理器可以教给下层子系统的东西越多,“嘿,用户正在积极参与某事,”或“这需要发生,但请尽可能高效地做这件事,”然后更明智的决定正在幕后发生。这是关键的事情之一。

要点是:当屏幕关闭时,可能不需要立即发生太多事情。你可以推断,“好吧,也许只是没有产生那么多的工作,所以 CPU 会保持在低位。” 但有时出于不同的原因,子系统,它会设置警报,设置作业,尝试进行处理。并没有真正的表达方式,“我有很多事情要做,但随时做。” 这为我们提供了一种更好的方式来做到这一点,这种方式更加隐含,而不是询问我们所有的工程师,“请标记什么重要或不重要。” 那会很难。这使它更加隐含。

标签:

上一篇
下一篇