不好意思,忘了格式化内容。重发一下。
最近在使用shadowsocks-go作为翻墙工具,我把服务器端部署在一个内存为128MB的OpenVZ VPS上,但是效果十分不理想,并发25个连接就把系统内存占满,然后因为不能开辟内存而崩掉。同时,我也使用了nodejs版本shadowsocks-nodejs测试,并发上百个连接内存占用只有40%左右。
后来看了一下shadowsocks-go的源码,作者对每个连接使用了1个goroutine,然后开启了2个goroutine作为数据双向通道,每个通道缓存只有4kB,也就是128MB内存连75个简单goroutine都撑不起。(不知道这样分析对不对)
请教怎么做能够让内存占用降下来?
最近在使用[shadowsocks-go](https://github.com/shadowsocks/shadowsocks-go)作为翻墙工具,我把服务器端部署在一个内存为128MB的OpenVZ VPS上,但是效果十分不理想,并发25个连接就把系统内存占满,然后因为不能开辟内存而崩掉。同时,我也使用了nodejs版本[shadowsocks-nodejs](https://github.com/clowwindy/shadowsocks-nodejs)测试,并发上百个连接内存占用只有40%左右。
后来看了一下shadowsocks-go的源码,作者对每个连接使用了1个goroutine,然后开启了2个goroutine作为数据双向通道,每个通道缓存只有4kB,也就是128MB内存连75个简单goroutine都撑不起。(不知道这样分析对不对)
不好意思,忘了格式化内容。重发一下。
最近在使用shadowsocks-go作为翻墙工具,我把服务器端部署在一个内存为128MB的OpenVZ VPS上,但是效果十分不理想,并发25个连接就把系统内存占满,然后因为不能开辟内存而崩掉。同时,我也使用了nodejs版本shadowsocks-nodejs测试,并发上百个连接内存占用只有40%左右。
2013/1/8 Yan Unon <yan...@gmail.com>最近在使用[shadowsocks-go](https://github.com/shadowsocks/shadowsocks-go)作为翻墙工具,我把服务器端部署在一个内存为128MB的OpenVZ VPS上,但是效果十分不理想,并发25个连接就把系统内存占满,然后因为不能开辟内存而崩掉。同时,我也使用了nodejs版本[shadowsocks-nodejs](https://github.com/clowwindy/shadowsocks-nodejs)测试,并发上百个连接内存占用只有40%左右。你的OpenVZ系统支持Vswap么?是64位系统么?
后来看了一下shadowsocks-go的源码,作者对每个连接使用了1个goroutine,然后开启了2个goroutine作为数据双向通道,每个通道缓存只有4kB,也就是128MB内存连75个简单goroutine都撑不起。(不知道这样分析对不对)
没看懂这段,75个goroutine能到128MiB的话,那可是平均下来每个goroutine 1MiB+呀
不好意思,忘了格式化内容。重发一下。
最近在使用shadowsocks-go作为翻墙工具,我把服务器端部署在一个内存为128MB的OpenVZ VPS上,但是效果十分不理想,并发25个连接就把系统内存占满,然后因为不能开辟内存而崩掉。同时,我也使用了nodejs版本shadowsocks-nodejs测试,并发上百个连接内存占用只有40%左右。
后来看了一下shadowsocks-go的源码,作者对每个连接使用了1个goroutine,然后开启了2个goroutine作为数据双向通道,每个通道缓存只有4kB,也就是128MB内存连75个简单goroutine都撑不起。(不知道这样分析对不对)
请教怎么做能够让内存占用降下来?
On Tuesday, January 8, 2013 11:49:06 PM UTC+8, yanunon wrote:不好意思,忘了格式化内容。重发一下。
最近在使用shadowsocks-go作为翻墙工具,我把服务器端部署在一个内存为128MB的OpenVZ VPS上,但是效果十分不理想,并发25个连接就把系统内存占满,然后因为不能开辟内存而崩掉。同时,我也使用了nodejs版本shadowsocks-nodejs测试,并发上百个连接内存占用只有40%左右。
我在维护 shadowsocks-go,在 OpenVZ 上目前是有这个问题,很抱歉没有在项目主页上说明。麻烦你帮我创建一个 issue report 吧?
后来看了一下shadowsocks-go的源码,作者对每个连接使用了1个goroutine,然后开启了2个goroutine作为数据双向通道,每个通道缓存只有4kB,也就是128MB内存连75个简单goroutine都撑不起。(不知道这样分析对不对)请教怎么做能够让内存占用降下来?
--
On 2013年1月9日Wednesday at 下午3:06, Monnand wrote:
> On 01/08/2013 09:55 PM, Yufei Chen wrote:
> > 我在维护 shadowsocks-go,在 OpenVZ 上目前是有这个问题,很抱歉没有在项目这个项目是 clowwindy (github, twitter id) 发起的,他设计 shadowsocks 最初的目的是避免 ssh 需要保持长连接,而且需要用户认证过程。
> > 主页上说明。
> > 麻烦你帮我创建一个 issue report 吧?
>
>
> 不好意思,我要OT一下。
>
> Yufei,
>
> 请教一下,这个shadowsocks和ssh,VPN等翻墙方法有什么不同?
这样的设计在笔记本休眠后唤醒、网络条件差导致经常断线的情况下可以避免花很多时间去重连。
>的确是非常弱的加密。不过目的只是骗过墙,目前也达到目的了。
> 我大概看了一下代码,只看了encrypt.go这个文件[0],这是一个古典加密算法的
> 变形吧?没搞错的话,直接用词频分析就可以破解的[1]。还是我有内容没有看到吗?
其他加密算法在考虑中,node-js 和 libuv 的实现中已经加入了 rc4 加密。
OpenVZ 上运行 Go 程序占用大量内存的问题在 golang-nuts 上已经讨论过了。
https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/4Y-SO5QnGyY
OpenVZ 里统计 memory 占用时统计的是 virtual memory 的使用,但 Go runtime 初始化的时候会预留一大块 VM address space。所以启动一个 Go 程序后,用 free 马上会看到少了 80M 的内存,但其实 RES 只有 3M。
minux 提到可以修改 go 源代码里预留 virtual memory 的代码来限制预留 VM 的大小
https://groups.google.com/d/msg/golang-nuts/4Y-SO5QnGyY/pKuOjYVh3n4J
这么看来用 ulimit 限制 VM 占用是没用了。不过用这个方法的时候发现个现象:
- 限制 VM 最多占用 90M,程序启动后用了 86M,dns 解析时报找不到 host
- 限制 VM 最多 100M 能做 DNS 解析,不过程序执行一段时间后会由于无法创建新的线程而 abort 掉
创建新的线程应该是由于要做 dns 解析吧,不过限制 86M 时连一次 dns 解析都无法完成有些奇怪,毕竟刚启动时就已经有 6 个线程。
那你的进程崩溃的原因是什么呢?
如果改动代码限制一下goroutine的数量是否可行?我之前在写一个编译工具时需要创建子进程,就是通过手工限制goroutine的数量避免同时创建大量进程。
--
是不是程序中只要含有使用cgo的包,就所有的goroutine都与c语言的线程一样的占用很大的栈空间,感觉有地儿恐怖。还是只有某个goroutine调用了有cgo的包才占用较大的栈空间?
On 2013年1月10日Thursday at 下午1:54, minux wrote:
>
> 2013/1/10 steve wang <steve....@gmail.com (mailto:steve....@gmail.com)>
> > 如果改动代码限制一下goroutine的数量是否可行?我之前在写一个编译工具时需要创建子进程,就是通过手工限制goroutine的数量避免同时创建大量进程。看了一下 net 库的实现,netFD 的 read/write 用的都是 non-blocking I/O。我的理解是对 TCPConn/UDPConn 之类的读写操作不会因为可能 block 而创建新的线程。
>
> 可行啊。不过还是不如系统限制来得方便。
> 其实是限制卡在IO上的goroutine数目就可以了。
>
2013/1/8 Yan Unon <yan...@gmail.com>最近在使用[shadowsocks-go](https://github.com/shadowsocks/shadowsocks-go)作为翻墙工具,我把服务器端部署在一个内存为128MB的OpenVZ VPS上,但是效果十分不理想,并发25个连接就把系统内存占满,然后因为不能开辟内存而崩掉。同时,我也使用了nodejs版本[shadowsocks-nodejs](https://github.com/clowwindy/shadowsocks-nodejs)测试,并发上百个连接内存占用只有40%左右。你的OpenVZ系统支持Vswap么?是64位系统么?
后来看了一下shadowsocks-go的源码,作者对每个连接使用了1个goroutine,然后开启了2个goroutine作为数据双向通道,每个通道缓存只有4kB,也就是128MB内存连75个简单goroutine都撑不起。(不知道这样分析对不对)没看懂这段,75个goroutine能到128MiB的话,那可是平均下来每个goroutine 1MiB+呀
--
--
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
On 01/08/2013 10:49 AM, Yan Unon wrote:
不好意思,忘了格式化内容。重发一下。
邮件列表里大家一般都会用纯文本。
最近在使用shadowsocks-go <https://github.com/shadowsocks/shadowsocks-go>
作为翻墙工具,我把服务器端部署在一个内存为128MB的OpenVZ VPS上,但是效果
十分不理想,并发25个连接就把系统内存占满,然后因为不能开辟内存而崩掉。同
时,我也使用了nodejs版本shadowsocks-nodejs
<https://github.com/clowwindy/shadowsocks-nodejs>测试,并发上百个连接内
存占用只有40%左右。
我猜一下,你的VPS上跑的是32位系统吧?
就是你理解那样,实际情况平均下来每个goroutine 1M+,但是看代码里面并没有大量占用内存的地方,所以对这个现象很疑惑。
以前不是说go的底层都用epoll来完成网络IO,让我们能够以通常的程序逻辑来完成nodejs中需要回调才能实现的异步IO吗。怎么还是阻塞版本的系统调用,这样的话goroutine不就没有意义吗?
--