v2ray / discussion

For general discussion over Project V development and usage.
298 stars 34 forks source link

关于v2ray目前各协议的简单性能测试 (2020年10月11日更新) #818

Closed alexyangjie closed 3 years ago

alexyangjie commented 4 years ago

最近看到VLESS很火,就简单做了一个本地的性能测试。测试使用https://github.com/v2ray/experiments 这里的脚本。同时也顺带做了一下目前其他主流协议的测试。

测试环境:某单核VPS。

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 58
model name  : Intel KVM Processor v2.2
stepping    : 9
microcode   : 0x1
cpu MHz     : 2593.914
cache size  : 4096 KB
physical id : 0
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti ssbd ibrs ibpb fsgsbase smep erms xsaveopt md_clear
bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit srbds
bogomips    : 5187.82
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual

所有测试均在该VPS进行,不涉及外网的传输,丢包,延时等情况。以下结果不是一次测出来的,而是分阶段分批次测的。仅供参考。

结果如下(由高到低排序,单位为MB/s,不是Mbps):

loopback                         2844 MB/s
v2ray platform                   1024 MB/s
vless (bare)                     568 MB/s
socks5 (tcp)                     538 MB/s
shadowsocks (bare)               538 MB/s
vmess (bare)                     365 MB/s
vmess (no encryption with AEAD)  353 MB/s
vmess (aes-128-gcm)              330 MB/s
shadowsocks (aes-128-gcm)        330 MB/s
trojan (no tls)                  256 MB/s
vmess (chacha20-poly1305)        204 MB/s
shadowsocks (chacha20-poly1305)  204 MB/s
shadowsocks (bare with tls)      204 MB/s 
vless (tls)                      204 MB/s
vless (xtls-rprx-direct)         200 MB/s
vless (xtls-rprx-origin)         196 MB/s
trojan (tls)                     196 MB/s
socks5 (tls)                     196 MB/s
vmess (bare with tls)            186 MB/s
socks5 (domainsocket)            179 MB/s           
vmess (ws with tls)              160 MB/s
vmess (h2 with tls)              78 MB/s

可以看到VLESS和不加密的vmess在使用TLS的情况下性能差距不大,相比直接的vmess协议还是有不小差距(即使vmess开启加密也是如此)。裸协议vless比vmess不加密快一些。vless + tls 比 vmess + tls + ws 稍微快一些。

以上几种协议差距在公网的条件下几乎可以忽略,因为基本都超过了G口的速度。不过对于移动设备来说,选择一个高效的协议的确能够省电。

RPRX commented 4 years ago

貌似瓶颈还是在 IO 而不是 CPU,比较希望看到 CPU 占满的测试和并发测试(模拟真实使用场景)

补充:之前有人做类似的测试,CPU 占用率没到 10,所以我猜这里的测试也是这样的情况

RPRX commented 4 years ago

