线上碰到服务器 大量tcp连接处于close_wait状态,tomcat处于假死状态,即tomca在运行,但不能访问。因为tcp连接耗尽了。
查询tcp连接数和状态:netstat -an|awk '/^tcp/{++S[$NF]}END{for (a in S)print a,S[a]}'
查询端口监听的tcp连接 netstat -anp |grep 8080
按tcp协议来说,客户端发送关闭连接消息,服务端会进入close_wait状态,服务端处理完后会自动进入last_ack状态,为什么服务端没进入?
这种情况是客户端先发起了关闭,服务端被动关闭,问题应该在服务端。
参考网上资料服务器出现大量close_wait,我们来说说到底是怎么回事?(以tomcat为例) - 三国梦回 - 博客园
一次服务端大量CLOSE_WAIT问题的解决_Hello World-CSDN博客
以上两个案例,服务端因为一些错误导致接口响应很慢、或者被堵塞住,导致客户端连接超时,所以客户端开始关闭,但服务端一直没处理完,所以没有进入到last_ack状态。
最后我这里排查出是websocket 连接400,一直没能连上,服务端没关闭tcp。但客户端不停的在重新连接,导致tcp很多。
总结:服务端阻塞问题,服务端太耗时、服务端程序阻塞,导致客户端连接超时请求断开连接,但服务端程序还在执行、还在处理资源无法进入lastack状态。比如以上网上案例,服务端等待数据库连接以致阻塞、服务端等待其他io接口以致阻塞。
排查,先看客户端操作、服务端日志,看哪块代码引发closewait,再去排查是否阻塞或没关闭资源。