2026-10-12 在本机完成 504 次矩阵测量、21 次接收缓冲隔离实验,以及两种依赖方案各 60 秒的持续测试。结果来自独立 Release C++ 程序,不来自 CI。
测试条件
| 项目 | 配置 |
|---|---|
| 机器 | Mac mini Mac16,11,Apple M4 Pro,14 核(10 性能 + 4 能效),48 GiB |
| 系统 | macOS 27.0.1(26A434),arm64,接通电源,低电量模式关闭 |
| 工具链 | Apple Clang 21.0.0,CMake 4.3.3,Ninja,C++20,Release -O3 -DNDEBUG |
| 依赖 | Standalone Asio 1.38.2/Boost 1.90.0,OpenSSL 3.6.4;TLS 构建开启、Sanitizer 关闭 |
| 路径 | IPv4 回环;客户端与服务端同进程;不绑定 CPU 核心 |
| 测量 | 每组独立进程重复 3 次;1 秒测量、0.25 秒预热;隔离实验不预热 |
| socket 缓冲 | 发送 64 KiB/接收 4 MiB;隔离实验改变服务端接收容量 |
矩阵源码 SHA-256:0771574af8ca56f1914deb544b956079e0a2f24021953ded5f5d524e3df334b1。隔离实验在此基础上增加服务端收包计数与可配置接收缓冲,归档包含修改内容和可执行文件哈希。
正确性与压力范围
| 组别 | Standalone | Boost | 结论 |
|---|---|---|---|
| 持续 UDP 测试 | 60 秒通过 | 60 秒通过 | 本次运行的数据与关闭检查通过 |
| IO 模型,3 档包体 × 2 档客户端 × 5 档模型 | 90 / 90 通过 | 90 / 90 通过 | 窗口 1 的性能基线 |
| 包体/批量,3 档包体 × 4 档窗口 × 3 档模型 | 93 / 108 通过 | 93 / 108 通过 | 合计 62 个有效配置、10 个失败配置 |
| 大小边界,6 档包体 × 3 档窗口 | 36 / 54 通过 | 36 / 54 通过 | 大突发超过接收缓冲容量 |
失败原始数据完整保留。任一次重复失败,该配置的三次结果均不参与吞吐量排名。
吞吐量与延迟
1024 字节、16 个客户端、每客户端 1 条在途消息,无额外业务计算:
| 依赖方案 | io_context / 线程 | 往返 / s | p99 RTT / μs | 进程 CPU / % |
|---|---|---|---|---|
| Standalone | 1 / 1 | 92,515 | 207.79 | 99.4 |
| Standalone | 1 / 2 | 86,611 | 211.58 | 173.3 |
| Boost | 1 / 1 | 90,452 | 207.96 | 99.7 |
| Boost | 1 / 2 | 95,095 | 270.71 | 157.4 |
此负载下,Standalone 单线程的吞吐量中位数最高。Boost 双线程吞吐量稍高,但 p99 和 CPU 占用也更高。
柱子为中位数,误差线为三次运行的最小/最大值,不是置信区间。CPU 以单核为 100%,包括同进程客户端与服务端;整机占比为进程 CPU% / 14。
全部 IO 数值 · 64/1024/16384 字节完整结果 · 包体与在途数量图表
接收缓冲隔离实验
16 个客户端、1 个 context/1 个线程;每组重复三次,无预热。表中丢失数量在三次运行中相同。
| 包体 / B | 每客户端在途数量 | 服务端实际接收缓冲 | 总在途包体预算 | 每次丢失 |
|---|---|---|---|---|
| 16,384 | 64 | 1 MiB | 16 MiB | 959 |
| 16,384 | 64 | 2 MiB | 16 MiB | 895 |
| 16,384 | 64 | 4 MiB | 16 MiB | 767 |
| 16,384 | 16 | 4 MiB | 4 MiB | 0 |
| 16,384 | 1 | 4 MiB | 256 KiB | 0 |
| 1,472 | 64 | 4 MiB | 1.44 MiB | 0 |
| 1,024 | 1,024 | 4 MiB | 16 MiB | 12,411 |
全部运行满足:客户端发送数 − 服务端收到数 = 丢失数;服务端收到数 = 客户端回包数。内容和序号错误为零。4 MiB/16 KiB/窗口 64 的一轮中,内核 dropped due to full socket buffers 从 152,304 增至 153,071,增量恰好 767;IPv4 分片/重组增量为零。
配置方法与 TCP/UDP 流量控制的区别见缓冲区与流量控制。保持原生 UDP 数据报语义,当前不新增默认限速、切包或重传。
复现与原始证据
按 UDP 构建说明编译后,直接运行 C++ 用例:
build-perf/benchmarks/arknet_loopback_benchmark \
--protocol udp --payload 16384 --clients 16 --window 64 \
--io-model shared --io-threads 1 --seconds 1 --warmup 0 \
--udp-server-receive-buffer 4194304这组溢出探测预计返回非零退出码;将窗口改为 16,或将包体改为 1472,可复现表中的无丢失配置。
完整原始记录、命令与机器信息 · 逐次内核快照 · 大小边界图表
这些结果只覆盖该机器上的短时 IPv4 回环,未测量跨主机或 IPv6 压力容量。RUDP 有独立的 性能报告。协程对比测量原生 TCP,不应套用于 UDP。