基础知识:
TIME_WAIT是什么?
生产Nginx现大量TIME-WAIT,连接耗尽,该如何处理?
2023-03-08 16:43·Java码农之路
背景说明:
在读者30+交流群中,是不是有小伙伴问:
生产环境 Nginx 后端服务大量 TIME-WAIT , 该怎么办?
除了Nginx进程之外,还有其他的后端服务如:
生产环境 Netty、SpringCloud Gateway 后端服务大量 TIME-WAIT , 该怎么办?
遇到这样的生产环境难题,小伙伴们非常头疼。
更为头疼的是,这个也是一道场景的面试题。之前有小伙伴反应过,他面试科大讯飞的时候,遇到了这道题目:
生产环境 Nginx 后端服务大量 TIME-WAIT 的解决步骤
这里给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”。
也一并把这个题目以及参考答案,收入咱们的《Java面试宝典》,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
注:本文以 PDF 持续更新,最新Java 架构笔记、面试题 的PDF文件,请后台私信【笔记】即可获取!
基础知识:
TIME_WAIT是什么?
在构建TCP客户端服务器系统时,很容易犯简单的错误,这些错误会严重限制可伸缩性。
其中一个错误是没有考虑到TIME_WAIT状态。
为什么TIME_WAIT存在,它可能导致的问题,如何解决它,以及什么时候不应该。
TIME_WAIT是 TCP 状态转换图中经常被误解的状态。
这是某些套接字可以进入并保持相对较长时间的状态,如果您有足够的套接字,那么您创建新套接字连接的能力可能会受到影响,这可能会影响客户端服务器系统的可伸缩性。
关于套接字如何以及为什么首先进入TIME_WAIT,经常存在一些误解,不应该有,这并不神奇。从下面的TCP状态转换图中可以看出TIME_WAIT,是TCP客户端通常最终处于的最终状态。
虽然状态转换图显示TIME_WAIT为客户端的最终状态,但它不一定是客户端TIME_WAIT。事实上,最终状态是启动“主动关闭”的对等端最终进入,这可以是客户端或服务器。那么,发布“主动关闭”是什么意思?
如果TCP对等方是第一个呼叫Close()连接的对等方,则TCP对等方会启动“主动关闭” 。
在许多协议和客户端/服务器设计中,这是客户端。
在HTTP和FTP服务器中,这通常是服务器。
导致同伴结束的事件的实际顺序TIME_WAIT如下。
现在我们知道套接字是如何结束TIME_WAIT的,理解为什么这个状态存在以及它为什么会成为一个潜在的问题是有用的。
TIME_WAIT通常也被称为2MSL等待状态。
这是因为转换到的套接字在此期间的持续时间TIME_WAIT为2 x最大段寿命。
MSL是任何段的最大时间量,对于构成TCP协议一部分的数据报的所有意图和目的而言,在丢弃之前,网络可以在网络上保持有效。这个时间限制最终以用于传输TCP段的IP数据报中的TTL字段为界。
不同的实现为MSL选择不同的值,常用值为30秒,1分钟或2分钟。
RFC 793指定MSL为2分钟,Windows系统默认为此值,但可以使用TcpTimedWaitDelay注册表设置进行调整。
TIME_WAIT可能影响系统可伸缩性 的原因是,TCP连接中一个完全关闭的套接字将保持TIME_WAIT约4分钟的状态。
如果许多连接正在快速打开和关闭,那么套接字TIME_WAIT可能会开始累积在系统上; 您可以TIME_WAIT使用netstat查看套接字。一次可以建立有限数量的套接字连接,限制此数量的其中一个因素是可用本地端口的数量。
如果TIME_WAIT插入太多的套接字,您会发现很难建立新的出站连接,因为缺少可用于新连接的本地端口。
但为什么TIME_WAIT存在呢?有两个原因需要TIME_WAIT。
首先是防止一个连接的延迟段被误解为后续连接的一部分。丢弃在连接处于2MSL等待状态时到达的任何段