websocket长链接的保持与通道和goroutine的坑

工作中遇到用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了,正常了

 

websocket长链接的保持与通道和goroutine的坑

上一篇:ajax 中 formData 常用使用场景


下一篇:微信45028错误,微信has no masssend quota hint错误