Docker 自托管


什么是Bencher?

Bencher是一套持续型的性能基准测试工具。 你是否曾经因为性能回归影响到了你的用户? Bencher可以防止这种情况的发生。 Bencher让你有能力在性能回归进入生产环境 之前 就进行检测和预防。

  • 运行: 使用你喜爱的基准测试工具在本地或CI中执行你的基准测试。bencher CLI简单地包装了你现有的基准测验设备并存储其结果。
  • 追踪: 追踪你的基准测试结果的趋势。根据源分支、测试床和度量,使用Bencher web控制台来监视、查询和绘制结果图表。
  • 捕获: 在CI中捕获性能回归。Bencher使用最先进的、可定制的分析技术在它们进入生产环境之前就检测到性能回归。

基于防止功能回归的原因,在CI中运行单元测试,我们也应该使用Bencher在CI中运行基准测试以防止性能回归。性能问题就是错误!


Bencher是开源且可自我托管的。 如果你对使用Bencher Cloud感兴趣,请查看Bencher Cloud快速启动教程。 此教程将帮助你使用Docker设置Bencher自我托管。

🐰 一旦您对使用Bencher Self-Hosted感到舒适,请考虑查看以下资源:


安装 Docker

为了在本教程中运行 UI 和 API 服务器,你需要安装 docker。 检查你是否已经安装了 docker

运行:docker --version

你应该会看到类似这样的信息:

$ docker --version
Docker version 20.10.17, build 100c701

即使你的版本号不同也没关系,关键是这个命令能够正常工作。 如果不能,请按照安装 docker 的说明进行操作。


安装 bencher 命令行工具

Linux,Mac,& Unix

对于 Linux,Mac 和其他 Unix 类操作系统,请在你的终端运行以下命令:

Terminal window
curl --proto '=https' --tlsv1.2 -sSfL https://bencher.dev/download/install-cli.sh | sh

Windows

对于 Windows 操作系统,打开 PowerShell 终端,然后运行以下命令:

Terminal window
irm https://bencher.dev/download/install-cli.ps1 | iex

🐰 如果你遇到一个错误,显示 running scripts is disabled on this system(此系统上已禁止运行脚本):

  • 管理员身份运行 Powershell
  • 运行:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • 输入:Y
  • 重新运行此脚本

更多安装选项,请查看如何安装 bencher 命令行工具

现在,让我们测试一下我们是否已经安装了 bencher 命令行工具。

运行:bencher --version

你应该会看到:

$ bencher --version
bencher 0.3.26

运行 Bencher UI 和 API 服务器

有了 docker 的安装,我们现在可以运行 UI 和 API 服务器。

运行:bencher up

你应该会看到类似这样的内容:

$ bencher up
Pulling `ghcr.io/bencherdev/bencher-api:latest` image...
Creating `bencher_api` container...
Starting `bencher_api` container...
Pulling `ghcr.io/bencherdev/bencher-console:latest` image...
Creating `bencher_console` container...
Starting `bencher_console` container...
🐰 Bencher Self-Hosted is up and running!
Web Console: http://localhost:3000
API Server: http://localhost:61016
Press Ctrl+C to stop Bencher Self-Hosted.
🐰 Bencher Self-Hosted logs...
Jan 08 16:49:07.727 INFO 🐰 Bencher API Server v0.4.2
...

再次说明,如果你的输出有所不同也没关系。重要的是这个命令可以正常工作。

🐰 如果你从 ghcr.io 得到了一个错误: "需要身份认证" 尝试运行:docker logout ghcr.io

🐰 在 Windows 上,如果你得到了一个错误: 此平台上无法使用"linux"操作系统的镜像:操作系统不受支持 尝试运行:& 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchLinuxEngine

Bencher API 服务器日志

由于我们还没有在 API 服务器上设置电子邮件/SMTP, 所以你在教程后面收到的确认码会在服务器日志中,如上所示。 也就是说,身份验证凭据将显示在 bencher up 的输出中。


