鲲鹏Rust生态软件性能评测系统开发实施操作方案

一、概述

本文档基于 rust-bench 项目源码实现,提供在鲲鹏ARM服务器和x86_64服务器上进行Rust生态软件性能评测的完整操作指南,涵盖环境部署、性能数据生成、数据对比分析、数据持久化和可视化展示的全流程。


二、环境准备与部署

2.1 硬件环境

角色 硬件 操作系统 用途
ARM Collector 鲲鹏920B服务器 openEuler 22.03 / Ubuntu 22.04 (aarch64) ARM平台性能评测
x86 Collector AMD EPYC 9654 服务器 Ubuntu 22.04 (x86_64) x86平台性能评测
数据库/Web服务器 通用服务器 Ubuntu 22.04 PostgreSQL + Site前端

2.2 软件依赖安装

2.2.1 基础依赖(所有Collector节点)

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y \
    g++ curl ca-certificates libc6-dev make \
    libssl-dev pkg-config git cmake zlib1g-dev \
    linux-tools-common linux-tools-generic linux-tools-$(uname -r)

# openEuler (鲲鹏ARM)
sudo dnf install -y \
    gcc-c++ curl ca-certificates glibc-devel make \
    openssl-devel pkgconfig git cmake zlib-devel \
    perf

2.2.2 Rust工具链安装

# 安装 rustup 和 stable 工具链
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- \
    --default-toolchain stable --profile minimal -y
source $HOME/.cargo/env

# 安装多版本工具链(用于对比测试)
rustup install nightly
rustup install beta
rustup install 1.91.0  # rust-bench 要求的最低版本

2.2.3 perf_event 权限配置

# 设置 perf_event_paranoid(每次重启后需重新设置)
sudo bash -c 'echo -1 > /proc/sys/kernel/perf_event_paranoid'

# 持久化配置(写入 sysctl)
echo 'kernel.perf_event_paranoid = -1' | sudo tee /etc/sysctl.d/99-perf.conf
sudo sysctl --system

2.2.4 Valgrind 安装(用于 Cachegrind profiling)

# 从源码编译 Valgrind(推荐,确保版本兼容)
git clone https://sourceware.org/git/valgrind.git
cd valgrind
git checkout 74e180e3c4d9e6bb4b2a9cd22eca7703412c5d42  # 稳定版本
./autogen.sh
./configure --prefix=$HOME/valgrind-build
make -j$(nproc)
make install

# 添加到 PATH
echo 'export PATH=$HOME/valgrind-build/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

2.3 评测环境降噪配置

为确保评测结果稳定可复现,需对评测机进行以下配置:

# 1. 固定CPU频率(禁用动态调频)
sudo cpupower frequency-set -g performance
# 或直接写入
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance | sudo tee $cpu
done

# 2. 禁用ASLR(地址空间随机化)
sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

# 3. 隔离CPU核心(在GRUB中配置,重启生效)
# 编辑 /etc/default/grub,添加:
# GRUB_CMDLINE_LINUX="isolcpus=4-7 nohz_full=4-7 rcu_nocbs=4-7"
# sudo update-grub && sudo reboot

# 4. 禁用透明大页
sudo bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'

# 5. 确认 ARM PMU 可用(鲲鹏服务器)
cat /proc/sys/kernel/perf_event_paranoid  # 应为 -1
perf stat -e instructions:u,cycles:u ls   # 验证计数器可用

2.4 项目构建

# 克隆项目
git clone <rust-bench-repo-url> rust-bench
cd rust-bench

# 构建 Release 版本(所有组件)
cargo build --release

# 验证构建产物
ls target/release/collector          # 主评测工具
ls target/release/site               # Web前端服务器(可选)
ls target/release/postgres-to-sqlite # 数据导出工具
ls target/release/sqlite-to-postgres # 数据导入工具

三、生成性能数据

3.1 运行时基准测试(核心操作)

运行时基准测试测量用特定版本 rustc 编译后的 Rust 程序执行性能。

基本用法

# 使用系统默认 rustc 运行所有运行时 benchmark
./target/release/collector bench_runtime_local $(rustup which rustc)

