鲲鹏Rust生态软件性能评估系统设计方案

一、背景与需求

1.1 背景

Rust语言亲和是鲲鹏计算平台2026年重点业务之一,其目的为提升鲲鹏用户生态中关键Rust软件及Rust标准库在鲲鹏计算平台上的性能表现,从而提升鲲鹏服务器产品竞争力。

基于生态拓展目的,鲲鹏计算平台需要建立 Rust生态软件性能评测系统,实现以下核心能力:

  • 多维度性能评估:实时评估不同Rust语言版本、不同硬件平台、不同软件代码实现的性能表现
  • 优化方向分析:基于评测数据定位性能瓶颈,指导优化工作方向
  • 社区影响力建设:将评测系统贡献至Rust上游开源社区,牵引社区在Rust语言演进中关注ARM软件性能,提升ARM软件生态优先级

1.2 Rust社区现有性能基础设施(rustc-perf)

Rust官方社区已建立编译器性能评测基础设施 rustc-perfgithub.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=y
  • CONFIG_HW_PERF_EVENTS=y
  • /proc/sys/kernel/perf_event_paranoid = -1

2.2.4 数据持久化

系统支持 SQLitePostgreSQL 双后端,通过统一的 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 可视化与数据展示

系统提供终端TUIWeb前端两种展示方式:

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/slatency_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代码变更时:

  1. @rust-bench queue触发try build评测
  2. x86_64 Collector和ARM Collector同时运行评测
  3. 结果以评论形式回复PR,包含两个平台的性能变化
  4. 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_runtimebench_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过滤BenchmarkFilter trait 支持 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 下一工作日处理

十、参考资料

  1. rustc-perf GitHub仓库
  2. perf.rust-lang.org — Rust编译器性能仪表盘
  3. rustc-perf改进 — Rust 2025H2项目目标
  4. rustc-perf多Collector设计文档
  5. Rust编译器性能测试 — rustc开发指南
  6. 探索Rust编译器基准测试套件 — Kobzol博客
  7. ratatui — Rust终端UI框架
  8. perf_event crate — Rust perf_event_open绑定
  9. Valgrind/Cachegrind — 指令级性能分析
  10. Linux perf使用指南 — Brendan Gregg
  11. ARM64 perf支持 — Linux内核文档
  12. ARM PMU特性介绍 — ARM社区博客
  13. Daft — 分布式数据框架
  14. Volo — 字节跳动Rust RPC框架
  15. Monoio — 字节跳动Rust异步运行时