Bencher 介绍与选型指南

Bencher v0.6.13 开源持续基准测试平台(bare metal runner + SQLite 内置存储)的定位澄清、架构解析、功能清单与同类方案(hyperfine/GA Benchmark/LooksPerfect)量化选型对比。

BencherBencherRust语言DevOps工程CI性能基准REST2026/10/27

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 等知名项目中使用。

💡 技术拓展:同类对比的关键维度

产品噪声处理数据存储自托管主要适配语言定位
BencherBare 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/AShell本地/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 操作。

关键设计决策

  1. SQLite 而非 Postgres/ClickHouse:核心原因是 benchmark 结果以 append-only 的方式写入,查询侧多数是"某 branch × testbed × benchmark × measure 的时序图",SQLite WAL 模式足够;生产级 Plus 版额外提供 Litestream → S3 灾难恢复。
  2. bare metal runner 是核心护城河:Cloud 版按需调度;自托管版用 bencher runner create 注册任意裸机节点,runner 启动后通过 WebSocket 与 API Server 保持心跳。
  3. 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 字段选择。
  4. 阈值模型内置:创建 benchmark 时可附加 thresholds(json_v1 schema),用 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 RegistryBencher 作为容器镜像仓库✅(本地 FS)✅(S3)
灾难恢复Litestream → S3 连续复制❌✅
GitHub/Google SSOOAuth2 企业登录❌✅ 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 里比两次"——

维度BencherGA 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。

八、参考链接