# 使用 nightly 工具链
./target/release/collector bench_runtime_local +nightly

# 使用指定路径的 rustc(如自编译的 stage1)
./target/release/collector bench_runtime_local /path/to/rust/build/aarch64-unknown-linux-gnu/stage1/bin/rustc

常用参数

# 指定结果标识符和数据库
./target/release/collector bench_runtime_local +nightly \
    --id kunpeng-nightly-2026-05-18 \
    --db results.db \
    --iterations 10

# 只运行指定的 benchmark 组
./target/release/collector bench_runtime_local +nightly --group std
./target/release/collector bench_runtime_local +nightly --group hashmap

# 按名称前缀过滤
./target/release/collector bench_runtime_local +nightly --include find_existing
./target/release/collector bench_runtime_local +nightly --exclude hashmap

# 复用已编译产物(加速重复运行)
./target/release/collector bench_runtime_local +nightly --no-isolate

参数说明

参数 说明 默认值
<RUSTC> rustc路径或+toolchain 必填
--id <ID> 结果标识符 工具链名或"Id"
--db <PATH> 数据库路径(SQLite)或URL(PostgreSQL) results.db
--iterations <N> 每个benchmark迭代次数 5
--group <GROUP> 只运行指定的benchmark组 全部
--include <PREFIX> 只包含匹配前缀的benchmark 全部
--exclude <PREFIX> 排除匹配前缀的benchmark
--no-isolate 复用已编译的benchmark产物 每次重新编译
--purge 测试前清除该artifact的旧数据 不清除
--cargo <PATH> 指定cargo路径 rustup默认

输出示例

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

3.2 编译时基准测试

编译时基准测试测量 rustc 编译真实世界 crate 的性能。

# 运行完整编译时 benchmark 套件(耗时数小时)
./target/release/collector bench_local $(rustup which rustc)

# 只测试指定 crate,限定 Profile 和 Scenario
./target/release/collector bench_local +nightly \
    --id kunpeng-compile-nightly \
    --include syn,cargo-0.87.1 \
    --profiles Check,Debug,Opt \
    --scenarios Full,IncrFull

# 启用 self-profile(生成查询/函数级耗时数据)
./target/release/collector bench_local +nightly \
    --id kunpeng-selfprofile \
    --include syn \
    --self-profile

Profile 选项:Check / Debug / Doc / Opt / Clippy / All Scenario 选项:Full / IncrFull / IncrUnchanged / IncrPatched / All

3.3 跨平台对比评测操作流程

在鲲鹏ARM和x86_64两台服务器上分别执行相同评测,生成可对比的数据:

# === 鲲鹏ARM服务器 ===
./target/release/collector bench_runtime_local +nightly \
    --id nightly-arm-2026-05-18 \
    --db results-arm.db \
    --iterations 10

# === x86_64服务器 ===
./target/release/collector bench_runtime_local +nightly \
    --id nightly-x86-2026-05-18 \
    --db results-x86.db \
    --iterations 10

如使用共享 PostgreSQL 数据库,两台机器可写入同一数据库:

# 两台服务器均指向同一 PostgreSQL
./target/release/collector bench_runtime_local +nightly \
    --id nightly-arm-2026-05-18 \
    --db postgresql://user:pass@db-server:5432/rustbench \
    --iterations 10

3.4 多Rust版本对比评测

# 在同一台机器上测试多个版本
./target/release/collector bench_runtime_local +stable --id stable-1.80
./target/release/collector bench_runtime_local +beta --id beta
./target/release/collector bench_runtime_local +nightly --id nightly

# 测试特定 commit(需安装 rustup-toolchain-install-master)
./target/release/collector bench_runtime_local +abc1234def5678 --id pr-12345

四、性能数据对比

4.1 bench_cmp 交互式TUI对比

bench_cmp 提供基于终端的交互式对比界面,用于比较两个 artifact 之间的性能差异。

# 启动 TUI 对比界面(交互选择要对比的两个 artifact)
./target/release/collector bench_cmp --db results.db

操作快捷键

