如何使用 Bencher 在 CI 中跟踪基准测试


大多数基准测试结果都是短暂的。 它们在你的终端回滚到限制处时就会消失。 一些基准测试工具允许你缓存结果,但大多数只在本地这样做。 Bencher 允许你跟踪来自本地和 CI 运行的基准测试,并比较结果, 同时仍然使用你最喜欢的基准测试工具

当在 CI 中进行持续性基准测试时,比较基准测试结果有两种流行的方法:

  • 统计型持续基准测试
    1. 随时间跟踪基准测试结果以创建基线
    2. 使用这个基线以及统计阈值创建一个统计边界
    3. 将新结果与这个统计边界进行比较以检测性能退化
  • 相对性持续基准测试
    1. 为当前的基线代码运行基准测试
    2. 使用百分比阈值为基线代码创建一个边界
    3. 转换到代码的新版本
    4. 为代码的新版本运行基准测试
    5. 将新版本代码的结果与基线代码的结果进行比较以检测性能退化

统计持续基准测试

接着快速开始Docker 自托管教程, 让我们为我们的 Save Walter White 项目添加统计持续基准测试功能。

🐰 确保你已经 创建了一个 API 令牌并将其设置为 BENCHER_API_TOKEN 环境变量 再继续前行!

首先,我们需要创建一个新的 Testbed 来代表我们的 CI 运行器,适当命名为 ci-runner

bencher testbed create \
--name ci-runner \
save-walter-white-1234abcd
  1. 使用 bencher testbed create CLI 子命令。 更多详情参见 the testbed create docs。 (例如: bencher testbed create)
  2. --name 选项设置为所需的 Testbed 名称。 (例如: --name ci-runner)
  3. 将项目参数指定为 Save Walter White 项目的 slug。 (例如: save-walter-white-1234abcd)

接下来,我们需要为 ci-runner Testbed 创建一个新的阈值

bencher threshold create \
--branch main \
--testbed ci-runner \
--measure Latency \
--test t-test \
--upper-boundary 0.95 \
save-walter-white-1234abcd
  1. 使用 bencher threshold create CLI 子命令。 更多详情参见 the threshold create docs。 (例如: bencher threshold create)
  2. --branch 选项设置为默认的 main 分支。 (例如: --branch main)
  3. --branch 选项设置为新的 ci-runner Testbed。 (例如: --testbed ci-runner)
  4. --measure 选项设置为 bencher mock 生成的内置 Latency 测量值。 更多详情参见 the definition of Measure。 (例如: --measure Latency)
  5. --test 选项设置为 t-test 阈值。 更多详情参见 Thresholds & Alerts。 (例如: --test t-test)
  6. --upper-boundary 选项设置为上限值 0.95。 更多详情参见 Thresholds & Alerts。 (例如: --upper-boundary 0.95)
  7. 将项目参数指定为 Save Walter White 项目的 slug。 (例如: save-walter-white-1234abcd)

现在我们已经准备好在 CI 中运行我们的基准测试了。 因为每个 CI 环境都有一点不同, 下面的示例更多的是说明性的,而不是实用性的。 更具体的示例,请参见 GitHub Actions 中的持续基准测试GitLab CI/CD 中的持续基准测试

我们需要通过在 CI 中针对每次更改进行基准测试来为我们的 main 分支创建并维护历史基准:

bencher run \
--project save-walter-white-1234abcd \
--branch main \
--testbed ci-runner \
--adapter json \
--err \
bencher mock
  1. 使用 bencher run CLI 子命令 运行您的 feature-branch 分支基准测试。 更多详情参见 the bencher run CLI subcommand。 (例如: bencher run)
  2. --project 选项设置为项目 slug。 更多详情参见 the --project docs。 (例如: --project save-walter-white-1234abcd)
  3. --branch 选项设置为默认的分支名称。 更多详情参见 branch selection。 (例如: --branch main)
  4. --testbed 选项设置为 Testbed 名称。 更多详情参见 the --tested docs。 (例如: --testbed ci-runner)
  5. --adapter 选项设置为所需的基准测试适配器适配器。 更多详情参见 benchmark harness adapters。 (例如: --adapter json)
  6. --err 标志设置为在生成警报时失败命令。 更多详情参见 Threshold & Alerts。 (例如: --err)
  7. 指定基准命令参数。 更多详情参见 benchmark command。 (例如: bencher mock)

