Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CPU & MEM & BPS #111

Closed
allenkey666 opened this issue Aug 11, 2016 · 98 comments
Closed

CPU & MEM & BPS #111

allenkey666 opened this issue Aug 11, 2016 · 98 comments

Comments

@allenkey666
Copy link

请看截图,LAN1口接的是一台kcptun中转的本地服务器,用的是20160808 linux arm的kcptun版本。

蓝色uplink流量是远端的VPS发往本地kcptun中转服务器的UDP流量,橙色download的流量是kcptun解包还原后发往客户端的实际数据流量。两者波动基本同步,这是合理的。

请教一下作者,这种波动是正常的吗?是否可以通过优化kcptun的参数,平滑波动?
另外本地收到的UDP流量和解包后的实际流量,差不多是2:1的关系。kcptun本身的系统开销应该没有这么大吧?那这是不是代表本地收到的UDP包中有将近一半的包是重复的的或者错误的?谢谢!

kcptun

@allenkey666
Copy link
Author

蓝色的unlink流量是本地收到的UDP流量,不是服务器发出来的UDP流量。
如果丢包的话,不是在路上已经丢了吗?本地的kcptun应该是收不到这些包的吧?也就不应该在本地流量中被统计到。

我运行kill -SIGUSR1没有任何输出,进程也不会被kill掉。系统是ARM平台的Ubuntu 16.04.1 LTS 3.4.112-sun8i

root@orangepione:~# uname -a
Linux orangepione 3.4.112-sun8i #14 SMP PREEMPT Tue Jul 5 16:28:14 CEST 2016 armv7l armv7l armv7l GNU/Linux

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

你吞掉日志了吧。

@allenkey666
Copy link
Author

真的吞掉了,呵呵。
我吐出来了,你看看是不是真的丢包那么严重。

2016/08/11 11:25:18 KCP SNMP:&{BytesSent:163668 BytesReceived:49589511 MaxConn:1 ActiveOpens:1 PassiveOpens:0 CurrEstab:1 InErrs:0 InCsumErrors:10 InSegs:87295 OutSegs:5707 OutBytes:3025739 RetransSegs:369 FastRetransSegs:0 EarlyRetransSegs:0 LostSegs:369 RepeatSegs:124 FECRecovered:22 FECErrs:0 FECSegs:20143}

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

两端都要发出来

@allenkey666
Copy link
Author

allenkey666 commented Aug 11, 2016

log来了,启动参数都是默认的。

Server:
root@ubuntu:~# 2016/08/11 11:34:34 KCP SNMP:&{BytesSent:80438050 BytesReceived:226943 MaxConn:2 ActiveOpens:0 PassiveOpens:2 CurrEstab:1 InErrs:0 InCsumErrors:18 InSegs:8539 OutSegs:146212 OutBytes:184679566 RetransSegs:45428 FastRetransSegs:3237 EarlyRetransSegs:3472 LostSegs:38719 RepeatSegs:0 FECRecovered:0 FECErrs:0 FECSegs:1971}

Client:
root@orangepione:~# 2016/08/11 11:34:59 KCP SNMP:&{BytesSent:244992 BytesReceived:84021935 MaxConn:1 ActiveOpens:1 PassiveOpens:0 CurrEstab:1 InErrs:0 InCsumErrors:18 InSegs:151993 OutSegs:8952 OutBytes:5128544 RetransSegs:311 FastRetransSegs:0 EarlyRetransSegs:0 LostSegs:311 RepeatSegs:1090 FECRecovered:1064 FECErrs:0 FECSegs:35065}

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

很正常啊 BytesSent ~= BytesReceived
RepeatSegs / InSegs 也很低啊

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

FEC首先就增加了> 30%的浪费,为了响应时间,在乎流量的话可以关掉FEC。

@allenkey666
Copy link
Author

了解了,谢谢。目前用下来速度方面的确挺好的。
今天正好注意到流量曲线不够平滑,见1楼截图。这个可以通过微调sndwnd rcvwnd参数改善吗?

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

这个我这里也是这样的,初步估计是一个不可恢复的包,导致了RTO超时,这段时间就是波谷。

@allenkey666
Copy link
Author

感谢回答!

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

@bettermanbao https://github.com/xtaci/kcptun/releases/tag/v20160811 试下这个,看下曲线。

@allenkey666
Copy link
Author

好的,等一下试试效果。

@allenkey666 allenkey666 reopened this Aug 11, 2016
@Biercenter
Copy link

在这里看到恩山坛友了,呵呵。我测试的K2和小米mini路由器也是速度一下窜很高,一下就卡住了,CPU负载显示100%。参数调成fast或者normal会有改善,但还是不稳定。

@allenkey666
Copy link
Author

平滑效果明显,并且速度也有所提升。大赞一下作者!

kcptun2

@allenkey666
Copy link
Author

@Biercenter mt7620跑kcptun太勉强了,我是外挂了一个orange pi专门跑kcptun的,路由器只负责分流。

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

好的,借用一下你的图用来发release!

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

@bettermanbao 平滑度现在受到-sockbuf隐藏参数的影响

@allenkey666
Copy link
Author

欢迎借图,好奇问一下MaxStreamWindowSize设置为sockbuf(hidden),是不是只是增大了接收缓存?看截图,感觉客户端接收到的UDP流量(蓝色)平滑效果比实际数据(橙色)的平滑效果要更加明显。

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

其实是减小了缓存大小, 因为yamux的窗口更新策略很保守,窗口越大更新越慢,相当于窗口更新对于链路传输状况敏感度降低了。换句话说,yamux在这种情况下,没有感受到网络的阻塞。

https://github.com/hashicorp/yamux/blob/master/stream.go#L247

现在默认的参数下,每传输2MB, 一定会有一次窗口更新。(max/2)

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

根本的解决办法是,去掉yamux的窗口。 但是这样会影响多路stream的流量平衡性。

@allenkey666
Copy link
Author

原来如此,新版我试用一段时间,再给你反馈。谢谢!

@fydexx
Copy link

fydexx commented Aug 11, 2016

太流弊了,搬瓦工VPN,实测0808版 1080p 无压力,更新到0811后,1440p无压力

@xtaci xtaci closed this as completed Aug 11, 2016
@Biercenter
Copy link

楼上服务器和客户端参数是多少?还有客户端是什么机子?我搬瓦工还是卡顿,求参数

@braveguywallce
Copy link

不好意思请教下, -sockbuf隐藏参数 我在执行程序时和其它参数一起手动输入吗?

@testcaoy7
Copy link

请问sockbuf设置多少比较合适呢,我现在设置为67108864(64MB)

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

sockbuf >= 带宽时延乘积

@xtaci
Copy link
Owner

xtaci commented Aug 11, 2016

@bettermanbao https://github.com/xtaci/kcptun/releases/tag/v20160811 试下,换了系统调用,降低CPU使用率。

@xtaci xtaci changed the title 传输速度不稳定 CPU & MEM Aug 15, 2016
@xtaci xtaci changed the title CPU & MEM CPU & MEM & BPS Aug 15, 2016
@allenkey666
Copy link
Author

@xtaci 其实在arm/x86/amd64平台上运行,CPU,内存已经都不是瓶颈了。我个人觉得如何提高有效载荷比和控制延时才是今后更新的大方向。

@xtaci
Copy link
Owner

xtaci commented Aug 15, 2016

是的,算法是根本。

@braveguywallce
Copy link

braveguywallce commented Aug 15, 2016

@xtaci 今天继续测试,加上了加密方法 tea, 无论看1080p还是1440p的youtube视频,kcptun的CPU开销(60%-145%)和内存占用(约30-100M)都没啥大的问题。现在的问题还是通过kcptun高速下载大文件,比如500M以上的youtube视频,内存开销惊人,会很快跃升到300M以上,即使设置GOGC=30, 但是没有什么帮助,随着下载时间的进行,本地下载速度逐渐增大到3MB/s 以上,kcptun的内存开销居然达到500多M, 这个需要后续的改进。

另外,我建议server & client都要加上crypt, 今天整天没遇到疑似QoS的问题发生,connection speed一直很快很稳定。

@bettermanbao 你可以尝试用你的orange pi下载大的视频文件,看看CPU和Memory的情况。

@xtaci
Copy link
Owner

xtaci commented Aug 15, 2016

@braveguywallce 如果内存没有办法通过GOGC改善,下个版本我准备尝试加上定期GC。

@braveguywallce
Copy link

@xtaci 目前除了客户端高速持续长时间下载大文件的时候占用内存过大以外,一般的看看HD视频啥的内存都没有问题。我明天再调节下GOGC参数看看。

@xtaci
Copy link
Owner

xtaci commented Aug 15, 2016

好的,能通过GOGC解决最好。

@Cye3s
Copy link

Cye3s commented Aug 16, 2016

说到内存,x64 Openwrt 的确是看youtube高清后内存会暴增,我现在的做法是一天重启一次kcptun客户端,很稳定
其实2G内存占用个600M也没感觉,毕竟还有将近一半的Free
另外,弄个x86或x64的多网卡板来跑openwrt,很方便,kcptun+ss+dnsmasq+ipset一机解决,基本不会有性能问题

@xtaci
Copy link
Owner

xtaci commented Aug 16, 2016

@Cye3s GOGC=20 ./client...... 基本能稳, 另外定期重启是个好办法。

@Cye3s
Copy link

Cye3s commented Aug 16, 2016

好,我加上这个参数看看,这两天先不定时重启

@allenkey666
Copy link
Author

allenkey666 commented Aug 16, 2016

@braveguywallce 我下载了几段youtube的视频,观察到了和你完全相同的现象。

开始的时候下载速度不快,700-800KB/s,CPU占用150%左右,kcptun的内存占用也不多。下载一段时间后,速度突然飙升到4-5MB/s,这时内存使用就开始飙升,CPU利用率反而下降很多。

实时流量参考截图,蓝色的是client收到的KCP协议的UDP包,橙色的是client还原的原始数据。

感觉末端的速度爆发是kcptun把缓存的数据一下子全部吐了出来。

kcptun

@braveguywallce
Copy link

@xtaci 抱歉,我测试做得不够全面!今天测试从几个大的站点下载1G大文件,结果遇到了新的情况。基本上有两种情况:

  1. 和下载youtube视频类似,起始速度比较小,kcptun client的效率比较低,后面会突然冲高速,后半段kcptun的效率很高,本地路由提示出站和入站的流量基本一致,这种情况下kcptun client的内存也会比较大,通常都要200M以上。
  2. 和下载youtube视频不一样,kcptun client的效率从开始到结束保持基本恒定的状态,较低,下载速度始终在700KB-1MB,,比较稳定,但是Kcptun本地内存占用却一直很低,大约不超过65M.

这样的话,是否要考虑目标主机的因素了?从不同主机下载大文件,本地端的内存占用是不一样的。

@w12928293
Copy link

@braveguywallce
请教下,如果想路由上跑ss,树莓派上跑kcp的客户端的话,是不是vps上需要装kcpserver和ss服务端?

还是vps上只装kcpserver,树莓派上装kcpclient和ssserver?

@braveguywallce
Copy link

@w12928293

You have to install the server of both kcptun & ss in your VPS, and you can deploy the kcptun client in the Raspberry Pi alone, with SS working on the Router.

It's simple, easy & high efficiency!

@w12928293
Copy link

@braveguywallce 多谢回复。

原谅我愚钝,有些地方还是没弄明白。如果是那样的话

比如:vps:10.10.10.10,ss端口443,kcp端口554
树莓派lan:192.168.0.2,kcp监听端口1080
这样的话,我路由上的ss应该怎么配置才能利用到kcp的加速效果呢?看起来kcp好像和ss是完全独立了。

@braveguywallce
Copy link

@w12928293
No, you can't use 1080 as the local port for kcptun, leave it as default , like 12940, and set the "server port" of your SS client as the" local port" of kcptun.

@w12928293
Copy link

@braveguywallce
奥,原来kcpclient不能用1080。。。
比如是local是12940,那我路由上ss处ip是192.168.0.2,端口是12940,密码是ssServer的密码。这样对吗?
vps上kcpserver的加速端口是不是要填ssserver的端口,127.0.0.1:443?

@neteroster
Copy link

@w12928293
Server: kcptun(server) + ssserver
Client: kcptun(client) + sslocal

比如Vps 10.10.10.10,ss端口443,kcp的-t参数要设为"127.0.0.1:443",-l就是你的":554"
Local的Kcptun的-r参数设置为"10.10.10.10:554",-l随便(例如-l ":6666")
那么Local的SS的服务器ip设为127.0.0.1,服务器端口设为6666

@w12928293
Copy link

@lizongzeshunshun
多谢回复!
好像是明白了,这样的话我的树莓派上只需要跑一个kcpclient就可以了对吧。

@neteroster
Copy link

@w12928293
其实这张图表达的很明白了
KCPTUN

可以树莓派跑kcptun(client),路由器跑shadowsocks,这样应该是效率最高的了
shadowsocks的服务器ip设为pi的内网ip就行了

@w12928293
Copy link

@lizongzeshunshun
我正在这样尝试,还没成功。。。
弱弱的问下,树莓派应该下那个版本的client。。。我用linux386的怎么跑步起来。。。

@neteroster
Copy link

@w12928293
树莓派应该是arm架构的,应该下
kcptun-linux-arm-20160816.tar.gz

@w12928293
Copy link

@lizongzeshunshun
果然啊!成功了!

太感谢了!

最开始执行语句老长了,加了各种参数。。。然后跑不起来

后来我用作者提供的默认的
服务器: ./server_linux_amd64 -t "127.0.0.1:443" -l ":554" -mode fast2 // 转发到服务器的本地8388端口
客户端: ./client_darwin_amd64 -r "服务器IP地址:554" -l ":8388" -mode fast2 // 监听客户端的本地8388端口
成功了,

可是 怎么添加开机启动及后台运行呢?

@braveguywallce
Copy link

@w12928293 please use google to find answers by yourself first, then come to ask.

@w12928293
Copy link

@braveguywallce

教育的对。
折腾了好久,实在是有点着急了,抱歉!
多谢你的解答,还有@lizongzeshunshun。

@braveguywallce
Copy link

yamux kuptun的CPU/MEM 问题目前在smux kcptun上初步有了比较好的解决,参考 #168

@xtaci xtaci closed this as completed Sep 2, 2016
@henryshen033
Copy link

@w12928293 请问你最后如何成功设置开机启动的,我把加入命令加入/etc/rc.local和新建一个systemctl都试过了,都失败了,但是source /etc/rc.local是能够运行的,当然我确定开机是会加载/etc/rc.local的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests