跳转至

性能对比

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,大小是 MaxPacketSize 65535 加上开销),连接空闲时也一直占着,直到断开。
  • 光这两块就是 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)上重复测试,绝对数值不同,各项排名完全一致。