系统产生大量timewaite的处理

Timewait 和 TCP 连接的关系:

首先我们需要了解 Timewait 和连接的关系。Timewait 的连接状态是由 TCP 的 4 次挥手过程产生的。4 次挥手的过程如图所示。我们可以看到,左边是主动关闭的一端,右边就是被动关闭的一端。
系统产生大量timewaite的处理_第1张图片
image.png

主动关闭的一端向服务端发送第 1 次挥手的请求,被动方返回了一个 ACK 的包,可以看到被动关闭端再一次发送完 FIN 和 ACK 包以后,主动关闭端就会会先发送一个 ACK 响应回去,然后进入 TIME_WAIT 状态。

我们看到在它进入 TIME_WAIT 状态之前,理论上 4 次挥手已经完成了,为什么 TIME_WAIT 还需要保留一段时间?

这是因为 TCP的协议标准,需要保证4 次挥手过程中最后一次连接发送的稳定性,如果ACK包发送不成功,就需要再次发送 ACK 包。

大量的 Timewait 产生会造成文件句柄、内存和端口的占用,由于系统会把过多的 time-wait socket 删除、回收,在网络条件不好的情况下,就可能会导致数据包重复的进行发送。

如何对 TimeWait 进行优化

了解了 Timewait 的影响(结论:通常不会直接造成服务连接的影响,但是会造成一些资源上及新建连接风险),为了避免过多的 Timewait 产生,我们需要考虑去进行一些优化。在单机系统上做性能优化的话,我们需要考虑两点:

第 1 点就是考虑把Timewait 队列加大。在操作系统资源、硬件资源能满足的情况下,我们可以把 tcp_max_tw_buckets 的值数调高,它的缓冲值也就越大。这个数字是我们可以进行操作系统内核优化的。

第 2 点即我们需要尝试修改操作系统内核优化的内容,也就是调整 TIME_WAIT 超出时间,如果它的操作时间能够更快地让操作系统进行回收,那么它就可以更快地释放资源。当然这个时间也不能调的太小,要不然 Timewait 的作用的意义就很小了。所以我建议操作系统内核的参数 tcp_fin_timeout 这个值调到 30,这就是一个比较合理的优化空间。

参考链接:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=42#/detail/pc?id=1563

你可能感兴趣的:(系统产生大量timewaite的处理)