产品资讯

提升 Android 性能:推出适用于内核的 AutoFDO

阅读用时:4 分钟
查看 Charles Munger 的个人资料
Yabin Cui 软件工程师

我们是 Android LLVM 工具链团队。我们的首要任务之一是通过 LLVM 生态系统中的优化技术来提升 Android 性能。我们一直在探索各种方式,力求让 Android 变得更快、更流畅、更高效。虽然我们的大部分优化工作都在用户空间中进行,但内核仍然是系统的核心。今天,我们很高兴与大家分享如何将自动反馈导向优化 (AutoFDO) 引入 Android 内核,从而为用户带来显著的性能提升。

什么是 AutoFDO?

在标准软件构建过程中,编译器会根据静态代码提示做出数千个小决策,例如是否内联函数以及可能采用哪个条件分支。虽然这些启发式方法很有用,但它们并不总是能准确预测手机实际使用期间的代码执行情况。

AutoFDO 通过使用实际执行模式来指导编译器,从而改变了这一现状。这些模式代表代码在实际使用过程中最常见的指令执行路径,通过记录 CPU 的分支历史记录来捕获。虽然这些数据可以从机群设备中收集,但对于内核,我们会在实验室环境中使用代表性工作负载(例如运行前 100 个最热门的应用)来合成这些数据。我们使用采样性能分析器来捕获这些数据,以识别代码的哪些部分是“热”(经常使用)和哪些部分是“冷”。当我们使用这些配置文件重新构建内核时,编译器可以根据实际的 Android 工作负载做出更明智的优化决策。

为了解此优化的影响,请考虑以下关键事实:

  • 在 Android 上,内核约占 CPU 时间的 40%。
  • 我们已经在使用 AutoFDO 来优化用户空间中的原生可执行文件和库,从而将应用冷启动时间缩短了约 4%,并将启动时间缩短了 1%。

实际性能提升

通过利用受控实验室环境中的配置文件,我们发现 Android 的关键指标有了显著提升。这些配置文件是通过应用抓取和启动收集的,并在搭载 6.1、6.6 和 6.12 内核的 Pixel 设备上进行了测量。

最显著的改进如下。如需详细了解这些内核版本的 AutoFDO 配置文件,请参阅 android16-6.12 和 android15-6.6 内核的相应 Android 内核代码库。

boosting_2.png

这些不仅仅是理论上的数字。这些改进可为最终用户带来更流畅的界面、更快的应用切换速度、更长的电池续航时间,以及整体响应更迅速的设备。

运作方式:流水线

我们的部署策略涉及一个复杂的流水线,以确保配置文件保持相关性,并且性能保持稳定。

boosting_3.png

第 1 步:收集性能分析数据

虽然我们依靠内部测试设备群来分析用户空间二进制文件,但我们已改用受控实验室环境来分析通用内核映像 (GKI)。将性能分析与设备发布周期解耦,可实现灵活、即时的更新,而不受已部署内核版本的影响。至关重要的是,测试证实,这些基于实验室的数据带来的性能提升与实际车队带来的性能提升相当。

  • 工具和环境:我们使用最新的内核映像刷写测试设备,并使用 simpleperf 捕获指令执行流。此过程依赖于硬件功能来记录分支历史记录,具体而言,在 Pixel 设备上利用了  ARM 嵌入式跟踪扩展 (ETE) 和 ARM 跟踪缓冲区扩展 (TRBE)。
  • 工作负载:我们使用 Android 应用兼容性测试套件 (C-Suite) 中最受欢迎的前 100 个应用构建了一个具有代表性的工作负载。为了捕获最准确的数据,我们重点关注以下方面:
    • 应用启动:针对最明显的用户延迟进行优化
    • AI 驱动的应用抓取:模拟连续、不断演变的用户互动
    • 系统级监控:不仅捕获前台应用活动,还捕获关键后台工作负载和进程间通信
  • 验证:此合成工作负载与从内部机群收集的执行模式有 85% 的相似度。
  • 目标数据:通过充分重复这些测试,我们能够捕获高保真执行模式,这些模式准确地代表了真实用户与最热门应用的互动。此外,这个可扩展的框架使我们能够无缝集成更多工作负载和基准,从而扩大覆盖范围。