快捷键 功能
M 切换编译时/运行时对比模式
A / S 切换指标(instructions → cycles → wall-time → ...)
F 切换显示全部结果 / 仅显示显著变化
1 / 2 切换目标平台
Enter 在JSON行上打开详情视图
/ 列表导航
q / Esc 退出

界面内容

  • 顶部摘要面板:回归/改进数量统计
  • 详细表格:Benchmark名称、Before值、After值、变化幅度(含95%置信区间)

4.2 使用 Site Web 界面对比

# 启动 Web 服务器
./target/release/site results.db
# 或连接 PostgreSQL
DATABASE_URL=postgresql://user:pass@localhost:5432/rustbench ./target/release/site

# 等待 "Loading complete" 输出后,浏览器访问:
# http://localhost:2346/compare.html?start=nightly-arm&end=nightly-x86&stat=instructions:u

如果采集了新数据,可通知 Site 刷新:

curl -X POST localhost:2346/perf/onpush

4.3 Codegen Diff(汇编级对比)

对比两个 rustc 版本生成的汇编/LLVM IR/MIR 差异,用于定位具体指令级变化:

# 汇编对比
./target/release/collector codegen_diff asm <benchmark-name> <rustc1> <rustc2>

# 带源码注解的汇编对比
./target/release/collector codegen_diff asm-source <benchmark-name> <rustc1> <rustc2>

# LLVM IR 对比
./target/release/collector codegen_diff llvm <benchmark-name> <rustc1> <rustc2>

# MIR 对比
./target/release/collector codegen_diff mir <benchmark-name> <rustc1> <rustc2>

4.4 Binary Size 对比

# 对比两个 rustc 编译同一 benchmark 的二进制体积
./target/release/collector binary_stats compile $(rustup which rustc) \
    --include syn --rustc2 $(rustup +nightly which rustc)

# 对比本地二进制文件
./target/release/collector binary_stats local ./binary_v1 ./binary_v2

五、性能分析(Profiling)

5.1 运行时 Profiling

Cachegrind(指令级确定性分析)

# 分析所有运行时 benchmark
./target/release/collector profile_runtime +nightly cachegrind

# 分析指定组
./target/release/collector profile_runtime +nightly cachegrind --group std

# 分析指定 benchmark
./target/release/collector profile_runtime +nightly cachegrind --include find_existing

# 对比两个 rustc 版本(生成 diff 文件)
./target/release/collector profile_runtime +stable cachegrind --rustc2 +nightly

输出文件(位于 results/ 目录):

  • cgout-*:Cachegrind 原始数据
  • cgann-*:人类可读的注解输出(含每行指令计数)

精确模式(仅测量 benchmark 代码本身,需 Valgrind ≥ 3.22):

DEP_VALGRIND=$HOME/valgrind-build/include cargo run --release --bin collector \
    --features precise-cachegrind \
    profile_runtime +nightly cachegrind --group std

perf-record(采样式热点分析)

# 采样式分析
./target/release/collector profile_runtime +nightly perf-record --group std

# 分析指定 benchmark
./target/release/collector profile_runtime +nightly perf-record --include find_existing

输出文件

  • perf-*:perf 原始数据(可用 perf report 或 Hotspot 查看)
  • perfreport-*:注解报告

5.2 编译时 Profiling

# Cachegrind 分析编译过程
./target/release/collector profile_local cachegrind +nightly \
    --id profile-test \
    --include syn \
    --profiles Check

# perf-record 分析编译过程
./target/release/collector profile_local perf-record +nightly \
    --id profile-test \
    --include syn \
    --profiles Opt

# DHAT 堆分析(定位内存分配热点)
./target/release/collector profile_local dhat +nightly \
    --id profile-test \
    --include syn \
    --profiles Check

# Massif 峰值内存分析
./target/release/collector profile_local massif +nightly \
    --id profile-test \
    --include syn

5.3 Profile 结果分析

# 查看 Cachegrind 注解(找到热点函数和行)
less results/cgann-profile-test-syn-Check-Full

# 使用 perf report 查看采样数据
perf report -i results/perf-profile-test-syn-Check-Full

# 使用 Hotspot 可视化(推荐)
hotspot results/perf-profile-test-syn-Check-Full

