工作中遇到用websocket来和用户通信的,架构上是nginx+ws的方式。
写了个简单的脚本(启动1w个ws链接)测试一下服务器的用户承载能力,以10万的ws连接为目标,散列到5分钟内,创建websocket连接,10分钟后停掉测试脚本
10w的ws连接请求 全部成功
nginx与ws服务之间的连接数峰值在2w+,(相应的nginx和脚本直接的也差不多在2w+)
脚本不停,
10w的连接数,脚本内存占用为300多M
ws服务端内存占用为2.3g,这个占用,原则上说,脚本停了以后会慢慢回落下去,但是实际上并没有任何回落,或者说,正常的程序,内存占用不会这么暴力增长
然后加入了pprof,排查问题,发现goroutine一直在涨,没有一点回落,于是目的明确,goroutine泄漏,点击goroutine进去,发现频繁创建的就那么一个goroutine
最终发现是通道没有关闭,一个轮询读,一个在轮询写,所以goroutine一直没有关闭
修改完成后,再跑脚本,内存占用只有100+M了,正常了