设置 Bencher 主机

bencher CLI 默认的主机是 Bencher 云 (即 https://api.bencher.dev)。 因此,我们需要设定你的主机名。最简单的方法就是使用 BENCHER_HOST 环境变量。

打开一个新的终端窗口。

在 Linux,Mac 和其他类 Unix 系统上运行:export BENCHER_HOST=http://localhost:61016

在 Windows 上运行:$env:BENCHER_HOST = "http://localhost:61016"

如果然后执行 echo $BENCHER_HOSTWrite-Output $env:BENCHER_HOST

你应该会看到:

$ echo $BENCHER_HOST
http://localhost:61016

创建一个Bencher自托管账户

注册Bencher自托管


通过导航到以下网址在您的本地Bencher自托管实例上创建账户:http://localhost:3000/auth/signup

创建账户后,返回到您运行 bencher up 的终端窗口。 您应该会看到如下图所示的内容:

To: Saul Goodman <saul@bettercallsaul.com>>
Subject: Confirm Bencher Signup
Body:
Ahoy Saul Goodman,
Please, click the button below or use the provided token to signup for Bencher.
Confirm Email: http://localhost:3000/auth/confirm?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhdXRoIiwiZXhwIjoxNzA0ODIwODIxLCJpYXQiOjE3MDQ4MTkwMjEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8iLCJzdWIiOiJzYXVsQGJldHRlcmNhbGxzYXVsLmNvbSIsIm9yZyI6bnVsbH0.CKW4-MyOqY0AnRbs9h8tBtyAB6ck51PytytTsZSBOiA
Confirmation Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhdXRoIiwiZXhwIjoxNzA0ODIwODIxLCJpYXQiOjE3MDQ4MTkwMjEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8iLCJzdWIiOiJzYXVsQGJldHRlcmNhbGxzYXVsLmNvbSIsIm9yZyI6bnVsbH0.CKW4-MyOqY0AnRbs9h8tBtyAB6ck51PytytTsZSBOiA
See you soon,
The Bencher Team
Bencher - Continuous Benchmarking
Manage email settings (http://localhost:3000/help)

在您的浏览器中导航到 确认邮件 链接,或复制 确认令牌 到以下地址的 确认令牌 字段:http://localhost:3000/auth/confirm

完成后,您应该已经登录到您的Bencher自托管账户!


创建 API 令牌

如果要使用 Bencher API,您需要创建一个 API 令牌。 导航至 Bencher 控制台。 将鼠标悬停在右上角的您的名字上。 应该会出现一个下拉菜单。选择令牌。 在 API 令牌页面,点击➕ 添加按钮。

添加 API 令牌


一旦您创建了新的 API 令牌,您需要将它复制到剪贴板。 在您打算工作的终端中,将 API 令牌导入为环境变量。

在 Linux、Mac 和其他类 Unix 系统上运行:export BENCHER_API_TOKEN=YOUR_TOKEN

在 Windows 上运行:$env:BENCHER_API_TOKEN = "YOUR_TOKEN"

然后运行 echo $BENCHER_API_TOKENWrite-Output $env:BENCHER_API_TOKEN

你应该会看到:

$ echo $BENCHER_API_TOKEN
YOUR_TOKEN

🐰 注意:如果你转到另一个终端,你将需要再次导出 API 令牌。


创建一个项目

现在我们有了用户帐户和API令牌,我们可以创建一个项目。 首先,我们需要知道我们新项目将属于哪个组织。

运行:bencher org list

你应该看到类似以下的东西:

$ bencher org list
[
{
"name": "Saul Goodman",
"slug": "saul-goodman",
"uuid": "4581feb0-6cac-40a9-bd8a-d7865183b01e"
"created": "2022-07-06T11:24:36Z",
"modified": "2022-07-06T11:24:36Z"
}
]

你的输出应比以上略有不同:

  • uuid 是伪随机的
  • nameslug 将基于你的用户名
  • createdmodified 时间戳应该是你刚注册的时间

我们现在可以在你的组织中创建一个新项目。 将你的组织slug替换到下方命令的 organization 参数 (例如 YOUR_ORG_SLUG)。

运行:bencher project create YOUR_ORG_SLUG --name "Save Walter White" --url http://www.savewalterwhite.com

你应该看到类似以下的东西:

$ bencher project create saul-goodman --name "Save Walter White" --url http://www.savewalterwhite.com
{
"organization": "4581feb0-6cac-40a9-bd8a-d7865183b01e",
"name": "Save Walter White",
"slug": "save-walter-white-1234abcd",
"uuid": "c6c2a8e8-685e-4413-9a19-5b79053a71b1"
"url": "http://www.savewalterwhite.com",
"public": true,
"created": "2022-07-06T11:36:24Z",
"modified": "2022-07-06T11:36:24Z"
}

同样,你的输出应该和以上稍有不同。 只需确保这个命令能正常运行。 记下Project slug 字段 (例如 save-walter-white-1234abcd)。


运行一个报告

我们终于可以开始收集一些基准度量数据了! 为了简单起见,我们在本教程中将使用模拟数据。

运行:bencher mock

你应该看到类似以下的东西:

$ bencher mock
{
"bencher::mock_0": {
"latency": {
"value": 3.7865423396154463,
"lower_value": 3.4078881056539014,
"upper_value": 4.165196573576991
}
},
"bencher::mock_1": {
"latency": {
"value": 16.398332128878437,
"lower_value": 14.758498915990593,
"upper_value": 18.03816534176628
}
},
"bencher::mock_2": {
"latency": {
"value": 20.88091359871672,
"lower_value": 18.792822238845048,
"upper_value": 22.969004958588393
}
},
"bencher::mock_3": {
"latency": {
"value": 33.88103801203782,
"lower_value": 30.492934210834036,
"upper_value": 37.2691418132416
}
},
"bencher::mock_4": {
"latency": {
"value": 40.90515638867921,
"lower_value": 36.81464074981129,
"upper_value": 44.99567202754713
}
}
}

你的输出应该和以上稍有不同,因为数据是伪随机的。 只需这个命令能正常运行。


现在让我们使用模拟的基准度量数据运行一个报告。 将你的项目 slug替换到下方命令的 --project 参数 (例如YOUR_PROJECT_SLUG)。

运行:bencher run --project YOUR_PROJECT_SLUG "bencher mock"

你应该看到类似以下的东西:

$ bencher run save-walter-white-1234abcd "bencher mock"
{
"bencher::mock_0": {
"latency": {
"value": 0.15496641529475275,
"lower_value": 0.13946977376527747,
"upper_value": 0.17046305682422802
}
},
"bencher::mock_1": {
"latency": {
"value": 18.648298578180437,
"lower_value": 16.783468720362393,
"upper_value": 20.513128435998482
}
},
"bencher::mock_2": {
"latency": {
"value": 28.20328182167366,
"lower_value": 25.382953639506294,
"upper_value": 31.023610003841025
}
},
"bencher::mock_3": {
"latency": {
"value": 34.45732560787596,
"lower_value": 31.01159304708836,
"upper_value": 37.903058168663556
}
},
"bencher::mock_4": {
"latency": {
"value": 44.9237520767597,
"lower_value": 40.43137686908373,
"upper_value": 49.41612728443567
}
}
}
{
"branch": "master",
"end_time": "2023-07-18T14:21:27.796871Z",
"results": [
"{\n \"bencher::mock_0\": {\n \"latency\": {\n \"value\": 0.15496641529475275,\n \"lower_value\": 0.13946977376527747,\n \"upper_value\": 0.17046305682422802\n }\n },\n \"bencher::mock_1\": {\n \"latency\": {\n \"value\": 18.648298578180437,\n \"lower_value\": 16.783468720362393,\n \"upper_value\": 20.513128435998482\n }\n },\n \"bencher::mock_2\": {\n \"latency\": {\n \"value\": 28.20328182167366,\n \"lower_value\": 25.382953639506294,\n \"upper_value\": 31.023610003841025\n }\n },\n \"bencher::mock_3\": {\n \"latency\": {\n \"value\": 34.45732560787596,\n \"lower_value\": 31.01159304708836,\n \"upper_value\": 37.903058168663556\n }\n },\n \"bencher::mock_4\": {\n \"latency\": {\n \"value\": 44.9237520767597,\n \"lower_value\": 40.43137686908373,\n \"upper_value\": 49.41612728443567\n }\n }\n}\n"
],
"settings": {},
"start_time": "2023-07-18T14:21:27.773930Z",
"testbed": "base"
}
{
"uuid": "5554a92c-6f5c-481d-bd47-990f0a9bac6d",
"user": { ... },
"project": { ... },
"branch": { ... },
"testbed": { ...},
"start_time": "2023-07-18T14:21:27Z",
"end_time": "2023-07-18T14:21:27Z",
"adapter": "magic",
"results": [
[
{
"measure": { ... },
"threshold": null,
"benchmarks": [ ... ]
}
]
],
"alerts": [],
"created": "2023-07-18T14:21:27Z"
}
View results:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=88375e7c-f1e0-4cbb-bde1-bdb7773022ae
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=e81c7863-cc4b-4e22-b507-c1e238871137
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=31dede44-d23a-4baf-b639-63f2ac742e42
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=c7e32369-f3dd-473d-99a3-6289ae32b38e
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=779bc477-4964-4bae-aa8c-4da3e388822c

你现在可以在浏览器中查看每个基准测试的结果。 点击或复制并粘贴 View results 的链接。 现在每个基准测试应该只有一项数据,让我们添加更多数据!


首先,让我们将项目slug设置为环境变量,这样我们就不需要在每次运行命令时提供 --project

运行:export BENCHER_PROJECT=save-walter-white-1234abcd

然后运行:echo $BENCHER_PROJECT

你应该看到:

$ echo $BENCHER_PROJECT
save-walter-white-1234abcd

我们再次运行同样的命令(不使用 --project)来生成更多数据。

运行:bencher run "bencher mock"


现在,让我们生成更多的数据,但这次我们将结果传给 bencher run

运行:bencher mock | bencher run


有时你可能想将你的结果保存到一个文件中,并让 bencher run 来读取它们。

运行:bencher run --file results.json "bencher mock > results.json"


同样地,你可能有一个独立的进程运行你的基准测试并将你的结果保存到一个文件中。然后 bencher run 将会读取它们。

运行:bencher mock > results.json && bencher run --file results.json


最后,让我们通过 bencher run--iter 参数生成大量的数据。

运行:bencher run --iter 16 "bencher mock"


🐰 提示:查看 bencher run CLI子命令文档以获取全面了解bencher run能干什么!


生成一个警报

现在我们的基准测试有了一些历史数据,让我们生成一个警报! 警报是当基准结果被确定为性能退化时生成的。 所以让我们模拟一个性能退化!

运行:bencher run "bencher mock --pow 8"


在输出的最后部分应该有一个新的区域,叫作 View alerts

View alerts:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/b2329d5a-4471-48ab-bfbd-959d46ba1aa6
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/181b1cf5-d984-402a-b0f1-68f6f119fa66
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/b9b6c904-c657-4908-97db-dbeca40f8782
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/5567ff32-2829-4b6a-969a-af33ce3828db
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/49f2768f-ccda-4933-8e1d-08948f57a74d

你现在可以在浏览器中查看每个基准测试的警报。 点击或复制并粘贴 View alerts 的链接。


🐰 提示:查看 阈值和警报文档以全面了解如何检测性能退化!



🐰 恭喜!你捕捉到了你的第一个性能退化! 🎉


继续下去:基准测试概览 ➡

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


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Wed, March 27, 2024 at 7:50:00 AM UTC