跳转到内容

性能

secnetperf 风格微基准,loopback UDP。吞吐以真实 TLS 1.3 握手测量(quic-go BenchmarkTransfer 模型);installed-keys 旁路仅用于单点延迟微基准。loopback 吞吐 run 间波动 ±20%——趋势与量级比绝对值更重要

~390 MB/s
单流 · 真实握手
21.7 μs
回声延迟 · P50
~304 MB/s
4 流聚合
口径 单流 握手 含义
installed-keys,线程化 std.Io ~1.94 GB/s 旁路 原始传输上限(README 表头);跳过 transport parameters 协商
真实 TLS 1.3 握手 ~310–440 MB/s 真实 真实客户端能拿到的数字;本页表头

installed-keys 旁路握手(即跳过 RFC 9000 §7.4 的 transport parameters 协商), ~1.94 GB/s 应读作上限,而非面向客户端的数字。

指标 数值 说明
单流吞吐 ~310–440 MB/s 3 次实测 313 / 318 / 440(run 间 ±20%)
握手耗时 ~0.6–1.0 ms/轮 TLS 1.3,transport parameters 经协商(RFC 9000 §7.4)
传输 64 MB/轮 8900 B datagram,CUBIC,100μs receiveTimeout
百分位 延迟
P50 21.7 μs
P99 77.3 μs
P99.9 175.9 μs

5000 次迭代,真实握手后 1 KB 完整 QUIC 往返。

多流(4 并发) 数值 说明
聚合 ~304 MB/s stddev 4.5%,比单流更稳
丢包率 吞吐量 说明
1%(loopback) 452 MB/s CUBIC 快速恢复
5%(loopback) 303 MB/s
1%(100μs RTT) 126 MB/s
5%(100μs RTT) 120 MB/s

无 UDP 开销——隔离连接 / CRYPTO 状态机。

指标 数值 说明
流上传(16 MB) 0.35 GB/s CUBIC,cwnd = 272 KB
Echo P50 7.5 μs 1 KB 完整 QUIC 往返(内存直连)
Echo P99 47.7 μs 长尾受 OS 调度影响
Echo P99.9 665.2 μs
4 流聚合(4×4 MB) 0.34 GB/s 共享 cwnd
指标 数值
Real time 3.90 s
User CPU 3.21 s(约 82% 单核)
Sys CPU 4.25 s(约 109%,多核累积)
Peak RSS ~2.4 GB(bench arena 跨迭代累积,非生产单连接)

sys CPU 高来自每包 UDP sendto/recvfrom 系统调用;吞吐受 ACK 时钟与共享 I/O 路径限制, 非纯 CPU 算力。

跨实现吞吐数字引自外部基准(secnetperf、KIT 2025、TQUIC、quic-go#3670)——非 quicz 实测。完整带来源表格见功能对比页。

nanoTime() 辅助有 Linux clock_gettime 分支,且所有 bench 产物可在 Linux 构建,所以套件也能跑在 原生 aarch64 Linux 容器。那里的 loopback 走 Docker 虚拟网卡,因此数字是环境受限上限,非 quicz 极限

指标 macOS(原生) aarch64 Linux 容器
单流(真实握手) ~426–507 MB/s ~51 MB/s(docker veth UDP ~60 MB/s 上限)
DATAGRAM ~199 MB/s ~64 MB/s
Echo 延迟 P50 20.1 μs 31.6 μs

真实裸机 Linux 吞吐需要非虚拟化主机。两条运行时注记:drainOutgoing 通过 sendMany 批量发送 (Linux 每批一个 sendmmsg 系统调用;macOS 保持每 datagram 发送),接收缓冲池化(16 项池替代每 datagram 分配)。

  • 协议 —— QUIC v1;吞吐每连接做真实 TLS 1.3 握手;installed 1-RTT 密钥仅用于延迟微基准。
  • 套接字 —— loopback UDP,8900 字节 datagram(macOS UDP 上限 9000B)。
  • I/O 层 —— std.Io.Threaded(跨平台,Linux 自动启用 sendmmsg 批量)。
  • 构建 —— zig build-exe -OReleaseFast
  • 平台 —— Apple M 系列,macOS,Zig 0.16。
  • 拥塞 —— CUBIC(RFC 8312/9438);ns 精度 token bucket pacer。
  • 波动 —— run 间 ±20%(系统负载、CUBIC 窗口动态、热状态);多次跑以区间给出。
Terminal window
# 标准化套件:以 ReleaseFast 构建每个基准,按固定顺序全跑,并把平台/commit 元数据
# 与完整输出记到 bench_results/<UTC 时间戳>_<commit>.log(已提交结果做基线)
scripts/run_bench_suite.sh
zig build bench-suite # 同顺序,不记录结果
# 单个基准
zig build run-quic-bench # installed-keys 微基准
zig build run-quic-bench-hs # 真实握手吞吐 + 延迟
zig build run-quic-bench-simple # 单线程原始处理
zig build run-quic-bench-datagram # RFC 9221 DATAGRAM 吞吐
zig build run-quic-bench-profile # 逐阶段剖析
zig build run-congestion-bench # NewReno vs CUBIC 模拟丢包
  • 真实握手,非旁路。 吞吐每轮新建 TLS 1.3 握手,transport parameters 经协商(RFC 9000 §7.4);installed-keys 跳过协商,仅作延迟点。
  • ±20% 波动。 loopback 上 CUBIC 在 ~1μs RTT 的窗口动态使单流 noisy;多流聚合更稳。 数字按量级读。
  • macOS 无 GSO / XDP。 每包主成本是 QUIC 处理 CPU(AES-128-GCM 硬件加速 ~4.9μs/包 + 成帧);UDP sendto ~3.5–4.7μs/包非主因。Linux GSO/GRO(3–10x)或 XDP 可提升 quicz。
  • Go / Rust 在 Linux 受益于零拷贝 sendmsg + GSO,本次未涉及。
  • 回声延迟(P50 / P99 / P99.9)
  • 多流并发(4 流)
  • 丢包恢复(1% / 5%,loopback + 100μs RTT)
  • CPU 占用
  • DATAGRAM 吞吐(RFC 9221)
  • 外部互通吞吐(quic-go / quiche / s2n-quic 对端)