Skip to content

Benchmark Reproduction

b23r0 edited this page Oct 12, 2026 · 4 revisions

English · 简体中文

Benchmark 复现

1.4.0 的公开 runner 已是七列,不是旧五列。需要预构建默认/策略 Rust 驱动、官方 C KCP 和 quic-go 驱动。完整矩阵共 623 次:单连接吞吐 168 次、高并发吞吐 252 次、持续负载延迟 168 次、稀疏延迟 35 次。

1. 隔离环境

需要 Linux、至少八个可用 CPU、Python 3、C/Rust/Go 编译器,以及 ip、tc、taskset、nice、lscpu。工具只能在一次性容器/VM/任务沙箱中准备,不修改主机工具链、配置或网络。

TASK_ROOT/
  work/                   source revision 1199ac7 (or document your revision)
  policy/                 separate copy with per-socket SendOptions setters
  home/ cargo/ rustup/     task-specific configuration/cache/toolchain
  target/ target-policy/  default/configured release builds
  go/                     Go toolchain, including bin/go
  gomod/ gocache/ gopath/  private Go caches
  kcp/                    upstream ikcp.c, ikcp.h, LICENSE, revision.txt
  bin/                    measure-process, kcp-single, kcp-concurrent,
                          quic-single, quic-concurrent
  logs/ results/ tmp/
export HOME="$TASK_ROOT/home"
export CARGO_HOME="$TASK_ROOT/cargo"
export RUSTUP_HOME="$TASK_ROOT/rustup"
export CARGO_TARGET_DIR="$TASK_ROOT/target"
export GOMODCACHE="$TASK_ROOT/gomod"
export GOCACHE="$TASK_ROOT/gocache"
export GOPATH="$TASK_ROOT/gopath"
export GOTOOLCHAIN=local
export TMPDIR="$TASK_ROOT/tmp"

创建目录并显式导出 TASK_ROOT;通过任务进程 PATH 提供工具链和 OS 工具,不编辑 shell 启动文件。计时前固定并下载依赖。10 月 12 日使用 Rust 1.98.1、Tokio 1.53.2、Go 1.27.2、quic-go v0.63.0;新锁文件可能解析到其他版本,应归档实测锁文件和二进制校验值。

2. 默认构建及 C/Go 对端

把未修改的上游 C KCP 和许可证放进 TASK_ROOT/kcp,固定提交 b1a7a2101dcbb96017681a500d6b82bbe5a88766,将完整 SHA 写入 revision.txt。Go module 固定 quic-go v0.63.0,保留 go.mod/go.sum。

# From TASK_ROOT/work, in the task environment:
cargo build --release --manifest-path examples/test_benchmark/Cargo.toml
cargo build --release --example concurrency_benchmark --example sharded_echo
cc -O2 -std=c11 examples/test_benchmark/measure_process.c -o "$TASK_ROOT/bin/measure-process"
cc -O3 -DNDEBUG -std=c11 -I "$TASK_ROOT/kcp"   examples/test_benchmark/kcp/benchmark.c "$TASK_ROOT/kcp/ikcp.c"   -o "$TASK_ROOT/bin/kcp-single"
cc -O3 -DNDEBUG -std=c11 -pthread -I "$TASK_ROOT/kcp"   examples/test_benchmark/kcp/concurrency.c "$TASK_ROOT/kcp/ikcp.c"   -o "$TASK_ROOT/bin/kcp-concurrent"
# From TASK_ROOT/work/examples/test_benchmark/quic:
"$TASK_ROOT/go/bin/go" build -o "$TASK_ROOT/bin/quic-single" ./single
"$TASK_ROOT/go/bin/go" build -o "$TASK_ROOT/bin/quic-concurrent" ./concurrent

QUIC 的测试证书和关闭证书校验只用于 benchmark,不是生产安全配置。

3. 策略构建

复制相同源码到 TASK_ROOT/policy。在 examples/test_benchmark/src/main.rs、examples/concurrency_benchmark.rs、examples/sharded_echo.rs 中,每个 RakNet 客户端连接后和服务端 accept 后调用 socket.set_send_options(rust_raknet::SendOptions::default()).await?。保留 TCP 分支,库代码、锁文件及其他负载设置保持相同;不能只配置客户端。

CARGO_TARGET_DIR="$TASK_ROOT/target-policy" cargo build --release   --manifest-path "$TASK_ROOT/policy/Cargo.toml"   --features send-policy --example concurrency_benchmark --example sharded_echo
CARGO_TARGET_DIR="$TASK_ROOT/target-policy" cargo build --release   --manifest-path "$TASK_ROOT/policy/examples/test_benchmark/Cargo.toml"   --features rust-raknet/send-policy

只编译 feature 不等于策略列。runner 已为这些变体选择 target-policy,不用重复追加 variant。

4. 私有网络与完整矩阵

进入私有 user/network/PID 沙箱,单用户 UID 映射、命名空间 UID 0、仅命名空间内 CAP_NET_ADMIN。隐藏主机 home,主机只读,仅任务目录可写。两端共享该隔离网络。runner 检查网络边界、工作目录及 HOME/CARGO_HOME,不允许退回主机整形。

# Capture this in the parent before entering the private network namespace:
export TASK_HOST_NETNS="$(readlink /proc/self/ns/net)"
# Inside the namespace, after environment/directory checks:
ip link set lo up
cd "$TASK_ROOT/work"
SMOKE=1 python3 examples/test_benchmark/run_comparison.py single > "$TASK_ROOT/results/smoke.jsonl"
python3 examples/test_benchmark/run_comparison.py single > "$TASK_ROOT/results/single.jsonl"
python3 examples/test_benchmark/run_comparison.py concurrent > "$TASK_ROOT/results/concurrent.jsonl"
LOADED_RTT=1 python3 examples/test_benchmark/run_comparison.py concurrent > "$TASK_ROOT/results/loaded.jsonl"
python3 examples/test_benchmark/run_comparison.py latency > "$TASK_ROOT/results/latency.jsonl"

smoke 不计入正式结果。每项使用新连接、轮换顺序并校验回包/样本数;保留错误记录,失败即停止。稀疏延迟两端固定不同单核,持续/并发负载各固定四核。qdisc、MTU 和包聚合仅配置隔离回环设备。

5. 中断恢复与统计

测量之间执行中断时保留日志及中断记录。在新的私有网络中使用相同模式、二进制与设置,将 BENCH_RESUME_FILE 指向已校验 JSONL,追加新输出。runner 跳过精确匹配的成功项并记录新元数据;输入中有失败项则拒绝恢复。应诊断失败,不能丢弃或重复直到中位数好看。

measure-process 用 Linux wait4 分别统计两端整个进程峰值 RSS,包括预热和采样存储,不包括内核 socket 缓冲。按条件、变体和 loaded 标记分组,报告含单位的中位数及最小–最大范围;RTT 在每轮内部算百分位,再聚合。JSONL、日志、源码/二进制哈希、锁文件、qdisc 和 UDP 计数保存在源码提交之外。

独立异步/blocking 指南使用 run_api_comparison.py 和不同负载,不把其结果混入横向表。

runner 源码 · 驱动说明 · 评估方法

Clone this wiki locally