一、服务器出现大量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 状态。