提取构建性能指标

报告问题 查看源代码

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

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

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

  3. 如果某个目标类别具有代表性的目标(例如自定义规则),那么诊断和修复一个 build 中的问题可能有助于更大规模地解决问题。

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

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

构建事件协议 (BEP)

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

Bazel 的查询 / 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 标志,以写出有关所执行操作及其相互依赖关系的日志。

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

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

使用 bazel-bench 进行基准测试

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

  • 项目基准:在单个 Bazel 版本中,对两个 git 提交相互进行基准化分析。用于检测 build 中的回归问题(通常通过添加依赖项来实现)。

  • Bazel 基准:在单次 Git 提交中,对两个版本的 Bazel 进行基准测试。用于检测 Bazel 本身中的回归情况(如果您碰巧对 Bazel 进行维护 / 派生)。

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

我们还建议您在没有运行其他进程的专用物理机器上运行 Bazel 台,以减少变化来源。