# 使用 cg_diff 对比两次 Cachegrind 结果
cg_diff results/cgout-v1-syn-Check-Full results/cgout-v2-syn-Check-Full > diff.txt
cg_annotate diff.txt

六、数据持久化

6.1 SQLite 本地存储(默认)

默认情况下,评测结果存储在本地 SQLite 文件中:

# 默认写入 results.db
./target/release/collector bench_runtime_local +nightly

# 指定数据库文件路径
./target/release/collector bench_runtime_local +nightly --db /data/benchmarks/kunpeng.db

SQLite 适用于:

  • 本地开发和调试
  • 单机评测
  • 快速验证

6.2 PostgreSQL 生产存储

生产环境使用 PostgreSQL,支持多 Collector 并发写入和远程访问。

部署 PostgreSQL

# 使用 Docker 快速部署
docker run -d \
    --name rustbench-pg \
    -e POSTGRES_USER=rustbench \
    -e POSTGRES_PASSWORD=<secure-password> \
    -e POSTGRES_DB=rustbench \
    -p 5432:5432 \
    -v pgdata:/var/lib/postgresql/data \
    postgres:16-alpine

# 或使用项目自带的 docker-compose
make start-postgres

写入 PostgreSQL

# Collector 直接写入 PostgreSQL
./target/release/collector bench_runtime_local +nightly \
    --id nightly-arm-2026-05-18 \
    --db postgresql://rustbench:<password>@db-server:5432/rustbench

6.3 数据迁移工具

# SQLite → PostgreSQL(本地数据上传到生产库)
./target/release/sqlite-to-postgres \
    results.db \
    'postgresql://rustbench:<password>@db-server:5432/rustbench'

# PostgreSQL → SQLite(从生产库导出到本地分析)
./target/release/postgres-to-sqlite \
    'postgresql://rustbench:<password>@db-server:5432/rustbench' \
    local-analysis.db

# 只导出最近N周的数据
./target/release/postgres-to-sqlite \
    --since-weeks-ago=4 \
    'postgresql://rustbench:<password>@db-server:5432/rustbench' \
    recent.db

6.4 数据备份策略

# SQLite 备份(文件复制即可)
cp results.db "backups/results-$(date +%Y%m%d).db"

# PostgreSQL 备份
pg_dump -h db-server -U rustbench rustbench > "backups/rustbench-$(date +%Y%m%d).sql"

# 定时备份(crontab)
# 每日凌晨2点备份
0 2 * * * /usr/bin/pg_dump -h db-server -U rustbench rustbench | gzip > /backups/rustbench-$(date +\%Y\%m\%d).sql.gz

七、可视化部署

7.1 Site Web 前端部署

本地开发模式

# 构建前端(需要 Node.js 18+)
cd site/frontend
npm ci
npm run build
cd ../..

# 构建 site 服务器
cargo build --release --bin site

# 启动(SQLite)
./target/release/site results.db
# 访问 http://localhost:2346

# 启动(PostgreSQL)
DATABASE_URL=postgresql://rustbench:<password>@db-server:5432/rustbench \
    ./target/release/site

Docker 生产部署

# 构建 Docker 镜像(多阶段构建:Node.js前端 + Rust后端)
docker build -t rust-bench-site .

# 运行容器
docker run -d \
    --name rust-bench-site \
    -e DATABASE_URL=postgresql://rustbench:<password>@db-server:5432/rustbench \
    -p 2346:2346 \
    rust-bench-site

Web 界面功能

访问 http://<server>:2346/compare.html

  • 版本对比:在 "Commit/Date A" 和 "Commit/Date B" 输入框中填入 artifact ID
  • 指标选择:instructions:u / cycles:u / wall-time / max-rss 等
  • URL 直接访问/compare.html?start=<id1>&end=<id2>&stat=instructions:u

7.2 TUI 终端对比(无需部署)

对于无图形界面的服务器环境,直接使用 bench_cmp TUI:

# 交互式选择 artifact 对比
./target/release/collector bench_cmp --db results.db

# 典型工作流:
# 1. 运行两次评测
./target/release/collector bench_runtime_local +stable --id baseline
./target/release/collector bench_runtime_local +nightly --id candidate
# 2. 启动 TUI 对比
./target/release/collector bench_cmp --db results.db
# 3. 选择 baseline 和 candidate 进行对比

