大量time-wait,造成tomcat假死

当WebSocket连接数达到几千时,线上服务频繁出现连接断开现象。通过对线程堆栈、CPU使用率、Redis操作及XXLJob任务的分析,排除了各种可能的原因,如Tomcat连接数不足、线程竞争、Redis扫描命令和XXLJob任务执行。进一步观察到800多个端口处于wait-close状态,怀疑与WebSocket主动关闭有关。检查代码后发现,访问已销毁的VM会触发主动关闭,因此与前端协调改进,通过错误码指示前端断开连接。修改后,通过JMeter压测验证,问题得到解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值