服务器出现大量TIME_WAIT 、CLOSE_WAIT状态的原因和解决方案

四次挥手:

 

一、服务器出现大量CLOSE_WAIT 状态的原因
CLOSE_WAIT 状态,它是TCP四次挥手的第二次挥手被动关闭方的状态。

当服务端出现大量 CLOSE_WAIT 状态的连接的时候,说明服务端的程序没有调用 close 函数关闭连接。

解决方案:【及时关闭未使用的连接】

二、服务器出现大量TIME_WAIT 状态的原因
TIME_WAIT 状态,它是TCP四次挥手的第四次挥手主动关闭方的状态。
原因
1)HTTP没有使用长连接
HTTP没有使用长连接,就意味着服务器主动关闭时,每个都要进行四次挥手,而服务器端口、连接资源那么多,就会造成大量TIME_WAIT状态出现。
2)HTTP长连接超时
HTTP长连接是有超时时间的,超过这个时间,服务器就会主动关闭。
假设设置了 HTTP 长连接的超时时间是 60 秒,nginx 就会启动一个「定时器」,如果客户端在完后一个 HTTP 请求后,在 60 秒内都没有再发起新的请求,定时器的时间一到,nginx 就会触发回调函数来关闭该连接,那么此时服务端上就会出现 TIME_WAIT 状态的连接。
3)HTTP长连接的请求数量达到上限
当长连接的请求数量达到上限,服务器就会才去措施主动关闭一些连接。
比如对于一些 QPS 比较高的场景,比如超过 10000 QPS,甚至达到 30000 , 50000 甚至更高,如果 keepalive_requests 参数值是 100,这时 nginx 就会很频繁地关闭连接,那么此时服务端上就会出大量的 TIME_WAIT 状态。

危害

当连接处于TIME_WAIT状态时仍会占用系统资源(fd、端口、内存),过多的TIME_WAIT状态的连接会对系统的并发量造成影响。

1)对客户端的影响:

  当客户端主动关系连接,出现大量的time_wait时,TIME_WAIT状态的连接就占用了一个本地端口。这样在TIME_WAIT状态结束之前,本地最多就能承受6万个TIME_WAIT状态的连接,就没有端口可用了,限制了客户端的并发率,同时,大量的TIME_WAIT连接同样会消耗客户端的内存。

2)对服务器的影响:

  由于服务器一般只需要监听一个固定的端口,所以服务器所能支持的最大并发出数的上限取决于系统套接字描述符fd的大小,以及服务器的内存大小。当服务器主动关闭连接,产生time_wait时,每一个连接需要占用一定大小的内存资源,当TIME_WAIT 状态的连接过多时,会导致消耗的内存增加。

解决方案

1)客户端(调整短链接为长链接)

HTTP 请求的头部connection设置为keep-alive,保持存活一段时间,目前浏览器已经这样处理了

2)服务器端

a允许time_wait状态的socket被重用;

b调整系统内核参数,缩减time_wait 时间,设置为 1 MSL(1MSL = 2 min)

posted @ 2023-12-24 13:36  李若盛开  阅读(5522)  评论(0)    收藏  举报