最后,我们准备好在 CI 中捕获性能回归了。 这是我们如何在 CI 中跟踪一个名为 feature-branch 的新功能分支的性能:

bencher run \
--project save-walter-white-1234abcd \
--branch feature-branch \
--branch-start-point main \
--branch-start-point-hash 32aea434d751648726097ed3ac760b57107edd8b \
--testbed ci-runner \
--adapter json \
--err \
bencher mock
  1. 使用 bencher run CLI 子命令 运行您的 feature-branch 分支基准测试。 更多详情参见 the bencher run CLI subcommand。 (例如: bencher run)
  2. --project 选项设置为项目 slug。 更多详情参见 the --project docs。 (例如: --project save-walter-white-1234abcd)
  3. --branch 选项设置为功能分支名称。 更多详情参见 branch selection。 (例如: --branch feature-branch)
  4. --branch-start-point 选项设置为功能分支的起点。 更多详情参见 branch selection。 (例如: --branch-start-point main)
  5. --branch-start-point-hash 选项设置为功能分支起点的 git 哈希值。 更多详情参见 branch selection。 (例如: --branch-start-point-hash 32ae...dd8b)
  6. --testbed 选项设置为 Testbed 名称。 更多详情参见 the --tested docs。 (例如: --testbed ci-runner)
  7. --adapter 选项设置为所需的基准测试适配器适配器。 更多详情参见 benchmark harness adapters。 (例如: --adapter json)
  8. --err 标志设置为在生成警报时失败命令。 更多详情参见 Threshold & Alerts。 (例如: --err)
  9. 指定基凘命令参数。 更多详情参见 benchmark command。 (例如: bencher mock)

在 CI 中首次运行此命令时, 它会创建 feature-branch 分支,因为它之前不存在。 新的 feature-branch 将使用哈希值为 32aea434d751648726097ed3ac760b57107edd8bmain 分支作为其起点。 这意味着 feature-branch 将拥有 main 分支所有的数据和阈值来对 bencher mock 的结果进行对比, 无论是第一次还是后续运行。

相对连续基准测试

基于我们在快速开始Docker 自托管教程中的内容,现在让我们为我们的“拯救沃尔特·怀特”项目添加相对连续基准测试

🐰 确保你已经 创建了一个 API 令牌,并将其设置为 BENCHER_API_TOKEN 环境变量 再继续!

首先,我们需要创建一个新的 Testbed 来代表我们的 CI 运行器,恰当地命名为 ci-runner

bencher testbed create \
--name ci-runner \
save-walter-white-1234abcd
  1. 使用 bencher testbed create CLI 子命令。 查看 “testbed create”文档 获取更多详情。 (例如:bencher testbed create)
  2. 设置 --name 选项为所需的 Testbed 名称。 (例如:--name ci-runner)
  3. 指定项目参数为 Save Walter White 项目的 slug。 (例如:save-walter-white-1234abcd)

相对连续基准测试通过对代码的两个版本进行并排比较。 这在处理资源在运行之间可能高度变化的嘈杂 CI/CD 环境时很有用。 在这个示例中,我们将比较在 main 分支上运行的结果与在名为 feature-branch 的特性分支上运行的结果。 因为每个CI环境都有些许不同,以下示例意在说明而非实用。 更具体的示例,参见GitHub Actions 中的连续基准测试GitLab CI/CD 中的连续基准测试

首先,我们需要在 CI 中用 git 检出 main 分支:

git checkout main

然后我们需要在 CI 中在 main 分支上运行我们的基准测试:

