大量time-wait,造成tomcat假死

问题描述:当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多没问题。
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值