当前位置:  开发笔记 > 后端 > 正文

服务器端的许多TIME_WAIT的成本是多少?

如何解决《服务器端的许多TIME_WAIT的成本是多少?》经验,为你挑选了3个好方法。

我们假设有一个客户端与服务器建立了很多短生命的连接.

如果客户端关闭连接,则客户端上将有许多TIME_WAIT状态的端口.由于客户端耗尽本地端口,因此无法快速进行新的连接尝试.

如果服务器关闭了连接,我会TIME_WAIT在服务器端看到很多s.但是,这有什么害处吗?客户端(或其他客户端)可以继续进行连接尝试,因为它永远不会耗尽本地端口,并且TIME_WAIT服务器端的状态数将增加.最终会发生什么?有什么不好的事吗?(减速,崩溃,掉线等)

请注意,我的问题不是"目的是TIME_WAIT什么?" 但是"如果TIME_WAIT服务器上有这么多状态,会发生什么?" 我已经知道在TCP/IP中关闭连接时会发生什么以及为什么TIME_WAIT需要状态.我不是想解决它,但只是想知道它的潜在问题.

简单来说,让我们说netstat -nat | grep :8080 | grep TIME_WAIT | wc -l打印100000.会发生什么?O/S网络堆栈是否会变慢?"打开文件太多"错误?或者,没什么好担心的?



1> 小智..:

每个套接字TIME_WAIT消耗内核中的一些内存,通常比ESTABLISHED套接字小一些但仍然很重要.足够大的数字可能耗尽内核内存,或至少降低性能,因为该内存可用于其他目的. TIME_WAIT套接字不保存打开的文件描述符(假设它们已正确关闭),因此您不必担心"打开文件太多"错误.

套接字还绑定了特定的src/ dstIP地址和端口,因此在TIME_WAIT间隔期间不能重复使用.(这是州的预期目的TIME_WAIT.)除非您需要使用相同的端口对重新连接,否则捆绑端口通常不是问题.大多数情况下,一方将使用短暂的端口,只有一侧锚定到一个众所周知的端口.但是,TIME_WAIT如果您反复频繁地连接相同的两个IP地址,则会有大量的套接字耗尽短暂的端口空间.请注意,这仅影响此特定IP地址对,并且不会影响与其他主机的连接建立.



2> caf..:

每个连接由元组(服务器IP,服务器端口,客户端IP,客户端端口)标识.至关重要的是,TIME_WAIT连接(无论是在服务器端还是在客户端)都占据了这些元组中的一个.

使用TIME_WAIT客户端的s,很容易看出为什么你不能再建立连接 - 你没有更多的本地端口.但是,同样的问题适用于服务器端 - 一旦它在单个客户端的TIME_WAIT状态下有64k连接,它就不能再接受来自该客户端的连接,因为它无法区分旧连接和新连接 - 两个连接都由同一元组标识.在这种情况下,服务器应该只返回来自该客户端的新连接尝试.RST



3> trustin..:

到目前为止的调查结果:

即使服务器使用系统调用关闭了套接字,如果它进入TIME_WAIT状态,也不会释放其文件描述符.当TIME_WAIT状态消失时(即在2*MSL秒之后),文件描述符将被释放.因此,太多TIME_WAIT可能会导致服务器进程中出现"打开文件太多"错误.

我相信O/S TCP/IP堆栈已经使用适当的数据结构(例如散列表)实现,因此TIME_WAIT的总数不应该影响O/S TCP/IP堆栈的性能.只有拥有TIME_WAIT状态套接字的进程(服务器)才会受到影响.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有