第 2 步:处理配置文件

我们会对原始跟踪数据进行后处理,以确保其干净、有效,并可供编译器使用。

  • 汇总:我们将多次测试运行和多个设备的数据整合到一个系统视图中。
  • 转换: 我们将原始跟踪记录转换为 AutoFDO 配置文件格式,并根据需要滤除不需要的符号。
  • 配置文件修剪:我们会修剪配置文件,以移除“冷”函数的数据,从而允许这些函数使用标准优化。这可以防止很少使用的代码发生回归,并避免不必要地增加二进制文件大小。

第 3 步:配置文件测试

在部署之前,配置文件会经过严格验证,以确保它们能够持续提升性能,而不会带来稳定性风险。

  • 配置文件和二进制文件分析:我们会严格比较新配置文件的内容(包括热函数、样本计数和配置文件大小)与先前版本。我们还使用该配置文件构建新的内核映像,分析二进制文件以确保对文本部分的更改符合预期。
  • 性能验证:我们对新内核映像运行有针对性的基准测试。这可确认它保持了先前基准所确立的性能提升。

持续更新

代码会随着时间的推移自然“漂移”,因此静态配置文件最终会失去其有效性。为了保持最佳性能,我们会持续运行流水线,以推动定期更新:

  • 定期刷新:我们会在每个 GKI 版本发布之前刷新 Android 内核 LTS 分支中的配置文件,确保每个 build 都包含最新的配置文件数据。
  • 未来扩展:我们目前正在向 android16-6.12 和 android15-6.6 分支提供这些更新,并将扩展对更新的 GKI 版本(例如即将推出的 android17-6.18)的支持。

确保稳定性

关于配置文件引导的优化,一个常见问题是它是否会带来稳定性风险。由于 AutoFDO 主要影响编译器启发法(例如函数内联和代码布局),而不是更改源代码的逻辑,因此它会保留内核的功能完整性。这项技术已经过大规模验证,多年来一直是 Android 平台库、ChromeOS 和 Google 自身服务器基础架构的标准优化手段。

为了进一步保证行为的一致性,我们采用了“默认保守”策略。高保真配置文件中未捕获的函数会使用标准编译器方法进行优化。这可确保内核中“冷”或很少执行的部分的行为与标准 build 中的行为完全相同,从而防止在极端情况下出现性能下降或意外行为。

展望未来

我们目前正在 android16-6.12 和 android15-6.6 分支中部署 AutoFDO。除了此次初步推出,我们还看到了进一步增强该技术的几个前景广阔的途径:

  • 扩大覆盖范围:我们期待将 AutoFDO 配置文件部署到更新的 GKI 内核版本,以及当前 aarch64 支持之外的其他 build 目标。
  • GKI 模块优化:目前,我们的优化重点是主内核二进制文件 (vmlinux)。将 AutoFDO 扩展到 GKI 模块可以为更大一部分内核子系统带来性能优势。
  • 供应商模块支持:我们还希望为使用驱动程序开发套件 (DDK) 构建的供应商模块提供 AutoFDO 支持。我们的构建系统 (Kleaf) 和性能分析工具 (simpleperf) 已提供相关支持,因此供应商可以将这些相同的优化技术应用于其特定的硬件驱动程序。
  • 更广泛的配置文件覆盖范围:有可能从更广泛的关键用户历程 (CUJ) 中收集配置文件,以对其进行优化。

通过将 AutoFDO 引入 Android 内核,我们确保了操作系统的基础部分能够根据您每天使用设备的方式进行优化。

继续阅读