tomcat大量time wait问题

  • Post author:
  • Post category:其他


在服务端访问量大的时候检测到大量的time wait,并且接口请求延时较高。

执行 netstat -n |awk ‘/^tcp/{++S[$NF]}END{for(m in S) print m,S[m]}’

这个shell命令的意思是把netstat -n 后结果的最后一条放到S[]数组中,如果相同则执行+1操作。

此时能看到TCP各种状态下的连接数量,示例

这里写图片描述

服务端架构是采用nginx 负载均衡后台有多台tomcat。

先说下TCP建立连接和终止连接的流程

tcp三次握手过程:

1、客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。

2、服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。

3、客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。

三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

这里写图片描述

tcp四次拜拜的过程:

(1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。

(2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。

注意:FIN的接收也作为一个文件结束符(end-of-file)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。

(3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。



版权声明:本文为zhaoshensky原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。