7.3 数据刷新

当采集新数据后,通知 Site 服务器刷新:

curl -X POST http://localhost:2346/perf/onpush

或直接重启 Site 服务器。


八、CI/CD 自动化评测

8.1 GitHub Actions 流水线

项目已配置以下 CI 流水线:

流水线 触发条件 功能
ci.yml PR / merge_group / 每周一 单元测试、benchmark验证、profiling验证、Docker构建
deploy.yml push to master 构建Docker镜像并部署到AWS ECS
nightly.yml 定时触发 Nightly性能趋势数据采集
beta-stable-benchmarks.yml Release事件 Beta/Stable版本性能基线

8.2 本地定时评测(Cron)

# 创建每日评测脚本 /opt/rust-bench/daily-bench.sh
#!/bin/bash
set -e
cd /opt/rust-bench

# 更新 nightly 工具链
rustup update nightly

# 运行评测
./target/release/collector bench_runtime_local +nightly \
    --id "nightly-arm-$(date +%Y-%m-%d)" \
    --db postgresql://rustbench:pass@db-server:5432/rustbench \
    --iterations 10

# 通知 Site 刷新
curl -X POST http://site-server:2346/perf/onpush

# 配置 crontab:每日凌晨3点执行
# 0 3 * * * /opt/rust-bench/daily-bench.sh >> /var/log/rust-bench.log 2>&1

8.3 CI 验证脚本

项目提供了验证脚本,可在部署后快速验证系统功能:

# 验证运行时 benchmark 可正常执行
bash ci/check-runtime-benchmarks.sh

# 验证编译时 benchmark
bash ci/check-compile-benchmarks.sh

# 验证 profiling 功能
bash ci/check-profiling.sh

# 验证 Site API 端点(需先启动 site)
python3 ci/check-site.py <artifact-id-1> <artifact-id-2>

九、新增评测集开发指南

9.1 使用 #[bench] 宏(推荐)

适用于标准微基准测试。在 collector/runtime-benchmarks/ 下创建新 crate:

# 创建新评测组目录
mkdir -p collector/runtime-benchmarks/my-bench

Cargo.toml

[package]
name = "my-bench"
version = "0.1.0"
edition = "2021"

[[bin]]
name = "my-bench"
path = "src/main.rs"

[dependencies]
benchlib = { path = "../../benchlib" }

src/main.rs

use benchlib::benchmark::{bench, Bencher};

#[bench]
fn my_operation(b: &mut Bencher) {
    let data = vec![1u64; 10000];
    b.iter(
        || data.clone(),       // constructor(不被测量)
        |mut v| {              // bench(被测量)
            v.sort();
        },
    );
}

fn main() {
    benchlib::benchmark::run_global_benchmark_group();
}

9.2 使用 Custom API(自定义指标)

适用于需要自定义指标、JSON报告的场景(如 Daft/Volo/Monoio):

use benchlib::comm::messages::{BenchmarkMessage, BenchmarkResult, BenchmarkSample};
use benchlib::comm::output_message;
use benchlib::custom::{init, BenchAction};
use std::time::{Duration, Instant};

fn main() -> benchlib::anyhow::Result<()> {
    let action = init(&["my-custom-bench"])?;

    match action {
        BenchAction::Run { iterations, benchmarks, extra } => {
            let mut stdout = std::io::stdout().lock();

            for name in &benchmarks {
                let mut samples = Vec::with_capacity(iterations as usize);
                for _ in 0..iterations {
                    let start = Instant::now();
                    // ... 执行被测代码 ...
                    let elapsed = start.elapsed();

                    let mut sample = BenchmarkSample::new(elapsed);
                    sample.set("throughput_ops/s", 12345.0);  // 自定义指标
                    sample.set("latency_p99_us", 42.0);
                    samples.push(sample);
                }
                let result = BenchmarkResult::with_samples(name.clone(), samples);
                output_message(&mut stdout, BenchmarkMessage::Result(result))?;
            }
        }
        BenchAction::Profile(args) => { /* profiling 逻辑 */ }
    }
    Ok(())
}

