鲲鹏Rust生态软件性能评估系统设计方案
一、背景与需求
1.1 背景
Rust语言亲和是鲲鹏计算平台2026年重点业务之一,其目的为提升鲲鹏用户生态中关键Rust软件及Rust标准库在鲲鹏计算平台上的性能表现,从而提升鲲鹏服务器产品竞争力。
基于生态拓展目的,鲲鹏计算平台需要建立 Rust生态软件性能评测系统,实现以下核心能力:
- 多维度性能评估:实时评估不同Rust语言版本、不同硬件平台、不同软件代码实现的性能表现
- 优化方向分析:基于评测数据定位性能瓶颈,指导优化工作方向
- 社区影响力建设:将评测系统贡献至Rust上游开源社区,牵引社区在Rust语言演进中关注ARM软件性能,提升ARM软件生态优先级
1.2 Rust社区现有性能基础设施(rustc-perf)
Rust官方社区已建立编译器性能评测基础设施 rustc-perf(github.com/rust-lang/rustc-perf),结果发布于 perf.rust-lang.org。其核心架构如下:
| 组件 | 功能 |
|---|---|
| Collector(采集器) | 在专用评测机器上运行,拉取待测rustc构建产物,执行完整benchmark套件 |
| Database(数据库) | PostgreSQL存储所有评测结果与任务队列 |
| Site(前端站点) | perf.rust-lang.org,提供趋势图、commit对比、bootstrap时序等可视化面板 |
| Benchlib(运行时基准库) | 基于perf_event_open的微基准测试框架,采集硬件计数器与wall-time |
rustc-perf当前采集指标:
| 指标 | 说明 | 稳定性 |
|---|---|---|
instructions:u |
用户态CPU指令数(主指标) | 非常稳定,噪声极低 |
cycles:u |
用户态CPU周期数 | 中等噪声 |
max-rss |
峰值驻留内存(RSS) | 中等 |
size:linked-artifact |
输出二进制/rlib体积 | 稳定 |
wall-time |
编译挂钟时间 | 噪声较大 |
触发机制:
- 每个合入master的PR自动触发评测,结果以评论形式回复到PR中
- Reviewer可通过
@rust-bench queue命令手动触发try build评测 - 每周自动生成性能分诊报告,提交编译器团队会议
关键局限——不支持ARM:
当前rustc-perf 仅支持x86_64-unknown-linux-gnu平台,基础设施无法同时支持多台评测机器。Rust社区已将 AArch64评测支持 列为 2025H2项目目标,计划重构为分布式多Collector架构(HackMD设计文档),但截至2026年初尚未完成。
这正是鲲鹏参与社区贡献的战略窗口期。
1.3 需求
1.3.1 建立Rust生态软件性能评测系统
基于开源社区基础设施建立Rust生态软件性能评测系统,支持以下能力:
| 维度 | 具体需求 |
|---|---|
| 多Rust版本 | 测试不同Rust语言版本(编译器及标准库),评估版本演进对性能的影响 |
| 多硬件平台 | 支持x86_64与鲲鹏ARM平台的交叉对比评测 |
| 多软件实现 | 支持不同代码实现(如SIMD优化前后)的性能对比 |
| 评测集 | Rust标准库(std/core/alloc)、自定义应用基准测试(compression/raytracer等) |
| 可视化报告 | 生成跨平台、跨版本的可视化性能对比报告 |
| 运行模式 | 默认每日自动运行;支持社区committer手动触发 |
1.3.2 评测机制合入Rust官方社区
将评测系统贡献至Rust语言官方社区,实现:
- 在Rust代码变更(编译器、标准库PR)时实时测试不同平台(x86_64、ARM)上的测试集性能表现
- 当ARM平台出现性能劣化时自动告警,牵引社区开发者关注ARM性能
- 提升ARM生态在Rust社区中的优先级
第一部分:功能设计实现
二、技术方案
2.1 方案总体架构
系统基于 rustc-perf 构建,采用 Cargo Workspace 组织,分为评测执行层(Collector)、数据持久层(Database)、展示层(Site + TUI)三层:
┌─────────────────────────────────────────────────────────────────────┐
│ 展示层 │
│ ┌──────────────────────┐ ┌──────────────────────────────────────┐ │
│ │ bench_cmp TUI │ │ Site Web前端(TypeScript) │ │
│ │ (ratatui终端界面) │ │ - 跨平台性能对比面板 │ │
│ │ - 交互式版本对比 │ │ - 版本趋势追踪图 │ │
│ │ - 指标切换/过滤 │ │ - Cachegrind/perf-record分析报告 │ │
│ │ - 统计摘要面板 │ │ - GitHub集成(PR评论) │ │
│ └──────────────────────┘ └──────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────┤
│ 数据持久层 │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Database 模块(双后端) │ │
│ │ ├─ SQLite:本地开发与单机评测(默认 results.db) │ │
│ │ └─ PostgreSQL:生产部署与多Collector协同 │ │
│ │ 数据内容: │ │
│ │ - Artifact标识(rustc版本/commit/平台) │ │
│ │ - 性能指标(instructions/cycles/wall-time/cache/branch/rss) │ │
│ │ - Profile数据(Cachegrind注解、perf-record报告) │ │
│ │ - 自定义指标(throughput、latency等用户定义指标) │ │
│ └──────────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────┤
│ 评测执行层 │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ x86_64 Collector │ │ ARM Collector │ │
│ │ (AMD 9654) │ │ (鲲鹏920B) │ │
│ │ │ │ │ │
│ │ ┌─────────────────────┐ │ │ ┌──────────────────────┐ │ │
│ │ │ benchlib 测量引擎 │ │ │ │ benchlib 测量引擎 │ │ │
│ │ │ (perf_event_open) │ │ │ │ (perf_event_open) │ │ │
│ │ ├─────────────────────┤ │ │ ├──────────────────────┤ │ │
│ │ │ 运行时评测集 │ │ │ │ 运行时评测集 │ │ │
│ │ │ (std/core/alloc/ │ │ │ │ (std/core/alloc/ │ │ │
│ │ │ custom groups) │ │ │ │ custom groups) │ │ │
│ │ ├─────────────────────┤ │ │ ├──────────────────────┤ │ │
│ │ │ 编译时评测集 │ │ │ │ 编译时评测集 │ │ │
│ │ │ (real-world crates) │ │ │ │ (real-world crates) │ │ │
│ │ ├─────────────────────┤ │ │ ├──────────────────────┤ │ │
│ │ │ Profiler │ │ │ │ Profiler │ │ │
│ │ │ (Cachegrind/perf) │ │ │ │ (Cachegrind/perf) │ │ │
│ │ └─────────────────────┘ │ │ └──────────────────────┘ │ │
│ └─────────────────────────┘ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Cargo Workspace 结构:
rust-bench/
├── Cargo.toml # Workspace配置(members: collector, site, database, intern)
├── collector/ # 评测执行引擎
│ ├── benchlib/ # 核心测量库(perf_event硬件计数器)
│ ├── benchlib-macros/ # #[bench] 过程宏
│ ├── runtime-benchmarks/ # 运行时评测集
│ ├── compile-benchmarks/ # 编译时评测集
│ └── src/ # Collector CLI与编排逻辑
├── database/ # 数据库抽象层(SQLite/PostgreSQL双后端)
├── site/ # Web前端与API服务器
└── intern/ # 字符串驻留工具库
2.2 方案一:建立rust-bench开源项目
2.2.1 项目定位
创建 rust-bench 开源项目,基于 rustc-perf 构建,扩展增强的运行时基准测试能力、自定义指标支持和 TUI 比较界面。核心特性:
- 多Rust编译器版本支持:通过
<RUSTC>参数指定不同rustc版本(nightly/beta/stable及特定commit),或使用+toolchain语法 - 多硬件平台部署:基于 Linux
perf_event_open系统调用,可部署在任何支持 perf 的 Linux 平台(x86_64/AArch64/LoongArch64) - 多评测集支持:运行时评测(标准库 + 自定义应用基准)与编译时评测(真实世界 crate)双模式
- 自定义指标扩展:支持用户定义任意数值指标和结构化 JSON 报告
2.2.2 评测集设计
系统支持运行时评测和编译时评测两类评测集:
运行时评测集(collector/runtime-benchmarks/):
| 评测组 | 类型 | 测试内容 | 说明 |
|---|---|---|---|
| std | 标准库 | HashMap、HashSet、IO(BufRead/Copy/Cursor)、Path、Time | 标准库核心数据结构与IO性能 |
| core | 标准库 | 核心库基准测试 | 无alloc环境下的核心功能性能 |
| alloc | 标准库 | 内存分配器基准测试 | 堆分配性能 |
| fmt | 自定义 | 格式化基准测试 | std::fmt 格式化性能 |
| hashmap | 自定义 | 哈希表性能 | 不同负载下的HashMap操作 |
| compression | 自定义 | 压缩算法 | 压缩/解压性能 |
| css | 自定义 | CSS解析 | 文本解析性能 |
| nbody | 自定义 | N体模拟 | 计算密集型浮点运算 |
| nes | 自定义 | NES模拟器 | 整数运算与状态机性能 |
| parsing | 自定义 | 文本解析 | 通用解析器性能 |
| raytracer | 自定义 | 光线追踪 | SIMD与浮点密集计算 |
| svg | 自定义 | SVG处理 | 图形数据处理 |
| text-search | 自定义 | 文本搜索 | 字符串匹配算法 |
| bufreader | 自定义 | 缓冲读取 | IO缓冲策略性能 |
| daft-vllm | 自定义 | 自定义指标示例 | 演示自定义指标、JSON报告、额外命令行参数 |
规划中的生态软件评测集(2026 Q2接入):
| 评测组 | 类型 | 测试内容 | 说明 |
|---|---|---|---|
| daft | 应用基准 | Daft分布式数据框架核心操作 | 字节跳动关键依赖,列式计算性能 |
| arrow2 | 应用基准 | Arrow列式内存格式Rust实现 | 数据处理生态核心组件 |
| lance | 应用基准 | Lance向量数据库操作 | ML/AI场景关键组件,向量检索性能 |
| volo | 应用基准 | Volo RPC框架请求处理 | 字节跳动Rust RPC框架,网络IO与序列化性能 |
| monoio | 应用基准 | Monoio异步运行时调度 | 字节跳动io_uring异步运行时,异步调度与IO性能 |
编译时评测集(collector/compile-benchmarks/):
使用真实世界 Rust crate 作为编译时性能基准,测量不同编译 Profile(Check/Debug/Doc/Opt)和 Scenario(Full/IncrFull/IncrUnchanged/IncrPatched)下的编译器性能。
评测框架:
系统使用自研的 benchlib 框架(基于 rustc-perf benchlib 扩展),提供两种编写模式:
| 模式 | API | 适用场景 |
|---|---|---|
#[bench] 宏模式 |
benchlib::benchmark::Bencher::iter(constructor, bench) |
标准微基准测试,自动注册到全局组 |
| Custom 模式 | benchlib::custom::init() + BenchAction |
需要完全控制测量逻辑、自定义指标、JSON报告 |
#[bench] 宏模式工作原理:
constructor:每次测量前调用,准备输入数据(不被测量)bench:接收 constructor 输出,被硬件性能计数器和墙钟时间测量- 自动执行 3 次热身迭代 + N 次正式测量(默认5次,可通过
--iterations配置)
2.2.3 性能数据采集
通过 perf_event_open 系统调用直接采集硬件性能计数器,结合墙钟时间测量,实现高精度低开销的性能数据采集。
采集架构:
每个 benchmark 分两轮执行,确保结果准确且互不干扰:
- 第一轮:采集硬件性能计数器(perf_event group模式,一次性读取所有计数器)
- 第二轮:采集墙钟时间(
std::time::Instant)
基础指标(perf_event_open 直接采集):
| 指标 | 采集方式 | 用途 |
|---|---|---|
instructions:u |
PERF_COUNT_HW_INSTRUCTIONS |
稳定性最高的性能指标,噪声极低 |
cycles:u |
PERF_COUNT_HW_CPU_CYCLES |
评估IPC(每周期指令数) |
branch-misses |
PERF_COUNT_HW_BRANCH_MISSES |
分支预测效率分析 |
cache-misses |
PERF_COUNT_HW_CACHE_MISSES |
缓存未命中分析 |
cache-references |
PERF_COUNT_HW_CACHE_REFERENCES |
缓存引用总数 |
wall-time |
std::time::Instant::now() |
端到端性能评估 |
max-rss |
/usr/bin/time -v(外部测量) |
峰值驻留内存 |
| 自定义指标 | BenchmarkSample::set("name", value) |
用户定义的任意数值指标 |
实现细节(benchlib/src/measure/perf_counter/linux.rs):
// 创建 perf_event 计数器组
fn create_group() -> Group {
// 使用 perf_event crate 的 Builder 创建计数器组
// 权限要求:/proc/sys/kernel/perf_event_paranoid = -1
}
fn prepare_counters(group: &mut Group) -> Counters {
// 添加硬件事件:CPU_CYCLES, INSTRUCTIONS, BRANCH_MISSES, CACHE_MISSES, CACHE_REFERENCES
// LoongArch64 平台限制:PMU 最多支持 4 个事件,自动禁用 cache-references
}
fn benchmark_function(constructor, bench) -> BenchmarkSample {
// Pass 1: 启用 perf_event group → 执行 bench → 读取计数器
// Pass 2: 记录 Instant::now() → 执行 bench → 计算 wall-time
}
深度分析(Profiling):
| Profiler | 工具 | 特点 | 输出 |
|---|---|---|---|
| Cachegrind | valgrind --tool=cachegrind |
指令级分析,结果确定性,支持精确模式(Valgrind ≥ 3.22) | cgout(原始数据)+ cgann(注解输出) |
| perf-record | perf record -g |
采样式分析,开销可忽略,适合发现热点函数 | perf(原始数据)+ perfreport(注解报告) |
Cachegrind 支持 diff 模式:使用 --rustc2 参数对比两个 rustc 版本的指令级差异。
ARM平台适配:
鲲鹏920B基于ARMv8.2-A架构,其PMU提供64位周期计数器及最多7个事件计数器。系统通过标准 perf_event_open 接口访问,无需 raw event ID:
采集前需确认内核配置:
CONFIG_ARM_PMU=yCONFIG_HW_PERF_EVENTS=y/proc/sys/kernel/perf_event_paranoid = -1
2.2.4 数据持久化
系统支持 SQLite 和 PostgreSQL 双后端,通过统一的 Connection trait 抽象数据库操作:
存储方案:
| 后端 | 适用场景 | 说明 |
|---|---|---|
| SQLite | 本地开发、单机评测 | 默认 results.db,零配置,便于本地对比分析 |
| PostgreSQL | 生产部署、多Collector协同 | 与 rustc-perf 保持一致,支持并发写入与远程访问 |
数据模型:
Artifact(评测产物)
├── artifact_id -- 唯一标识(rustc版本/commit SHA)
├── name -- 可读名称(如 "nightly-2026-05-18")
├── date -- RFC 3339 时间戳
└── type -- 类型(master/try/release)
BenchmarkResult(评测结果)
├── artifact_id -- 关联的Artifact
├── benchmark -- Benchmark名称(interned string)
├── metric -- 指标名称(instructions/cycles/wall-time/...)
├── value -- 指标值(f64)
└── target -- 目标平台标识
Profile数据
├── cachegrind_output -- Cachegrind原始数据与注解
├── perf_record_data -- perf-record采样数据与报告
└── custom_reports -- 自定义JSON报告(任意Serialize类型)
数据转换工具:
postgres-to-sqlite:从PostgreSQL导出到SQLite(用于本地分析)sqlite-to-postgres:从SQLite导入到PostgreSQL(用于数据上传)
2.2.5 可视化与数据展示
系统提供终端TUI和Web前端两种展示方式:
1. 实时终端输出
每个 benchmark 完成后,统计信息实时打印到终端:
Finished std/find_existing (1/42)
[Instructions]: min: 1,234,567 mean: 1,234,890 stddev: 234
[Cycles]: min: 456,789 mean: 457,012 stddev: 156
[Wall time [ns]]: min: 234,000 mean: 235,000 stddev: 2,000
[Branch misses]: min: 1,234 mean: 1,245 stddev: 12
[Cache misses]: min: 56 mean: 58 stddev: 3
[Memory [kb]]: min: 2,048 mean: 2,048 stddev: 0
自定义数值指标(如 throughput_tok/s、latency_p99_ms)也会自动显示。
2. bench_cmp — 交互式TUI比较界面
基于 ratatui 的终端交互式UI,用于比较两个 artifact 版本之间的基准测试结果:
| 功能 | 快捷键 | 说明 |
|---|---|---|
| 模式切换 | M |
在编译(Compile)和运行时(Runtime)比较模式间切换 |
| 指标切换 | A/S |
在可用指标间循环(instructions、cycles、wall-time等) |
| 显著性过滤 | F |
切换显示所有结果或仅显示显著变化 |
| 目标平台切换 | 1/2 |
切换基准/修改版本的目标平台 |
| JSON详情 | Enter |
在JSON行上打开可滚动的详情视图 |
| 导航 | ↑/↓ |
列表导航 |
| 退出 | q/Esc |
退出界面 |
界面包含:
- 摘要面板:顶部显示回归/改进摘要统计(含95%置信区间)
- 详细表格:Benchmark名称、前值(Before)、后值(After)、变化幅度
3. Site Web前端(可选部署)
基于 TypeScript 的 Web 前端,提供:
- 跨平台性能对比面板
- 版本趋势追踪图
- GitHub集成(PR评论自动回复性能变化)
- REST API 供外部系统集成
4. CI/CD 集成报告
通过 GitHub Actions 自动化流水线生成:
- 每次PR的性能回归检测报告
- Nightly构建的性能趋势数据
- Beta/Stable发布版本的性能基线
2.2.6 运行模式
| 模式 | 触发方式 | 命令示例 | 用途 |
|---|---|---|---|
| 本地手动运行 | CLI直接执行 | collector bench_runtime_local +nightly |
开发者本地性能验证 |
| CI自动运行 | GitHub Actions | .github/workflows/ci.yml |
PR合入前性能回归检测 |
| Nightly构建 | 定时触发 | .github/workflows/nightly.yml |
每日性能趋势跟踪 |
| 版本发布评测 | Release事件触发 | .github/workflows/beta-stable-benchmarks.yml |
Beta/Stable版本性能基线 |
| 生产部署 | Docker容器化 | Dockerfile(多阶段构建:Node.js前端 + Rust后端) |
持续评测服务 |
CLI 核心命令:
| 子命令 | 功能 |
|---|---|
bench_runtime_local <RUSTC> |
运行时基准测试 |
bench_local <RUSTC> |
编译时基准测试 |
profile_runtime <RUSTC> <PROFILER> |
运行时性能分析(cachegrind/perf-record) |
profile_local <RUSTC> <PROFILER> |
编译时性能分析 |
bench_cmp --db <DB> |
交互式TUI结果对比 |
codegen_diff |
汇编/LLVM IR/MIR差异对比 |
binary_stats |
二进制体积统计 |
2.3 方案二:贡献至Rust官方社区rustc-perf
2.3.1 贡献策略
将评测系统与Rust官方社区 rustc-perf 基础设施合并,实现ARM硬件性能测试及鲲鹏关键生态软件测试集的官方支持。
贡献路径对接社区已有规划:
鲲鹏贡献 社区规划(2025H2目标)
│ │
├─ 提供ARM Collector硬件 ◄──────► 分布式多Collector架构
│ 及运维支持 (collector_config表、
│ heartbeat、benchmark_set)
│
├─ 扩展评测集(Daft/ ◄──────► 运行时benchmark扩展
│ arrow2/lance/Volo/Monoio) (collector/runtime-benchmarks)
│
└─ 跨平台对比可视化 ◄──────► perf.rust-lang.org
多Collector展示增强
2.3.2 社区多Collector架构适配
根据社区 多Collector设计文档,新架构核心变更:
| 组件 | 变更 | 鲲鹏适配工作 |
|---|---|---|
| 数据库 | 新增collector_config表,含heartbeat和benchmark_set分配 |
注册ARM Collector实例 |
| Collector | 支持多实例并行运行,各Collector独立benchmark_set | 部署鲲鹏ARM Collector |
| Site前端 | 支持展示多Collector数据,支持同架构内对比 | 增加x86_64 vs ARM交叉对比视图 |
| 状态页 | 展示每个Collector健康状态 | ARM Collector监控接入 |
2.3.3 具体贡献内容
(1)ARM Collector部署与运维
- 在鲲鹏920B服务器上部署rustc-perf Collector实例
- 配置评测环境(固定CPU频率、禁用ASLR、隔离CPU核心、设置
perf_event_paranoid = -1) - 提供长期硬件资源与运维支持
(2)评测集扩展
在rustc-perf的collector/runtime-benchmarks中新增鲲鹏关键生态软件评测集:
collector/runtime-benchmarks/
├── std/ # 已有:标准库评测
├── core/ # 已有:核心库评测
├── alloc/ # 已有:分配器评测
├── daft/ # 新增:Daft分布式数据框架评测
│ ├── Cargo.toml
│ └── src/main.rs # 使用 benchlib custom API
├── arrow2/ # 新增:Arrow列式内存格式评测
│ ├── Cargo.toml
│ └── src/main.rs
├── lance/ # 新增:Lance向量数据库评测
│ ├── Cargo.toml
│ └── src/main.rs
├── volo/ # 新增:Volo RPC框架评测
│ ├── Cargo.toml
│ └── src/main.rs
└── monoio/ # 新增:Monoio异步运行时评测
├── Cargo.toml
└── src/main.rs
评测集使用 benchlib 框架接口(#[bench] 宏或 custom API),通过 perf_event_open 采集硬件计数器。对于需要自定义指标的场景(如 Daft 的吞吐量、Volo 的 RPC 延迟),使用 custom API 的 BenchmarkSample::set() 添加业务指标。
(3)PR代码变更实时性能测试
复用rustc-perf已有机制,在Rust编译器/标准库PR代码变更时:
@rust-bench queue触发try build评测- x86_64 Collector和ARM Collector同时运行评测
- 结果以评论形式回复PR,包含两个平台的性能变化
- ARM平台出现显著劣化时高亮标注,引起维护者注意
2.3.4 社区影响力
通过以上贡献实现的社区影响力:
- 制度层面:ARM性能数据成为Rust PR合入的参考指标,与x86_64同等可见
- 文化层面:Rust社区开发者在做性能优化时自然关注ARM平台表现
- 技术层面:鲲鹏关键生态软件(Daft/arrow2/lance/Volo/Monoio)成为Rust官方评测集的一部分,任何Rust编译器变更对这些软件的性能影响均可被实时检测
三、两个方案的关系与实施路径
两个方案并非替代关系,而是递进关系:
阶段一:rust-bench独立项目 阶段二:合入rustc-perf社区
┌─────────────────────────┐ ┌─────────────────────────┐
│ • 快速搭建评测能力 │ │ • 与社区架构对齐 │
│ • 验证评测集与指标设计 │ ────────► │ • 部署ARM Collector │
│ • 积累评测数据 │ │ • 扩展社区评测集 │
│ • 内部使用,支撑优化工作 │ │ • PR实时性能测试 │
│ • 形成社区贡献方案 │ │ • 提升ARM生态优先级 │
└─────────────────────────┘ └─────────────────────────┘
2026 H1 2026 H2
- 阶段一(2026 H1):快速建立rust-bench独立项目,支撑内部性能优化工作,同时验证评测集、指标采集、可视化等方案设计
- 阶段二(2026 H2):将成熟的方案贡献至Rust社区rustc-perf,对接社区多Collector架构,实现ARM性能数据的官方可见
四、关键里程碑
| 里程碑 | 时间 | 验收指标 |
|---|---|---|
| M1:rust-bench项目搭建 | 2026 Q1 | 项目开源,benchlib框架就绪,可在鲲鹏920B和x86_64上运行标准库benchmark |
| M2:评测集与指标完善 | 2026 Q2 | Daft/arrow2/lance/Volo/Monoio评测集接入,perf_event数据采集(指令数、周期数、缓存、分支)就绪,Cachegrind/perf-record profiling可用 |
| M3:TUI对比与CI集成 | 2026 Q2 | bench_cmp TUI界面上线,GitHub Actions CI流水线自动运行,每日Nightly评测 |
| M4:社区贡献PR提交 | 2026 Q3 | 向rustc-perf提交ARM Collector支持及评测集扩展PR |
| M5:社区合入与上线 | 2026 Q4 | ARM性能数据在perf.rust-lang.org可见,PR变更触发双平台评测 |
五、风险与应对
| 风险 | 影响 | 应对措施 |
|---|---|---|
| rustc-perf多Collector架构延迟 | 社区合入受阻 | rust-bench独立项目持续运行,不依赖社区进度;主动参与社区架构设计加速推进 |
| 评测噪声(ARM平台wall-time不稳定) | 结果可信度降低 | 以instructions:u为主指标(噪声极低);配置评测机降噪(固定CPU频率、禁用ASLR、隔离CPU核心);benchlib分两轮采集避免计数器与时间互相干扰 |
| 社区对鲲鹏生态评测集接受度不确定 | 评测集合入被拒 | 优先合入通用ARM Collector支持;评测集选择社区认可度高的项目(arrow2已是Rust生态核心组件);使用benchlib标准接口确保兼容性 |
| ARM perf硬件计数器兼容性 | 部分指标采集失败 | 系统已内置优雅降级(参考LoongArch64适配:PMU事件数不足时自动禁用cache-references);预先验证鲲鹏920B PMU支持的事件列表 |
| 第三方评测集(Daft/Volo等)API变更 | 评测集编译失败 | 使用Cargo.lock锁定依赖版本;CI流水线定期验证评测集编译;custom API模式解耦框架与被测软件 |
第二部分:DFX设计
六、可靠性/可用性设计
6.1 系统高可用架构
| 设计要素 | 设计方案 | 实现对应 |
|---|---|---|
| 评测任务容错 | 任务失败自动重试(最多3次),超时自动终止 | Collector进程级隔离,单个benchmark崩溃不影响整体流水线 |
| 数据库双后端 | SQLite本地容错 + PostgreSQL生产高可用(主从复制) | database/src/pool/ 双后端实现,连接池管理 |
| Collector健康检测 | 心跳机制(每60秒上报),连续3次失败标记为离线 | 社区多Collector架构的collector_config表heartbeat字段 |
| 评测结果校验 | 结果写入前校验数据完整性(指标范围检查、空值检查) | benchlib BenchmarkSample 结构化输出,JSON Schema校验 |
| 服务降级 | Profiling(Cachegrind/perf-record)失败时不影响基础指标采集 | profile_runtime 与 bench_runtime_local 独立子命令 |
| 编译产物复用 | --no-isolate 模式复用已编译benchmark产物 |
避免编译失败导致评测中断 |
6.2 数据可靠性
- 评测数据备份:PostgreSQL每日增量备份,每周全量备份,保留周期90天;SQLite文件级备份
- 评测环境一致性:每次评测前自动校验环境配置(CPU频率、内核参数
perf_event_paranoid、系统负载),不满足条件时拒绝执行并告警 - 结果可复现性:Artifact记录完整评测环境快照(Rust工具链版本/commit SHA、平台标识、时间戳),支持通过
--id参数标识和回溯历史评测 - 数据迁移安全:提供
postgres-to-sqlite/sqlite-to-postgres双向迁移工具,确保数据格式一致性
6.3 可用性指标
| 指标 | 目标值 |
|---|---|
| 系统可用率 | ≥ 99.5%(每月停机 < 3.6小时) |
| 每日自动评测成功率 | ≥ 95% |
| 数据查询响应时间(bench_cmp) | P95 < 3秒 |
| 故障恢复时间(RTO) | < 30分钟 |
| 数据恢复点目标(RPO) | < 24小时 |
七、功能安全设计
7.1 评测隔离
| 隔离措施 | 实现方式 | 实现对应 |
|---|---|---|
| 进程隔离 | 每个benchmark组在独立进程中运行 | execute_runtime_benchmark_binary() 为每个组spawn独立子进程 |
| 时间隔离 | 单个benchmark执行超时自动终止 | Collector进程管理,超时kill子进程 |
| 资源隔离 | 内存测量通过外部 /usr/bin/time 进程 |
避免测量代码本身影响被测进程的资源使用 |
| CPU隔离 | 评测进程绑定专用CPU核心(isolcpus) | benchlib/src/process.rs 进程优先级管理 |
| 编译隔离 | --no-isolate 关闭时每次重新编译评测集 |
默认隔离模式确保编译环境一致性 |
7.2 输入校验
- 评测集来源校验:仅执行
collector/runtime-benchmarks/目录下已注册的评测组,通过get_runtime_benchmark_groups()自动发现 - Rust版本校验:通过
toolchain.rs模块验证rustc路径有效性,支持+toolchain语法自动解析 - 配置参数校验:CLI参数通过
clap框架强类型校验(迭代次数、过滤规则等),无效参数直接拒绝 - Benchmark过滤:
BenchmarkFiltertrait 支持 include/exclude/exclude_suffix/exact_match,防止执行非预期benchmark
7.3 异常处理
- 评测崩溃:子进程异常退出时,Collector捕获退出码,记录stderr输出,标记该benchmark为失败,继续执行后续benchmark
- 结果异常检测:bench_cmp TUI中通过95%置信区间标注统计显著性,自动区分噪声与真实变化
- 级联故障防护:单个评测组失败不阻塞其他组执行;
--group参数支持仅运行指定组 - perf_event权限降级:当
perf_event_open权限不足时,输出明确错误信息指导用户设置perf_event_paranoid
八、网络安全设计
8.1 网络架构安全
| 安全措施 | 实现方式 | 说明 |
|---|---|---|
| 网络分区 | 评测机部署在独立VLAN,仅开放必要端口 | 减少攻击面 |
| 通信加密 | Collector与PostgreSQL之间使用TLS加密通信 | database/src/pool/postgres.rs 支持TLS连接 |
| 访问控制 | Site Web前端基于角色的访问控制(RBAC) | 区分管理员/评测员/只读用户 |
| API认证 | GitHub集成使用OAuth Token认证 | site/src/github.rs GitHub API集成 |
8.2 数据安全
- 敏感信息保护:GitHub Token等凭据通过环境变量注入,不存储在代码仓库中;
.dockerignore排除敏感文件 - 日志脱敏:系统日志中自动过滤敏感信息(Token、路径中的用户名)
- 数据传输完整性:benchmark结果通过行分隔JSON协议(
benchlib::comm)传输,结构化格式确保完整性可验证
8.3 供应链安全
- 依赖审计:
Cargo.lock锁定所有依赖版本,CI流水线可集成cargo-audit扫描已知漏洞 - 构建可复现:Docker多阶段构建(
Dockerfile)使用固定基础镜像,确保构建环境一致 - 评测集完整性:评测集代码作为workspace成员管理,版本与主项目同步;第三方依赖通过Cargo.lock锁定
- 许可证合规:REUSE Specification管理许可证(MIT/Apache-2.0),
REUSE.toml声明所有文件的许可证归属
8.4 安全运营
| 运营活动 | 频率 | 说明 |
|---|---|---|
| 依赖漏洞扫描 | 每周(CI集成) | cargo-audit + Dependabot自动PR |
| 系统安全补丁 | 每月 | Docker基础镜像更新、OS安全补丁 |
| 访问权限审计 | 每季度 | GitHub仓库权限、部署密钥轮换 |
| CI/CD安全审查 | 每季度 | GitHub Actions workflow权限最小化 |
九、可维测设计
9.1 可维护性设计
| 设计要素 | 实现方式 | 实现对应 |
|---|---|---|
| 模块化架构 | Cargo Workspace四模块独立编译部署 | collector/database/site/intern松耦合 |
| 配置外置 | CLI参数 + 环境变量 + 数据库配置 | clap CLI框架,--db/--iterations/--group等参数 |
| 版本管理 | Cargo.toml语义化版本,数据库Schema迁移 | SQLite/PostgreSQL双后端各自管理Schema |
| 自动化部署 | Docker多阶段构建 + GitHub Actions | Dockerfile(Node.js前端 + Rust后端),.github/workflows/deploy.yml |
| 评测集扩展 | 新增benchmark组仅需创建crate目录 | runtime-benchmarks/ 下新建目录即自动发现 |
9.2 可测试性设计
- CI验证流水线:
.github/workflows/ci.yml覆盖编译检查、运行时benchmark验证、profiling验证、Site端点测试 - Benchmark验证脚本:
ci/check-runtime-benchmarks.sh(运行时)、ci/check-compile-benchmarks.sh(编译时)、ci/check-profiling.sh(profiling) - Site端点测试:
ci/check-site.py验证Web API端点可用性 - 跨平台CI:GitHub Actions矩阵测试(Linux + Windows),确保核心逻辑跨平台兼容
--no-isolate快速验证:复用已编译产物,加速CI中的重复验证
9.3 可观测性设计
| 观测维度 | 工具/方案 | 关键指标 |
|---|---|---|
| 实时输出 | stderr统计信息(min/mean/stddev) | 每个benchmark完成后即时输出性能数据 |
| 进度追踪 | Finished <group>/<benchmark> (<current>/<total>) |
评测进度可视化 |
| 历史对比 | bench_cmp TUI + 数据库查询 | 任意两个artifact间的性能变化(含置信区间) |
| CI日志 | GitHub Actions日志 | 构建/测试/部署全流程日志 |
| 告警 | CI失败通知 + 性能劣化检测 | PR评论自动标注显著劣化 |
9.4 告警策略
| 告警级别 | 触发条件 | 通知方式 | 响应时间要求 |
|---|---|---|---|
| P0-紧急 | Collector全部离线、数据库不可用 | 电话 + 企业微信 | 15分钟内响应 |
| P1-严重 | 每日评测连续失败、磁盘空间 < 10% | 企业微信 + 邮件 | 1小时内响应 |
| P2-一般 | 单次评测失败、性能劣化超阈值 | GitHub PR评论 + 企业微信 | 4小时内响应 |
| P3-提示 | 评测耗时异常增长、依赖漏洞发现 | 邮件 / Dependabot PR | 下一工作日处理 |
十、参考资料
- rustc-perf GitHub仓库
- perf.rust-lang.org — Rust编译器性能仪表盘
- rustc-perf改进 — Rust 2025H2项目目标
- rustc-perf多Collector设计文档
- Rust编译器性能测试 — rustc开发指南
- 探索Rust编译器基准测试套件 — Kobzol博客
- ratatui — Rust终端UI框架
- perf_event crate — Rust perf_event_open绑定
- Valgrind/Cachegrind — 指令级性能分析
- Linux perf使用指南 — Brendan Gregg
- ARM64 perf支持 — Linux内核文档
- ARM PMU特性介绍 — ARM社区博客
- Daft — 分布式数据框架
- Volo — 字节跳动Rust RPC框架
- Monoio — 字节跳动Rust异步运行时