可能每位 Bazel 用户都遇到过构建 符合预期。提升各个 build 的性能具有特定的价值 具有重大影响的目标,例如:
经常迭代和(重新)构建的核心开发者目标。
其他目标广泛依赖于通用库。
一组目标(例如自定义规则)中具有代表性的定位条件; 诊断并修复一个 build 中的问题可能有助于解决 规模更大。
提高构建性能的一个重要步骤是了解 资源占用。本页面列出了您可以收集的不同指标。 细分构建性能展示 如何使用这些指标检测和修复 build 性能问题。
从 Bazel 构建中提取指标主要有以下几种方法:
构建事件协议 (BEP)
Bazel 可输出各种协议缓冲区
build_event_stream.proto
通过 Build Event Protocol (BEP) 实现,该协议
可以由您指定的后端进行汇总。根据您的使用场景
您可能会决定以各种方式汇总指标
了解一些通常比较有用的概念和 proto 字段。
Bazel 的查询 / cquery / aquery 命令
Bazel 提供 3 种不同的查询模式(查询、 cquery 和 aquery)。 查询目标图表、已配置的目标图表和操作图表 。查询语言提供 一系列函数,可在 Google Cloud 各个平台 查询模式,以便根据需要自定义查询。
JSON 跟踪配置文件
每次执行类似 build 的 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 基准:在 Bazel 中, 只需进行一次 Git 提交用于检测 Bazel 本身中的回归问题(如果您 恰好维护 / 复刻 Bazel 而发生的情况)。
基准测试会监控实际用时、CPU 时间和系统时间和 Bazel 保留的时间 堆大小。
我们还建议您在专用物理机器上运行 Bazel 台, 不运行其他进程,以减少可变性。