bencher run \
--project save-walter-white-1234abcd \
--branch feature-branch \
--branch-reset \
--testbed ci-runner \
--adapter json \
bencher mock
  1. 使用 bencher run CLI 子命令 来运行你的 main 分支基准测试。 参见 “bencher run” CLI 子命令 以获得完整概览。 (例如:bencher run)
  2. 设置 --project 选项为项目 slug。 参见 “—project” 文档 获取更多细节。 (例如:--project save-walter-white-1234abcd)
  3. 设置 --branch 选项为特性分支名称。 参见 分支选择 以获得完整概览。 (例如:--branch feature-branch)
  4. 设置 --branch-reset 标志。 参见 分支选择 以获得完整概览。 (例如:--branch-reset)
  5. 设置 --testbed 选项为 Testbed 名称。 参见 “—tested” 文档 获取更多细节。 (例如:--testbed ci-runner)
  6. 设置 --adapter 选项为所需的基准测试适配器。 参见 基准测试适配器 以获得完整概览。 (例如:--adapter json)
  7. 指定基准测试命令参数。 参见 基准测试命令 以获得完整概览。 (例如:bencher mock)

这个命令在 CI 中首次运行时, 将会创建 feature-branch 分支,因为它还不存在。 新的 feature-branch 不会有起点、现有数据或阈值。 在后续运行中,旧的 feature-branch 将被重命名, 并创建一个没有起点、现有数据或阈值的新 feature-branch

接下来,我们需要在 CI 中为我们新的 feature-branch 分支创建一个新的阈值

bencher threshold create \
--branch feature-branch \
--testbed ci-runner \
--measure Latency \
--test percentage \
--upper-boundary 0.25 \
save-walter-white-1234abcd
  1. 使用 bencher threshold create CLI 子命令。 查看 “threshold create” 文档 以获得更多详情。 (例如:bencher threshold create)
  2. 设置 --branch 选项为新的 feature-branch 分支。 (例如:--branch feature-branch)
  3. --branch 选项设置为 ci-runner Testbed。 (例如:--testbed ci-runner)
  4. 设置 --measure 选项为 bencher mock 生成的内置 Latency 度量。 查看 度量定义 了解详情。 (例如:--measure Latency)
  5. 设置 --test 选项为一个 percentage 阈值。 参见 阈值 & 警告 以获得完整概览。 (例如:--test t-test)
  6. 设置 --upper-boundary 选项为 0.25(即 25%)的上界。 参见 阈值 & 警告 以获得完整概览。 (例如:--upper-boundary 0.25)
  7. 指定项目参数为 Save Walter White 项目 slug。 (例如:save-walter-white-1234abcd)

然后,我们需要在 CI 中用 git 检出 feature-branch 分支:

git checkout feature-branch

最后,我们准备在 CI 中运行我们的 feature-branch 基准测试:

bencher run \
--project save-walter-white-1234abcd \
--branch feature-branch \
--testbed ci-runner \
--adapter json \
--err \
bencher mock
  1. 使用 bencher run CLI 子命令 来运行你的 feature-branch 基准测试。 参见 “bencher run” CLI 子命令 以获得完整概览。 (例如:bencher run)
  2. 设置 --project 选项为项目 slug。 参见 “—project” 文档 获取更多细节。 (例如:--project save-walter-white-1234abcd)
  3. 设置 --branch 选项为特性分支名称。 参见 分支选择 以获得完整概览。 (例如:--branch feature-branch)
  4. 设置 --testbed 选项为 Testbed 名称。 参见 “—tested” 文档 获取更多细节。 (例如:--testbed ci-runner)
  5. 设置 --adapter 选项为所需的基准测试适配器。 参见 基准测试适配器 以获得完整概览。 (例如:--adapter json)
  6. 设置 --err 标志以在生成警告时失败命令。 参见 阈值 & 警告 以获得完整概览。 (例如:--err)
  7. 指定基准测试命令参数。 参见 基准测试命令 以获得完整概览。 (例如:bencher mock)

每次在 CI 中运行此命令时, 它都仅将 feature-branch 的结果与 main 的最新结果进行比较。



🐰 恭喜!您已经学会了如何使用 Bencher 在 CI 中跟踪基准测试!🎉


将 Bencher 添加到 GitHub Actions ➡

将 Bencher 添加到 GitLab CI/CD ➡

🤖 该文档由 OpenAI GPT-4 自动生成。 它可能不准确并且可能包含错误。 如果您发现任何错误,请在 GitHub 上提出问题.


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Mon, April 1, 2024 at 7:00:00 AM UTC