---
title: "UDP 性能报告"
---

> Documentation Index
> Fetch the complete documentation index at: https://openarkstudio.github.io/arknet/llms.txt
> Use this file to discover all available pages before exploring further.

# UDP 性能报告

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 条在途消息，无额外业务计算：

![UDP 吞吐量：不同 IO 模型的三次运行中位数与范围](/arknet/performance/assets/udp-work0-throughput.svg)

![UDP p99 RTT：不同 IO 模型的三次运行中位数与范围](/arknet/performance/assets/udp-work0-latency.svg)

| 依赖方案 | 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 数值](/arknet/performance/udp-summary.json) · [64／1024／16384 字节完整结果](/arknet/zh/performance/udp) · [包体与在途数量图表](/arknet/zh/performance/dimensions-udp)

## 接收缓冲隔离实验

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 流量控制的区别见[缓冲区与流量控制](/arknet/zh/guides/socket-buffers)。保持原生 UDP 数据报语义，当前不新增默认限速、切包或重传。

## 复现与原始证据

按 [UDP 构建说明](/arknet/zh/features/udp/performance#%E6%9E%84%E5%BB%BA%E4%B8%8E%E6%89%A7%E8%A1%8C)编译后，直接运行 C++ 用例：

```sh
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，可复现表中的无丢失配置。

[完整原始记录、命令与机器信息](https://github.com/OpenArkStudio/arknet/tree/main/benchmarks/results/macmini-m4pro-20261012-udp) · [逐次内核快照](https://github.com/OpenArkStudio/arknet/tree/main/benchmarks/results/macmini-m4pro-20261012-udp/buffer-probes) · [大小边界图表](/arknet/zh/performance/udp-limits)

这些结果只覆盖该机器上的短时 IPv4 回环，未测量跨主机或 IPv6 压力容量。RUDP 有独立的 [性能报告](/arknet/zh/performance/rudp)。协程对比测量原生 TCP，不应套用于 UDP。

Source: https://openarkstudio.github.io/arknet/zh/performance/udp-update/index.mdx
