可能每位 Bazel 用户都遇到过构建 符合预期。提升各个 build 的性能具有特定的价值 具有重大影响的目标,例如:
经常迭代和(重新)构建的核心开发者目标。
其他目标广泛依赖的通用库。
诊断和解决一个 build 中的问题,可能有助于解决更大规模的问题。
提高构建性能的一个重要步骤是了解 资源占用。本页面列出了您可以收集的不同指标。拆解 build 性能展示了如何使用这些指标检测和解决 build 性能问题。
从 Bazel build 中提取指标的主要方式有以下几种:
构建事件协议 (BEP)
Bazel 可输出各种协议缓冲区
build_event_stream.proto
通过 Build Event Protocol (BEP) 实现,该协议
可以由您指定的后端进行汇总。根据您的使用场景
您可能会决定以各种方式汇总指标
了解一些通常比较有用的概念和 proto 字段。
Bazel 的 query/cquery/aquery 命令
Bazel 提供 3 种不同的查询模式(查询、 cquery 和 aquery)。 查询目标图表、已配置的目标图表和操作图表 。查询语言提供了一组可在不同查询模式下使用的函数,可让您根据需要自定义查询。
JSON 跟踪配置文件
对于每个类似构建的 Bazel 调用,Bazel 都会以 JSON 格式写入轨迹配置文件。JSON 轨迹配置文件非常有助于快速了解 Bazel 在调用期间花费了时间在哪些方面。
执行日志
执行日志可帮助您排查和解决因机器和环境差异或非确定性操作而导致的远程缓存命中次数不足的问题。如果您将
--experimental_execution_log_spawn_metrics
(可从 Bazel 5.2 中获取)它还包含详细的生成指标,
本地和远程执行的操作。例如,您可以使用这些指标来比较本地机器性能与远程机器性能,或者找出 spawn 执行过程中哪个部分始终比预期慢(例如,由于排队)。
执行图日志
虽然 JSON 跟踪记录配置文件包含关键路径信息,但有时
您需要有关所执行操作的依赖关系图的其他信息。
从 Bazel 6.0 开始,您可以将 flag 传递给
--experimental_execution_graph_log
和
--experimental_execution_graph_log_dep_type=all
,用于写出
执行的操作及其相互依存关系。
您可以使用这些信息来了解关键路径上的节点添加的拖动时间。拖拽操作是可能节省的时间 方法是从执行图中移除特定节点。
这些数据有助于您预测更改对 build 和操作图的影响 然后再进行实际操作
使用 bazel-bench 进行基准测试
Bazel bench 是一款适用于 Git 项目的基准测试工具,可在以下情况下对构建性能进行基准测试:
项目基准:在 运行一个 Bazel 版本用于检测 build 中的回归问题(通常通过添加依赖项)。
Bazel 基准:在 只需进行一次 git 提交用于检测 Bazel 本身中的回归问题(如果您 恰好维护 / 复刻 Bazel 而发生的情况)。
基准测试会监控实际时间、CPU 时间和系统时间,以及 Bazel 的保留堆大小。
我们还建议在未运行其他进程的专用物理机器上运行 Bazel 基准测试,以减少变异来源。