提取构建性能指标

报告问题 查看源代码 每夜 build · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

可能每个 Bazel 用户都遇到过构建速度缓慢或比预期更慢的情况。提高各个 build 的性能对于影响重大的目标特别有用,例如:

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

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

  3. 诊断和修复一个 build 中的问题,有助于解决更大规模的问题。

若要提升 build 的性能,了解资源的消耗情况是一项重要步骤。本页列出了您可以收集的不同指标。拆解 build 性能展示了如何使用这些指标检测和解决 build 性能问题。

从 Bazel build 中提取指标的主要方式有以下几种:

构建事件协议 (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 以写出有关已执行操作及其相互依赖项的日志。

您可以使用这些信息来了解关键路径上的节点添加的拖延时间。拖延时间是指从执行图中移除特定节点后可能节省的时间量。

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

使用 bazel-bench 进行基准测试

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

  • 项目基准测试:在单个 Bazel 版本下对两个 git 提交进行基准测试。用于检测 build 中的回归问题(通常通过添加依赖项)。

  • Bazel 基准测试:在单个 Git 提交中对两个版本的 Bazel 进行基准测试。用于检测 Bazel 本身中的回归问题(如果您恰好维护 / 分叉 Bazel)。

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

我们还建议在未运行其他进程的专用物理机器上运行 Bazel 基准测试,以减少变异来源。