(本文原发于 V2Ray.com,由于结构调整,博客内容全部移到了 SteemIt)。
一直都有人问 V2Ray 的性能问题,一直都很无奈因为没有人测过。被问得烦了,现在给一个比较科学,比较准确的结论。
测试 VMess 和 Shadowsocks 各种加密方式,在传输过程中的极限速度。
在同一台主机上同时启动 V2Ray 客户端和服务器端,使用环回网络(Loopback)进行网络传输。客户端会接受到预设数量的数据,然后验证服务器端发出同样数量的数据。
一台云主机,内存 2GB,CPU 信息如下。显然这台机器本身的性能不怎么样,如果用一台更好的机器,会得到更好的绝对数值,但本次实验结果的数值比例有参考价值。
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 61
Model name: Virtual CPU a7769a6388d5
Stepping: 2
CPU MHz: 2399.996
BogoMIPS: 4799.99
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 4096K
NUMA node0 CPU(s): 0,1
特地写了两个小工具:loadgen 和 receiver。
loadgen 用于发送数据,它可以对某个端口建立连接,支持直连和 Socks 协议。可配置并发一定数量的连接,发送指定数量的数据后,验证 receiver 的反馈。如果 receiver 收到了同样数量的数据,则表明传输结束。
receiver 用于接收数据,对于每个连接,每次收到数据后,把总共收到的数据字节数发回,并等待连接发起方关闭连接。
由于 VMess 的正确性已被其它的测试验证,这里只需要验证连接畅通,即收到数据量等于发出数据量即可。
我们用 loadgen 和 receiver 直接对接,可以得出环回网络的大致性能。实验结果如下:
数据量:50 GB / 连接
| 并发连接数 | 1 | 2 | 4 |
|---|---|---|---|
| 速度(MB/s) | 4266 | 4654 | 4551 |
对比下面实验中的速度,可以认为环回网络的基本速度不会成为瓶颈。
进一步的基础信息,我们又测了一下使用 V2Ray 直连的速度。实验中只启动一个 V2Ray 进程,配置 Dokodemo-door <-> Freedom。实验结果如下:
数据量:10 GB / 连接
| 并发连接数 | 1 | 2 | 4 |
|---|---|---|---|
| 速度(MB/s) | 640 | 819 | 787 |
测试场景的差别是 VMess 的加密方式,其它都一样。传入依然是 Dokodemo-door,传出是 Freedom。
结果如下(数据量:10 GB / 连接):
解读如下:
很有趣的一点是 None 居然比 GCM 慢。不加密反而比加密慢,有一点违反常识。原因是这样的:VMess 不管加不加密,都会进行数据校验,None 中使用的校验算法是 FNV,而 GCM 是一个 AEAD 算法,自带校验。于是带 CPU 加成的校验比软件实现的校验快了不小。这一点也超出了开发人员的预期,之后会考虑提升校验的性能。
V2Ray 和 Shadowsocks 的比较也是一个常见问题。既然我们有了一个性能测试的工具,那就一起测一下吧。
OTA 在所有 Shadowsocks 中都启用了。
实验结果(数据量:10 GB / 连接):
解读如下: