Closed devcodewak closed 7 years ago
你可以PR
可以在此讨论修改方式
multi版在一些场景下有一定的意义: 0) 包支持multi是基本的需求吧:) 1) vps server多应用走kcptun时,单程序省内存便于管理。 2) multi client在小内存路由器部署时,也可实现连多server。例如kcp到ss,ssr,socks5,gsnova的server。可冗余对比. 3) multi client及server, 双方可一次性配置对应的不同调优参数,在网络变化时,可快速选配比对选优。省时省力。 4) 像lantern已大规模部署kcp服务端,其客户端并发obfs4-kcp multi时,推测处于bug不稳定状态。
我个人能力有限,仅代码堆砌。 劳烦x大大出手,我这里仅能泛泛而谈。
1)外部调用接口最好不变。 第三方import的已很多应用,ss/gost/lantern等。 2)包括kcptun本身,也可Release multi版和single版。 single版兼容原命令行及json格式。 multi版server及client可能仅支持外部json配置了,例 multi.json 内容: [ {json1...}, {jsno2...}, {json3...} ]
以上仅供x大参考。
multi可以由第三方提供
请教问下multi时几个问题: 1 xmitBuf sync.Pool 是线程安全的对象缓冲池,程序中Get用于申请临时缓冲区,Put用于丢弃释放。是否正确?
1.1 沿用该全局变量,应无冲突。不修改即可?
2 xmitBuf 如修改可封装到 KCP FEC UDPSession 对象中,是否有必要?
3 DefaultSnmp 全是原子api访问,在multi时,不修改即可?
4 DefaultSnmp, multi时不便显示多个,可屏蔽相关代码,暂不使snmp输出功能。
5 估计在我在改multi时,server端代码改的有问题,才至server端不稳定?
6 修改multi时,有何建议和注意项?
谢谢
当然是线程安全的, xmitBuf本来是sess.go/fec.go/kcp.go独立拥有的,为了统一协调内存分配,才提出为全局变量。 你是要还原这个操作。
DefaultSNMP可以和session绑定,但snmp传统意义上是 /proc/net/snmp 是全局的,系统的,整体的统计。
Per Session 的统计,可以单独提供一个stats对象。但目前没有想到明确的需求场景。因为动态调参被否定了。
明白了,谢,try it.
multi测ok,仅简单修改了config.go main.go signal.go, 如你所述,暂未修改kcp-go smux。
单进程多服务端,源码如下: (修改后缀为.zip) kcptunMultiiServer.zip.txt
交叉编译后,在arukas ubuntu docker上测试通过。 ./multiserver -c mulit.json 一次测试了四种配置, 最优: fast + FEC(10,3) 或 fast2 + FEC(0,0)
版本为161102,可与对应版本的客户端配合使用。
可否再深度封装下kcp-go及smux
原因: 两包中有全局变量,例如 kcp.xmitBuf 及 kcp.DefaultSnmp, 是通过 init() new 一次生成的。
单程序并发多client或多server应用时,引用两包,全局变量和全局函数,会破坏对象的封装性, 实测单程序并发多client应用,勉强可用。 如单程序并发多server时,几乎不可用。
如方便,请深度封装下两包,便于第三方使用,谢谢