性能对比¶
kaze 的协议全部自研,为「一台机器承载尽可能多的用户」而设计:连接空闲时几乎不占内存,传输时尽量少做系统调用。下面是在同一台 Linux 机器上,与 Xray、sing-box 在完全相同的负载下的实测对比。
-
Shadowsocks 2022 空闲内存约为 Xray / sing-box 的 1/9
1 万个跑过流量的空闲连接:kaze 约 323 MB,sing-box 约 2.8 GB,Xray 约 3.2 GB。
-
三种协议 CPU 均为最低
每转发 1 GB,kaze 比 Xray 少用 19% ~ 71% 的 CPU,比 sing-box 少用 5% ~ 35%。
-
VLESS / Vision 内核零拷贝
Linux 上直连的数据由内核直接转发(splice),不经过程序本身。
内存:每个空闲连接占用¶
数值越小越好。「新连接」只交换过少量数据;「跑过流量后」每个连接先传过 256 KB 再空闲,更接近真实用户。
| 协议 | kaze | sing-box | Xray |
|---|---|---|---|
| VLESS(新连接 / 跑过流量后) | 15.4 / 17.3 KB | 16.4 / 19.9 KB | 53.6 / 69.2 KB |
| Trojan(新连接 / 跑过流量后) | 39.0 / 52.1 KB | 42.0 / 112.5 KB | 106.6 / 220.9 KB |
| Shadowsocks 2022(新连接 / 跑过流量后) | 26.0 / 32.3 KB | 269.5 / 279.0 KB | 291.9 / 321.1 KB |
折算成 1 万个跑过流量的空闲连接:
| 协议 | kaze | sing-box | Xray |
|---|---|---|---|
| VLESS | 173 MB | 199 MB | 692 MB |
| Trojan | 521 MB | 1.1 GB | 2.2 GB |
| Shadowsocks 2022 | 323 MB | 2.8 GB | 3.2 GB |
Shadowsocks 2022 为什么差这么多?
差距来自实现方式的不同,可以在两者的源码中核实:
- Xray 的 Shadowsocks 2022 没有自己实现,用的是 sing-box 的
sing-shadowsocks库(Xray 的go.mod里可以看到),所以两家的数字几乎一样。 - 这个库每建立一条连接,就固定分配一块 64 KB 的读缓冲和一块 64 KB 的写缓冲(
shadowaead/aead.go的NewReader、NewWriter,大小是MaxPacketSize65535 加上开销),连接空闲时也一直占着,直到断开。 - 光这两块就是 128 KB,加上转发用的复制缓冲和协程栈,约 270 KB。
- kaze 空闲时只留一个 18 字节的数组等下一个数据块的头部,数据真正到达时才借缓冲,用完立即归还。
VLESS 上三家差距就小得多(sing-box 16.4 KB 对 kaze 15.4 KB),因为 sing-box 的 VLESS 也是按需分配的。
这意味着什么
代理节点上绝大多数连接在大部分时间里是空闲的(网页打开后的长连接、App 后台连接)。每个空闲连接省下的内存,乘以成千上万的在线连接,就是同样配置的机器能多承载的用户数。1 GB 内存的小机器上,差别尤其明显。
CPU:每转发 1 GB 消耗的 CPU 时间¶
数值越小越好,三轮测试取中位数。
| 协议 | kaze | sing-box | Xray |
|---|---|---|---|
| VLESS | 0.26 秒 | 0.40 秒 | 0.89 秒 |
| Trojan(TLS) | 1.69 秒 | 1.77 秒 | 2.08 秒 |
| Shadowsocks 2022 | 1.31 秒 | 1.79 秒 | 1.83 秒 |
CPU 越省,同一台机器在跑满带宽时剩下的余量越多,高峰期越不容易卡顿。
为什么省¶
| 做法 | 效果 |
|---|---|
| 连接空闲时不持有任何缓冲区,只在数据到达时才借用,用完立即归还 | 空闲连接内存降到最低 |
| 等待数据时先等 socket 可读,再分配缓冲 | 上万空闲连接不会占着上万块缓冲 |
| Shadowsocks 一次系统调用读入多个加密块,多块合并为一次写出 | 系统调用约为 Xray 的 1/3 |
| 已到达的数据合并成一次写出 | 减少写系统调用 |
| Linux 上直连数据用 splice 在内核内转发 | VLESS / Vision 数据不经过用户态 |
测试方法¶
| 项目 | 说明 |
|---|---|
| 机器 | Linux,2 核 AMD EPYC 9V45 |
| 对比版本 | kaze v0.4.0、sing-box 1.14.2、Xray 26.3.27(v0.5.0 未改动转发路径,数据仍适用) |
| 方式 | 三者分别作为服务端,同一个测试客户端、同一个用户,每次测量都启动全新的服务端进程 |
| 内存 | 建立 3000 个连接(跑过流量的测试为 1000 个)后空闲,记录服务端进程常驻内存的增量,除以连接数 |
| CPU | 单个连接双向回传 4 GB 数据,记录服务端进程消耗的 CPU 时间,除以传输量;三轮取中位数 |
| 协议 | VLESS(TCP,无 TLS)、Trojan(TLS)、Shadowsocks 2022(2022-blake3-aes-128-gcm) |
关于数据
测试在本机回环网络上进行,用于横向比较三者在相同条件下的开销,不代表实际网络中的带宽上限。实际占用会随硬件、内核版本、用户行为而变化。在另一型号的机器(AMD EPYC 9V74)上重复测试,绝对数值不同,各项排名完全一致。