Bencher 介绍与选型指南
Bencher v0.6.13 开源持续基准测试平台(bare metal runner + SQLite 内置存储)的定位澄清、架构解析、功能清单与同类方案(hyperfine/GA Benchmark/LooksPerfect)量化选型对比。
Bencher 介绍与选型指南
目标:为 CI 持续基准测试场景选型 Bencher v0.6.13,澄清其「bare metal runner + SQLite 内置存储」架构定位、与 GitHub Actions Benchmark/LooksPerfect/hyperfine CI 脚本的本质差异,并给出自托管与 Cloud 两种部署路线的选型判断。
一、环境信息
| 项 | 值 |
|---|---|
| 组件 | Bencher v0.6.13(2026-09-28 发布) |
| 官网 | https://bencher.dev |
| 仓库 | https://github.com/bencherdev/bencher |
| 语言 | Rust(单仓库 workspace,CLI + API Server + Console) |
| 许可 | 非标准(NOASSERTION,含商业 Plus 分支) |
| 自托管形态 | Docker(ghcr.io/bencherdev/bencher-api + bencher-console) |
| 内置存储 | SQLite(/var/lib/bencher/data/bencher.db) + 可选 Litestream |
| 竞品 | GitHub Actions Benchmark、hyperfine + CI 脚本、LooksPerfect、SpeedRabbit |
| 查询日期 | 2026-10-27 |
二、软件概述
Bencher 是由 bencherdev 组织开发的开源持续基准测试(Continuous Benchmarking)平台,核心理念是「Bare metal = 消除噪声」——它提供专用的 bare metal runner,让同一套 benchmark 命令在本地开发机、CI、预发环境始终跑到相同硬件规格上,从而把 CI runner 上常见的 >30% 方差压缩到 <2%。
它解决的是一个长期被忽视的工程痛点:CI 里跑 benchmark 很吵(共享 CPU/调度抖动),结果工程师慢慢就忽略告警,直到性能回归偷偷进到生产环境。Bencher 的 README 里把这类团队列为重点用户:
- 数据库、编译器、浏览器引擎、运行时、网络协议栈、密码学库、操作系统内核。
项目 2020 年 7 月启动(bencherdev/bencher),2023 年推出自托管版本,目前月活 Cloud 用户量、bare metal runner 池规模未公开,但 README 提到已在 Microsoft snmalloc、GitLab Git、pnpm、conda、Firezone、Servo 等知名项目中使用。
💡 技术拓展:同类对比的关键维度
产品 噪声处理 数据存储 自托管 主要适配语言 定位 Bencher Bare metal runner + noise 测量 SQLite 内置 + Plus 版灾难恢复 ✅ Rust/C++/Go/Python/Java/JS/Shell 等 12+ 企业级 CI 基准平台 GitHub Actions Benchmark 无(直接跑在共享 runner) Actions artifacts / GH Pages ❌ 多语言 轻量 PR 评论 hyperfine --warmup、--min-runs、--show-output缓解无(CLI 输出表格) N/A Shell 本地/CI 命令行基准工具 LooksPerfect 裸金属 Cloud runner 云端数据库 ❌(付费) Rust 专注 Rust SpeedRabbit 专用 runner 自建 DB ✅(有限开源) Python 专注 Python
三、核心架构
Bencher 自托管版由两个独立组件组成,配合 SQLite 单文件数据库,整体架构极简:
┌──────────────────────────────────────────────────────────┐
│ Bencher Console │
│ (ghcr.io/bencherdev/bencher-console) │
│ - Next.js 前端,监听 :3000 │
│ - 纯环境变量配置,直接调用 API Server │
└───────────┬──────────────────────────────────────────────┘
│ HTTP(S)
▼
┌──────────────────────────────────────────────────────────┐
│ Bencher API Server │
│ (ghcr.io/bencherdev/bencher-api) │
│ - Rust + Dropshot 框架,监听 :6610 │
│ - /etc/bencher/bencher.json 配置 │
│ - SQLite + Litestream(可选灾难恢复) │
│ - 内置 OCI Registry(可选 S3 存储) │
│ - 内置 bare metal runner 调度 │
└───────────┬──────────────────────────────────────────────┘
│ 直接读写
▼
┌──────────────────────────────────────────────────────────┐
│ SQLite 数据库 │
│ /var/lib/bencher/data/bencher.db │
│ busy_timeout=5000ms · cache_size=65536 KiB │
└──────────────────────────────────────────────────────────┘
CLI (bencher) 独立分发,既可本地跑 benchmark 直接入库,也可在 CI 里触发 runner 跑,bencher up/down/logs 直接封装 compose 操作。
关键设计决策
- SQLite 而非 Postgres/ClickHouse:核心原因是 benchmark 结果以 append-only 的方式写入,查询侧多数是"某 branch × testbed × benchmark × measure 的时序图",SQLite WAL 模式足够;生产级 Plus 版额外提供 Litestream → S3 灾难恢复。
- bare metal runner 是核心护城河:Cloud 版按需调度;自托管版用
bencher runner create注册任意裸机节点,runner 启动后通过 WebSocket 与 API Server 保持心跳。 - 12 种 benchmark harness adapter:覆盖 Rust(criterion/libtest/iai/gungraun)、C++(Google Benchmark/Catch2)、Go(go test -bench)、Python(pytest-benchmark/asv)、Java(JMH)、JS(Benchmark.js/Vitest)、Shell(Hyperfine)等,通过
settings.adapter字段选择。 - 阈值模型内置:创建 benchmark 时可附加
thresholds(json_v1schema),用 Liner/Lossless/Summary 三种模型检测回归;error-on-alert可在 CI 直接 fail build。
四、功能特性
| 功能域 | 说明 | 免费版 | Plus 版 |
|---|---|---|---|
| 基准运行 | 本地直跑 / CI Runner / Bare Metal Runner | ✅ | ✅ |
| Runner 管理 | bencher runner create + WebSocket 心跳 | ✅ | ✅ |
| 阈值告警 | 三种模型 + CI fail build | ✅ | ✅ |
| 历史追踪 | branch × testbed × benchmark × measure 多维切片 | ✅ | ✅ |
| 图表与 plot | 自定义 plot 面板(CSV/JSON 导出) | ✅ | ✅ |
| OCI Registry | Bencher 作为容器镜像仓库 | ✅(本地 FS) | ✅(S3) |
| 灾难恢复 | Litestream → S3 连续复制 | ❌ | ✅ |
| GitHub/Google SSO | OAuth2 企业登录 | ❌ | ✅ Enterprise |
| 速率限制调优 | 自定义 user/project/runner 限额 | ❌ | ✅ |
| 自托管 | 部署在自己的基础设施 | ✅ | ✅ |
五、快速开始(自托管 60 秒)
假设已经装好 Docker 和 bencher CLI(见下文 B1/B2 篇):
# 一键拉起
bencher up --detach
# 验证
curl -s http://localhost:6610/v0/server/version
# {"version":"0.6.13"}
# 跑一组 mock 数据(无需你写 benchmark)
bencher mock --project demo --branch main --testbed local
跑完后浏览器打开 http://localhost:3000,在右上角 Claim 入口用 bencher mock 输出里的 claim 链接领取项目,就能看到历史曲线和阈值告警面板。
六、适用场景与限制
适用
- 数据库 / 编译器 / 浏览器引擎 / 运行时这类性能敏感型项目——CI runner 噪声让常规 benchmark 脚本形同虚设。
- 需要 PR 自动评论回归结果(GitHub App / GitLab Integration),或需要 CI fail build 的硬性闸门。
- 已有大量 benchmark 代码(Rust criterion、JMH、pytest-benchmark 等)需要统一追踪。
- 重视数据主权、希望把 benchmark 历史数据留在自己基础设施内。
不适用 / 需注意
- 数据库选型已固定为 SQLite,不适合写入 QPS 极高、多地区多写节点的超大规模场景;写入 QPS 瓶颈约在单 WAL writer,官方建议
cache_size >= 131072。 - 自托管版不含 bare metal runner 池——需要自己准备物理机注册 runner,或只靠 CI/本地跑。Cloud 版按分钟计费,免运维。
- API 仍在 beta(文档顶部标 Breaking Changes 预警),v0.6.x 到 v0.7.x 不承诺向后兼容,升级前务必看 changelog。
- Plus 版功能需商业许可——灾难恢复、SSO、速率限制调优、registry S3 存储都归 Plus,自托管免费版没有。
七、同类选型对比
Bencher vs GitHub Actions Benchmark
GitHub Actions Benchmark 是个轻量 JS action,用 benchmark.js 或 cargo bench 跑 benchmark 然后在 PR 评论里贴前后差值。本质是"在同一个 PR 里比两次"——
| 维度 | Bencher | GA Benchmark |
|---|---|---|
| 历史数据 | 入库 + 多维切片 | 无(仅当次对比) |
| 噪声 | Bare metal runner | 共享 runner(>30% 方差) |
| 阈值 | Liner/Lossless/Summary 模型 | 固定百分比阈值 |
| 跨 commit 基线 | ✅ | ❌ |
| 多维维度(branch×testbed×metric) | ✅ | ❌ |
| 自托管 | ✅ | ❌ |
Bencher vs hyperfine + CI 脚本
hyperfine 是个非常好的本地 benchmark CLI(warmup、多轮、统计值齐全),但它不做"持续追踪"。典型组合是 hyperfine 跑 + 输出 CSV → 入库自写脚本。Bencher 在此之上提供:
- 统一的 harness adapter(hyperfine 也是 adapter 之一,
adapter: shell_hyperfine_v2) - 历史曲线、阈值、runner 调度、claim/认领权限等平台层能力。
Bencher vs LooksPerfect
LooksPerfect 是专注 Rust 的 cloud-only 平台(cargo-lp 命令),API 更简洁但语言覆盖窄。多语言项目(Rust + Python + Go + Shell 混合仓库)还是 Bencher 合适。
选型建议(一句话)
如果你的 benchmark 在 CI 里跑完你自己都不信——上 Bencher。如果只是偶尔看一眼基准、不需要历史追踪——hyperfine 够用。只要 GitHub PR 评论够、全仓单种语言——GA Benchmark 或 LooksPerfect。
八、参考链接
- 官网:https://bencher.dev
- 自托管教程:https://bencher.dev/docs/tutorial/self-hosted/
- REST API 文档:https://bencher.dev/docs/api/
- GitHub:https://github.com/bencherdev/bencher(v0.6.13,2026-09-28)
- OpenAPI Spec v0.6.13:https://bencher.dev/download/openapi.json
- 技术拓展条目:hyperfine 源码 https://github.com/sharkdp/hyperfine / GitHub Actions Benchmark https://github.com/marketplace/actions/benchmark-js-action / LooksPerfect https://www.lookssomeoneperfectlyfine.dev