提取构建性能指标

可能每位 Bazel 用户都遇到过构建速度缓慢或比预期慢的情况。对于具有重大影响的目标(例如以下目标),提高单个构建的性能具有特殊价值 :

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

  2. 其他目标广泛依赖的常用库。

  3. 来自目标类(例如自定义规则)的代表性目标, 诊断和修复一个构建中的问题可能有助于大规模解决问题。

提高构建性能的一个重要步骤是了解资源的使用情况。本页列出了您可以收集的不同指标。 构建性能细分展示了 如何使用这些指标来检测和修复构建性能问题。

从 Bazel 构建中提取指标有几种主要方法,即:

Build Event Protocol (BEP)

Bazel 通过 Build Event Protocol (BEP) 输出各种协议缓冲区 build_event_stream.proto ,这些缓冲区 可以由您指定的后端进行汇总。根据您的使用场景, 您可能会决定以各种方式汇总指标,但在这里,我们将介绍一些通常有用的概念和 proto 字段。

Bazel 的 query / cquery / aquery 命令

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

JSON 跟踪配置文件

对于每个类似构建的 Bazel 调用,Bazel 都会以 JSON 格式写入跟踪配置文件。JSON 跟踪配置文件对于 快速了解 Bazel 在调用期间花费的时间非常 有用。

执行日志

执行日志可以帮助您排查和修复 因机器和环境差异或 不确定性操作而导致的远程缓存未命中问题。如果您传递标志 --experimental_execution_log_spawn_metrics (从 Bazel 5.2 开始提供),它还将包含详细的 spawn 指标,包括 本地和远程执行的操作。例如,您可以使用这些指标来 比较本地和远程机器的性能,或者找出 spawn 执行的哪个部分始终比预期慢(例如,由于排队)。

执行图日志

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

此信息可用于了解关键路径上的节点所增加的拖动。拖动是指从执行图中移除特定节点后可能节省的时间量 。

这些数据有助于您在实际更改构建图和操作图之前预测更改的影响 。

使用 bazel-bench 进行基准测试

Bazel bench 是一款适用于 Git 项目的 基准测试工具,用于在 以下情况下对构建性能进行基准测试:

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

  • Bazel 基准测试: 在 单个 Git 提交中,针对两个 Bazel 版本相互进行基准测试。用于检测 Bazel 本身中的回归(如果您 恰好维护 / 派生 Bazel)。

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

此外,建议在未运行其他进程的专用物理机器上运行 Bazel bench,以减少变异来源。