提取构建性能指标

报告问题 查看源代码 每夜版 · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

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

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

您可以采用以下几种主要方式从 Bazel build 中提取指标:

Build Event Protocol (BEP)

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

Bazel 的 query / cquery / aquery 命令

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

JSON 轨迹配置文件

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

执行日志

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

执行图日志

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

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

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

使用 bazel-bench 进行基准化分析

Bazel bench 是一款 Git 项目的基准比较工具,用于在以下情况下对 build 性能进行基准比较:

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

  • Bazel 基准比较:在单个 Git 提交中对两个版本的 Bazel 进行基准比较。用于检测 Bazel 本身是否存在回归问题(如果您恰好维护 / 派生了 Bazel)。

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

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