提取构建性能指标

报告问题 查看源代码

每位 Bazel 用户都可能会遇到构建速度过慢或比预期快的构建。提升各个 build 的性能对于具有重大影响的目标具有特别的价值,例如:

  1. 经常迭代和(重新)构建的核心开发者目标。

  2. 受其他目标影响广泛的常见库。

  3. 在一个 build 中生成一类代表性目标(例如自定义规则)有助于诊断和修复 build 中存在的问题,或许有助于更大规模地解决问题。

提高构建性能的重要步骤是了解资源的使用位置。本页面列出了您可以收集的不同指标。细分构建性能一文说明了如何使用这些指标检测和修复构建性能问题。

从 Bazel 构建中提取指标的主要方法有以下几种:

构建事件协议 (BEP)

Bazel 通过构建事件协议 (BEP) build_event_stream.proto输出各种协议缓冲区,该缓冲区可通过您指定的后端进行汇总。根据您的用例,您可能会决定以各种方式聚合指标,但在这里,我们将介绍一些通常有用的概念和 proto 字段。

Bazel 的查询 / cquery / aquery 命令

Bazel 提供了 3 种不同的查询模式(查询cqueryaquery),可让用户分别查询目标图、配置的目标图和操作图。查询语言提供可在不同查询模式下使用的函数套件,您可以根据自己的需求对查询进行自定义。

JSON 跟踪配置文件

对于每次类似 build 的 Bazel 调用,Bazel 都会以 JSON 格式编写跟踪配置文件。JSON 跟踪记录配置文件非常有用,可让您快速了解 Bazel 在调用期间花费的时间。

执行日志

执行日志可帮助您排查和修复由于机器和环境的差异或不确定性操作而缺少的远程缓存命中。如果您传递 --experimental_execution_log_spawn_metrics 标志(可通过 Bazel 5.2 获得),该标志还将包含针对本地和远程执行的操作的详细衍生指标。例如,您可以使用这些指标比较本地机器和远程机器的性能,或了解生成部分的哪个部分一直比预期慢(例如,由于排队)。

执行图日志

虽然 JSON 跟踪记录配置文件包含关键路径信息,但有时您需要有关已执行操作的依赖关系图的更多信息。从 Bazel 6.0 开始,您可以传递 --experimental_execution_graph_log--experimental_execution_graph_log_dep_type=all 标志,以写出有关已执行操作及其相互依赖行为的日志。

此信息可用于了解节点在关键路径上添加的拖动操作。拖动是指从执行图中移除特定节点,有可能节省的时间。

这些数据可帮助您在实际执行更改前预测对构建和操作图所做的更改的影响。

使用 bazel-bench 进行基准测试

Bazel bench 是一款基准工具,可让 Git 项目在以下情况下对 build 性能进行基准测试:

  • 项目基准测试:在单个 Bazel 版本中,对两个 Git 提交进行基准测试。用于检测构建中的回归问题(通常是通过添加依赖项来实现)。

  • Bazel 基准测试:在单次 Git 提交时,对两个版本的 Bazel 进行基准测试。用于检测 Bazel 本身的回归情况(如果您正进行维护 / 创建 Bazel 分支)。

基准测试会监控实际用时、CPU 时间和系统时间,以及 Bazel 保留的堆大小。

我们还建议在未运行其他进程的专用物理机器上运行 Bazel 长椅,以减少可变性来源。