除了速度外,还希望看到延迟测试及并发下的延迟测试,似乎会影响体感?(需要稳定的公网线路

alexyangjie commented 4 years ago

貌似瓶颈还是在 IO 而不是 CPU,比较希望看到 CPU 占满的测试和并发测试(模拟真实使用场景)

补充:之前有人做类似的测试,CPU 占用率没到 10,所以我猜这里的测试也是这样的情况

这个测试是在单机上完成的,在一台机器上开客户端和服务端两个实例,然后loadgen 10GB -> 客户端 -> 服务端 -> receiver,不涉及硬盘和任何外部网络,完全是本地回环。第一个测试结果是回环的极限速度,之后的测试都远远低于那个速度,说明瓶颈应该还是CPU。在测试中,TLS对于性能的影响大过具体协议的影响。同样在TLS下,VLESS性能略优于vmess和socks,但相比加密的裸vmess协议还是有差距(主要是TLS和自研加密的差距)

另外这个只是很简单的单线程压力测试,不涉及到握手,自然也就不涉及到延时等外部因素。只是单纯反映协议的计算效率。

补充:CPU图

screenshot

alexyangjie commented 4 years ago

除了速度外,还希望看到延迟测试及并发下的延迟测试,似乎会影响体感?(需要稳定的公网线路

我这是抛砖引玉,希望有条件的人能测试实际使用状况。包括稳定公网的国际线路和不太稳定的翻墙线路的使用情况。根据我这两天的实际使用情况(境外,非翻墙用途),不论是VLESS + TLS还是裸vmess 还是vmess + TLS,都能轻松达到线路的带宽极限,服务器和客户端都没有太大影响。

RPRX commented 4 years ago

感谢测试,看来 TLS 对性能的影响的确比较大,如果是实际使用,还会出现 TLS in TLS,我可能会写个 xTLS 解决此问题。

RPRX commented 4 years ago

bare 的 Socks5 比 VLESS 吞吐量大是比较奇怪的(至少应该一样),也可能是因为后者 outbound 的发送行为和 inbound 的读取行为使用了略微特殊的代码,分别实现了协议头向后粘合及先读取首包进行判断,我需要研究看看,也建议重新测试一下

下载,即 outbound 的读取行为则没有先读取首包进行判断,可否测试一下两者下载的吞吐量对比,以便确定是否是这里的问题

yomnxkcs commented 4 years ago

补充下torjan的数据。 以下数据在低性能windows笔记本中测得(误差较大)。

v2ray: socks - client - (各种协议) - server - freedom trojan: client - server

一、TCP连接,总数据量5G,每次发送256KB

从服务器读取数据:

协议               速度(MB/s)    与vless对比
loopback             1537          14.78
Vless (tls tcp)       104           1.00
Trojan (tls)           93           0.89
Vless (tls ws)         93           0.89
vmess (tls tcp)        79           0.76

客户端发数据给服务器

协议            速度(MB/s)     与vless对比
loopback            1523           16.55
Trojan (tls)          93            1.01
Vless (tls tcp)       92            1.00
Vless (tls ws)        83            0.90
vmess (tls tcp)       83            0.90

备注:以上测试过程中CPU总使用率Trojan大约60%而V2Ray则是100%

二、发送UDP数据包,每个包1KB,共发10万个包

服务器发包给客户端

协议                包/秒       与vless对比
loopback            54525          4.48
vmess (tls tcp)     12656          1.04
Vless (tls tcp)     12171          1.00
Trojan (tls)         4338          0.36

客户端发包给服务器

协议                包/秒      与vless对比
loopback            59347         5.79
Vless (tls tcp)     10256         1.00
vmess (tls tcp)     10108         0.99
Trojan (tls)         2833         0.28

备注:以上测试过程中CPU总使用率Trojan约80%而V2Ray是100% 测试过程中发现v2ray 4.26的udp有点问题,不过在4.27已经修复了。

XuuKoo commented 4 years ago

利用domainsocket传输怎么差这么多,不是说domainsocket性能更好吗。。。

alexyangjie commented 4 years ago

利用domainsocket传输怎么差这么多,不是说domainsocket性能更好吗。。。

是的,我也觉得奇怪,所以我反复测了几遍,都是一样的结果。

XuuKoo commented 4 years ago

利用domainsocket传输怎么差这么多,不是说domainsocket性能更好吗。。。

是的,我也觉得奇怪,所以我反复测了几遍,都是一样的结果。

socks5 (tls) 196 MB/s socks5 (domainsocket) 182 MB/s

这俩居然相当。 我前面还以为我看错了。 看样子uds目前还是有些问题。

XuuKoo commented 4 years ago

利用domainsocket传输怎么差这么多,不是说domainsocket性能更好吗。。。

是的,我也觉得奇怪,所以我反复测了几遍,都是一样的结果。

不知道vmess/VLESS用uds传输的话 结果怎么样

alexyangjie commented 4 years ago

2020年9月27日更新若干关于tls, xtls, AEAD等对比测试。以下测试采用v2ray v4.29.0进行。

loopback                         2844 MB/s
v2ray platform                   1024 MB/s
vless (bare)                     568 MB/s
socks5 (tcp)                     568 MB/s
vmess (bare)                     365 MB/s
vmess (no encryption with AEAD)  353 MB/s
vless (tls)                      204 MB/s
vmess (bare with tls)            186 MB/s
socks5 (domainsocket)            179 MB/s
vless (xtls)                     144 MB/s
badO1a5A90 commented 4 years ago

2020年9月27日更新若干关于tls, xtls, AEAD等对比测试。以下测试采用v2ray v4.29.0进行。

loopback                         2844 MB/s
v2ray platform                   1024 MB/s
vless (bare)                     568 MB/s
socks5 (tcp)                     568 MB/s
vmess (bare)                     365 MB/s
vmess (no encryption with AEAD)  353 MB/s
vless (tls)                      204 MB/s
vmess (bare with tls)            186 MB/s
socks5 (domainsocket)            179 MB/s
vless (xtls)                     144 MB/s

刚好在做一些XTLS的测试,比较有兴趣,XTLS性能情况比较复杂,很希望有更多人能一起测试和比较.

能否告知一下具体的测试方式?

附上我的测试,针对XTLS的 https://github.com/badO1a5A90/v2ray-doc/blob/master/performance_test/XTLS/VLESS_XTLS_3_test_02.md

4.72.2版本时候的各种组合对比测试(4.29.0应该还是有效的),与您的测试的性能排序基本一致(虽然部分性能差异不一样),DS的奇怪问题也一致(在4.26的那个测试文档里,之后我未再用过DS). https://github.com/badO1a5A90/v2ray-doc/blob/master/v2ray%20speed%20test%20v4.27.2.md

badO1a5A90 commented 4 years ago

除了速度外,还希望看到延迟测试及并发下的延迟测试,似乎会影响体感?(需要稳定的公网线路

一直未能找到v2ray可以用的靠谱的延迟测试方式,可有推荐工具?

alexyangjie commented 4 years ago

2020年9月27日更新若干关于tls, xtls, AEAD等对比测试。以下测试采用v2ray v4.29.0进行。

loopback                         2844 MB/s
v2ray platform                   1024 MB/s
vless (bare)                     568 MB/s
socks5 (tcp)                     568 MB/s
vmess (bare)                     365 MB/s
vmess (no encryption with AEAD)  353 MB/s
vless (tls)                      204 MB/s
vmess (bare with tls)            186 MB/s
socks5 (domainsocket)            179 MB/s
vless (xtls)                     144 MB/s

刚好在做一些XTLS的测试,比较有兴趣,XTLS性能情况比较复杂,很希望有更多人能一起测试和比较.

能否告知一下具体的测试方式?

附上我的测试,针对XTLS的 https://github.com/badO1a5A90/v2ray-doc/blob/master/performance_test/XTLS/VLESS_XTLS_3_test_02.md

4.72.2版本时候的各种组合对比测试(4.29.0应该还是有效的),与您的测试的性能排序基本一致(虽然部分性能差异不一样),DS的奇怪问题也一致(在4.26的那个测试文档里,之后我未再用过DS). https://github.com/badO1a5A90/v2ray-doc/blob/master/v2ray%20speed%20test%20v4.27.2.md

测试方法见4楼我的回复。直接在单机上开两个进程,配置为客户端与服务端,然后用loadgen发数据,用的之前v2ray性能测试的脚本。测试不考虑网络状况,只反映该协议组合的计算量,相当于该协议在测试机上的极限性能。

不知道xtls 加解密用的是什么cipher 。也许因为硬解问题干不过普通TLS?

alexyangjie commented 4 years ago

除了速度外,还希望看到延迟测试及并发下的延迟测试,似乎会影响体感?(需要稳定的公网线路

一直未能找到v2ray可以用的靠谱的延迟测试方式,可有推荐工具?

不知道类似工具。不过我经常没事用speedtest.net做一些简单的公网测试。澳洲往香港的公网,一般比较稳定,且延时大到足够区分不同协议的不同。对比bare vmess, tcp with tls, ws + tls等常见协议后发现,首包延时差距较大。ws +tls 大概500多,tcp tls 400多,bare vmess 250左右。但连接建立后,后续传输的延时差距可以忽略不计,基本在2ms内。

RPRX commented 4 years ago

如果跑普通的数据,相比于 TLS,XTLS 只多了一些逻辑判断。另外 XTLS 应该用到了硬解(我之后会在文档更新下性能测试的注意事项)

RPRX commented 4 years ago

对了,若在 XTLS 特殊功能标记开启(即 xtls-rprx-origin)状态下,发送方和接收方都会不断产生流量识别开销,所以这个数据应该也是符合预期的。

RPRX commented 4 years ago

(但如果服务端用了 XTLS 却未标记开启特殊功能,即没填 xtls-rprx-origin,相关开销就会小很多,只剩几处逻辑判断)

XuuKoo commented 4 years ago

2020年9月27日更新若干关于tls, xtls, AEAD等对比测试。以下测试采用v2ray v4.29.0进行。

loopback                         2844 MB/s
v2ray platform                   1024 MB/s
vless (bare)                     568 MB/s
socks5 (tcp)                     568 MB/s
vmess (bare)                     365 MB/s
vmess (no encryption with AEAD)  353 MB/s
vless (tls)                      204 MB/s
vmess (bare with tls)            186 MB/s
socks5 (domainsocket)            179 MB/s
vless (xtls)                     144 MB/s

刚好在做一些XTLS的测试,比较有兴趣,XTLS性能情况比较复杂,很希望有更多人能一起测试和比较.

能否告知一下具体的测试方式?

附上我的测试,针对XTLS的 https://github.com/badO1a5A90/v2ray-doc/blob/master/performance_test/XTLS/VLESS_XTLS_3_test_02.md

4.72.2版本时候的各种组合对比测试(4.29.0应该还是有效的),与您的测试的性能排序基本一致(虽然部分性能差异不一样),DS的奇怪问题也一致(在4.26的那个测试文档里,之后我未再用过DS). https://github.com/badO1a5A90/v2ray-doc/blob/master/v2ray%20speed%20test%20v4.27.2.md

那使用ds反而还不如走loopback快???

白话文一直都是说ds更快😂

RPRX commented 4 years ago

@XuuKoo

本该是 ds 快,但 v2 的 ds 出入站似乎存在些问题。

badO1a5A90 commented 4 years ago

测试方法见4楼我的回复。直接在单机上开两个进程,配置为客户端与服务端,然后用loadgen发数据,用的之前v2ray性能测试的脚本。测试不考虑网络状况,只反映该协议组合的计算量,相当于该协议在测试机上的极限性能。

不知道xtls 加解密用的是什么cipher 。也许因为硬解问题干不过普通TLS?

了解了,所以测试的数据流应该是没有经过一次TLS加密的. XTLS的性能优化在于减少了二次加密(原数据已经是TLS的情况下不再次加密,TLS会再次加密 有条件的话,可以测试一下这种情况下XTLS和TLS的对比

badO1a5A90 commented 4 years ago

原始数据都不是TLS加密的情况倒是没想过去测,XTLS慢一点很合理吧. 但实际场景日常上网现在应该大多都是TLS加密过了吧?

ghost commented 4 years ago

但实际场景日常上网现在应该大多都是TLS加密过了吧?

确实,但是游戏多用的UDP可能没有加密(只是猜测,我也想了解)

ghost commented 4 years ago

(但如果服务端用了 XTLS 却未标记开启特殊功能,即没填 xtls-rprx-origin,相关开销就会小很多,只剩几处逻辑判断)

服务端不填xtls-rprx-origin,还能进行XTLS连接吗?

RPRX commented 4 years ago

确实,但是游戏多用的UDP可能没有加密(只是猜测,我也想了解)

传输 UDP 时不会开启 XTLS 的特殊功能。

RPRX commented 4 years ago

(但如果服务端用了 XTLS 却未标记开启特殊功能,即没填 xtls-rprx-origin,相关开销就会小很多,只剩几处逻辑判断)

服务端不填xtls-rprx-origin,还能进行XTLS连接吗?

如果你指的是 XTLS 的特殊功能,则不能(文档写了这个参数在服务端和客户端的不同含义)。

ghost commented 4 years ago

那服务端开启XTLS又不填写xtls-rprx-origin有什么意义吗?😂

(但如果服务端用了 XTLS 却未标记开启特殊功能,即没填 xtls-rprx-origin,相关开销就会小很多,只剩几处逻辑判断)

ghost commented 4 years ago

传输 UDP 时不会开启 XTLS 的特殊功能。

原来如此,我觉得可以这个写进文档里

RPRX commented 4 years ago

那服务端开启XTLS又不填写xtls-rprx-origin有什么意义吗?😂

这里的“开启”应该改成“使用”:可能没有意义。但可以部分用户填写、部分用户不填写,不填写的只能用普通 TLS 来连。

alexyangjie commented 3 years ago

2020年10月3日更新Trojan相关协议的测试

测试版本:V2Ray v4.30.0

trojan (no tls)                  256 MB/s
trojan (tls)                     196 MB/s
XuuKoo commented 3 years ago

2020年10月3日更新Trojan相关协议的测试

测试版本:V2Ray v4.30.0

trojan (no tls)                  256 MB/s
trojan (tls)                     196 MB/s

从实际使用来看trojan和vmess感觉不到什么差别(都是TLS+TCP+WEB的方式),clash测试延迟也几乎一样。 唯一不同的是,用netch测试NAT,用vmess的NAT是1,用trojan的时候是2(反而还不如vmess下的NAT等级高)。

ghost commented 3 years ago

我也提供一些游戏延迟的数据,因为没有专门的测量工具,所以主观性比较强,误差可能比较大 测试版本:V2Ray v4.30.0 mux:关闭

协议(加密)                          平均延迟                        波动范围
vmess (aead auto)                   43ms                          -3ms —— +7ms
vless (xtls)                        46ms                          -6ms —— +15ms

vmess基本不波动,vless波动较大,平均延迟也稍高一些

XuuKoo commented 3 years ago

我也提供一些游戏延迟的数据,因为没有专门的测量工具,所以主观性比较强,误差可能比较大 测试版本:V2Ray v4.30.0 mux:关闭

协议(加密)                          平均延迟                        波动范围
vmess (aead auto)                   43ms                          -3ms —— +7ms
vless (xtls)                        46ms                          -6ms —— +15ms

vmess基本不波动,vless波动较大,平均延迟也稍高一些

日常使用小火箭和clash这俩客户端测试延迟,给我的感觉也是vles波动更大(主观)。

alexyangjie commented 3 years ago

2020年10月11日更新XTLS (xtls-rprx-direct) 的测试。在本次测试中,xtls-rprx-origin由于错误未能完成测试。

测试版本:V2Ray v4.31.0

vless (xtls-rprx-direct)         200 MB/s
vless (xtls-rprx-origin)         196 MB/s
RPRX commented 3 years ago

2020年10月11日更新XTLS (xtls-rprx-direct) 的测试。在本次测试中,xtls-rprx-origin由于错误未能完成测试。

测试版本:V2Ray v4.31.0

vless (xtls-rprx-direct)         200 MB/s
vless (xtls-rprx-origin)         ERROR during test

v4.31.0 中,XTLS 发现传输的数据非 TLSv1.3 或 1.2 时,会自动关闭特殊功能,所以两个算法的数据应该是一样的。

RPRX commented 3 years ago

另外根据我的综合经验,v2ray 多一层处理的开销似乎甚至超过了加密本身,准备尝试优化这里的性能。

alexyangjie commented 3 years ago

2020年10月11日更新XTLS (xtls-rprx-direct) 的测试。在本次测试中,xtls-rprx-origin由于错误未能完成测试。 测试版本:V2Ray v4.31.0

vless (xtls-rprx-direct)         200 MB/s
vless (xtls-rprx-origin)         ERROR during test

v4.31.0 中,XTLS 发现传输的数据非 TLSv1.3 或 1.2 时,会自动关闭特殊功能,所以两个算法的数据应该是一样的。

我传输的数据是用的同样的方式。好像在使用xtls-rprx-origin时v2ray中途crash了,导致没有完成测试。我试了几遍都是一样的。不知道怎么回事。上一个版本没有此问题。

RPRX commented 3 years ago

我传输的数据是用的同样的方式。好像在使用xtls-rprx-origin时v2ray中途crash了,导致没有完成测试。我试了几遍都是一样的。不知道怎么回事。上一个版本没有此问题。

这是个奇怪的情况,因为实际上这两种方式在未识别到 TLS data record 前,用到的代码都是一样的。。。

RPRX commented 3 years ago

可以看一下是不是配置的问题(两边需要都是 origin 或都是 direct)

alexyangjie commented 3 years ago

可以看一下是不是配置的问题(两边需要都是 origin 或都是 direct)

果然,少加了一个逗号。现在好了。

kousyougi commented 3 years ago

我的环境,trojan、xtls、vless测速都是50M(同一台伺服器,用nginx把sni隔开所以应该很公平),但浏览网页感觉明显是 xtls > trojan > vless。有什么客观的方法可以测这个差异吗?

kousyougi commented 3 years ago

另外根据我的综合经验,v2ray 多一层处理的开销似乎甚至超过了加密本身,准备尝试优化这里的性能。

请问xtls可以出独立的工具吗?减少开销

例如 伺服器端:把xtls当成前端,非xtls流量不解开直接转发给nginx或trojan/VLESS/NaiveProxy。 客户端:iptable设定443流量发给xtls,其他port的流量发给trojan/VLESS/NaiveProxy。

使用者自行搭配的弹性也会变大一点。

谢谢

k79e commented 3 years ago

同样无加密 tlsonly的情况下 vmess 多用了19.2%算力

我这边基于计算效率测试的 vless开tls和明文(notls)速度一样 但是效率相差283%. xtls比不开还慢 网速慢20% 计算效率也不是最高的. 比普通tls还慢9-20%

RPRX commented 3 years ago

@k79e (这位还没有搞清楚 XTLS 的应用场景)感觉很多时候过于心急,我的建议是经过充分研究再提出有深度的问题或看法。

k79e commented 3 years ago

@RPRX 我用的4.31.2测试的 说明书不是提到 (v4.31.0+ 已解决此问题) 我测速用的是大文件

1L测试不是也是xtls比tls稍微慢一点么. 速度差不多不代表效率一样啊

k79e commented 3 years ago

果真数据用错了 但是现在电脑抽风了 网速变慢一倍不知道咋回事 回环也是那样. 测的xtls比vless快50-60%效率(客户端only 服务端1-2%的区别,又测了一下 服务端xtls效率高50% 客户端236% 对比是vless不开xtls和开xtls的) //是硬解的机器老aes 但是不是aesni

RPRX commented 3 years ago

@kousyougi 其实这样解耦才会增加开销,而且 XTLS 需要特殊的控制指令。

目前计划有空时写一个简单的 vless-lite,含 XTLS,也会率先实现 XUDP,之后再改 v2ray 的 UDP。

计划中 vless-lite 还支持 VLESS 正式版的分享链接直接启动。

xwysun commented 3 years ago

vless+ws+tls 能比vmess+ws+tls少多少CPU占用,有人测试过吗

alexyangjie commented 3 years ago

vless+ws+tls 能比vmess+ws+tls少多少CPU占用,有人测试过吗

同时去掉ws, vless + tls 的运算效率大概比vmess + tls高8%左右 (204MB/s vs 186MB/s)。加上ws大概折损性能26MB/s。