Repository navigation
Benchmark Reproduction
1.4.0 的公开 runner 已是七列,不是旧五列。需要预构建默认/策略 Rust 驱动、官方 C KCP 和 quic-go 驱动。完整矩阵共 623 次:单连接吞吐 168 次、高并发吞吐 252 次、持续负载延迟 168 次、稀疏延迟 35 次。
需要 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;新锁文件可能解析到其他版本,应归档实测锁文件和二进制校验值。
把未修改的上游 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" ./concurrentQUIC 的测试证书和关闭证书校验只用于 benchmark,不是生产安全配置。
复制相同源码到 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。
进入私有 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 和包聚合仅配置隔离回环设备。
测量之间执行中断时保留日志及中断记录。在新的私有网络中使用相同模式、二进制与设置,将 BENCH_RESUME_FILE 指向已校验 JSONL,追加新输出。runner 跳过精确匹配的成功项并记录新元数据;输入中有失败项则拒绝恢复。应诊断失败,不能丢弃或重复直到中位数好看。
measure-process 用 Linux wait4 分别统计两端整个进程峰值 RSS,包括预热和采样存储,不包括内核 socket 缓冲。按条件、变体和 loaded 标记分组,报告含单位的中位数及最小–最大范围;RTT 在每轮内部算百分位,再聚合。JSONL、日志、源码/二进制哈希、锁文件、qdisc 和 UDP 计数保存在源码提交之外。
独立异步/blocking 指南使用 run_api_comparison.py 和不同负载,不把其结果混入横向表。
English · 简体中文 · GitHub · crates.io 1.4.0 · Reviewed / 核对:2026-10-12 / b909c93
- Overview
- Quick start
- Blocking calls and shared runtimes
- Public API index
- Five reliability modes
- RakNet wire format and recovery
- Message lifecycle and limits
- Bytes and explicit batching
- Send policy
- Recovery policy and tail probes
- Every configuration parameter
- Concurrency and socket tuning
- Errors, deadlines and cancellation
- Congestion and deployment boundaries
- Benchmark results
- Benchmark methodology
- Benchmark reproduction
- Minecraft Bedrock proxy
- Troubleshooting and development
- Release history and upgrading