首页 > 资源分享 > 【已解决】使用openvirtual网速巨慢openvirtual免流网速慢解决方法
2019
03-18

【已解决】使用openvirtual网速巨慢openvirtual免流网速慢解决方法

【已解决】使用openvirtual网速巨慢openvirtual免流网速慢解决方法

我经常看见小白在网上问,为什么用Openvirtual连接两个网站的速度比链接速度慢的多,例如,2Mb/s的链接只有400Kb/s的速度,或者百兆只有20Mb/s的速度。有些人推荐将MTU调大到48000,有些人说应该调整mssfix,但是都不管用。有些人说Openvirtual就这样,老娘就这个速度。扯淡!

一点老黄历

2004年7月。当时发达国家一般家庭网速为256-1024kb/s,在发展中国家网速为56kb/s。Linux2.6.7刚刚发布,带有默认启动TCP窗口大小调节的2.6.8版本一个月前刚发布。Openvirtual已经活跃地开发了3年,即将发布2.0版本。

一名开发者想加入socket缓冲区的代码,估计是想统一各个系统的缓冲区大小。在Windows下,如果人工设置缓冲区大小,网络适配器的MTU会出错,最终是这个结果:

#ifndef WIN32

    o->rcvbuf = 65536;

    o->sndbuf = 65536;

#endif

技术层面

如果你用过Openvirtual**,你肯定知道Openvirtual支持TCP和UDP。如果你手工设置TCP连接缓冲区大小到64 KB这么小,TCP 窗口大小调整算法不能将窗口大小调节到64K以上。什么意思?假如你的连接水管大但是延迟高,例如从美国到毛子,ping差不多100ms,用默认的Openvirtual设置,你的速度肯定不能高于5.12Mb/s。要50Mb/s的速度,缓冲区至少要640 KB。UDP因为没有窗口大小所以快点,但是也快不到哪去。

怎么破?

你已经猜到了,现在的Openvirtual还在用64 KB的默认缓冲区大小。怎么修?最好的办法是禁止Openvirtual设置自定义缓冲区大小。在服务器和客户端的配置文件加入:

sndbuf 0

rcvbuf 0

这样缓冲区大小就由操作系统控制了。对于Linux,这个固定值对于TCP是net.ipv4.tcp_rmem 和net.ipv4.tcp_wmem, UDP是net.core.rmem_default 和 net.core.wmem_default 两个值除2.

如果客户端配置文件不能修改,那么你需要从服务器推送更大的缓存大小:

sndbuf 0

rcvbuf 0

push "sndbuf 393216"

push "rcvbuf 393216”

UDP和TCP不同,没有窗口大小这一说,虽然不是整个系统都需要。但是缓冲区过小也有可能降低速度。如果你把缓冲区调成0后还是慢,你应该要么在系统层面增加缓冲区大小(net.core.rmem_default 和 net.core.wmem_default),或者在服务器推送更大的缓冲区配置:

sndbuf 393216

rcvbuf 393216

push "sndbuf 393216"

push "rcvbuf 393216”

但是我用Windows!

如果服务器和客户端都是Windows,应该没有这个bug。

说了这么多,最终解决办法就是在服务器端加入如下配置:

sndbuf 0

rcvbuf 0

这是我修改后的测速结果,以前只有几十k。。。

支付宝打赏 微信打赏