9.3 运行新评测集

# 编译并运行新评测组
./target/release/collector bench_runtime_local +nightly --group my-bench

# 验证输出正常后,提交代码

十、典型操作场景

场景一:评估 Rust Nightly 版本在鲲鹏上的性能变化

# 1. 更新工具链
rustup update nightly

# 2. 运行评测(使用上一次的 stable 作为基线)
./target/release/collector bench_runtime_local +stable --id baseline
./target/release/collector bench_runtime_local +nightly --id candidate

# 3. 对比结果
./target/release/collector bench_cmp --db results.db
# 选择 baseline vs candidate,按 A/S 切换指标查看

场景二:验证 SIMD 优化补丁的效果

# 1. 编译两个版本的 rustc(优化前/后)
# 假设 rustc-before 和 rustc-after 已编译好

# 2. 分别运行目标 benchmark
./target/release/collector bench_runtime_local /path/to/rustc-before \
    --id before-simd --group std --include hashmap
./target/release/collector bench_runtime_local /path/to/rustc-after \
    --id after-simd --group std --include hashmap --no-isolate

# 3. TUI 对比
./target/release/collector bench_cmp --db results.db

# 4. 汇编级对比(确认 SIMD 指令生成)
./target/release/collector codegen_diff asm hashmap /path/to/rustc-before /path/to/rustc-after

场景三:定位性能劣化的热点函数

# 1. 发现 nightly 某 benchmark 劣化后,进行 Cachegrind 分析
./target/release/collector profile_runtime +stable cachegrind \
    --include find_existing --rustc2 +nightly

# 2. 查看 diff 输出
less results/cgann-*-find_existing*
# 找到指令数增加最多的函数和代码行

# 3. 如需采样式分析
./target/release/collector profile_runtime +nightly perf-record \
    --include find_existing
perf report -i results/perf-*-find_existing*

场景四:跨平台性能对比报告

# 1. 两台服务器分别评测,写入同一 PostgreSQL
# [ARM] 
./target/release/collector bench_runtime_local +nightly \
    --id nightly-arm --db postgresql://...

# [x86]
./target/release/collector bench_runtime_local +nightly \
    --id nightly-x86 --db postgresql://...

# 2. 启动 Site 查看对比
DATABASE_URL=postgresql://... ./target/release/site
# 浏览器访问 http://server:2346/compare.html?start=nightly-arm&end=nightly-x86

附录A:常见问题排查

问题 原因 解决方案
perf_event_open 权限错误 perf_event_paranoid 未设置 echo -1 > /proc/sys/kernel/perf_event_paranoid
评测结果噪声大 CPU动态调频/其他进程干扰 固定CPU频率、隔离核心、关闭不必要服务
Cachegrind 报错 Valgrind 版本过低 从源码编译 Valgrind ≥ 3.15(精确模式需 ≥ 3.22)
benchmark 编译失败 Rust工具链版本不兼容 确认使用 Rust ≥ 1.91.0
PostgreSQL 连接失败 网络/认证问题 检查 pg_hba.conf、防火墙、连接字符串
--no-isolate 后结果异常 旧编译产物与新 rustc 不兼容 去掉 --no-isolate 重新编译

附录B:项目关键文件索引

文件/目录 用途
collector/src/bin/collector.rs CLI入口,所有子命令定义
collector/benchlib/src/benchmark.rs #[bench] 宏 + Bencher 核心逻辑
collector/benchlib/src/measure/perf_counter/linux.rs perf_event_open 硬件计数器采集
collector/benchlib/src/custom.rs Custom benchmark API
collector/benchlib/src/comm/messages.rs 消息协议 + 指标常量定义
collector/src/runtime/mod.rs 运行时评测编排逻辑
collector/src/runtime/profile.rs 运行时 Profiling(Cachegrind/perf-record)
collector/src/compare/screen.rs bench_cmp TUI 界面
database/src/pool/postgres.rs PostgreSQL 后端
database/src/pool/sqlite.rs SQLite 后端
site/src/api.rs Web API 端点
.github/workflows/ci.yml CI 流水线定义
Dockerfile 生产部署镜像构建