问题描述:当websocket连接数达到几千时,线上频繁断开连接。
通过分析堆栈,发现所有的线程都阻塞在一块了。
初步怀疑tomcat连接数少了,所以没办法处理接下来的请求,后来看到都处于wait状态。
那么就怀疑线程挣抢原因,top命令查看cpu没高峰,排除。
接着定位redis 游标scan命令,但是db库数据比较少,原因排除。
接着怀疑xxljob频繁访问造成的,有几个一秒执行的job。然后发现堆栈信息中的确xxljob在run。查看xxljob后台,发现全部成功。没有失败的。那就纳闷了,xxljob全部成功,但是对外tomcat响应超时。xxljob内部采netty通信,而且开了长链接。
至此资源占用问题排除。
在这里插入图片描述
接着通过netstat anp发现800多个端口wait-close,再加上是websocket这块出现问题。项目内其他接口访问正常。
tcp四次挥手过程中,主动关闭方会进入wait-close状态,持续2ms时间才被关闭。那么就可以怀疑ws主动断开导致。
在这里插入图片描述
看了websocket连接相关代码,发现当访问已销毁的vm会触发主动关闭。那么就和前端协商返回一个错误码,交给前端断开。修改后,用jmeter压测200多没问题。
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