如何诊断大量的TIME_WAIT连接

我们只有一台服务器出现生产问题,并且在TIME_WAIT状态下的性能与大量套接字相关。 没有把这个问题描绘成一个巨大的背景,我们基本知道,每当服务器速度很慢时,大约80%的服务器套接字都处于TIME_WAIT状态,这当然是通过运行netstat看到的)。 具体而言,因为TIME_WAIT超时而消失,当我们的服务器很慢时,我们会看到这些TIME_WAIT非常频繁地出现(大约5-10分钟)。

我做了一些挖掘,看到TIME_WAIT发生在服务器closures一个活动的连接时,但是保持它在任何延迟的数据包通过。 最终TIME_WAIT超时。

无论如何,看看为什么一个单独的套接字进入TIME_WAIT状态开始? 这是CentOS 5 – Linux是否将这些信息var/logsvar/logs任何地方,或者是否有任何方法可以执行tcpdump并查找导致TIME_WAIT的特定模式? 提前致谢。

简短的回答 – 这是由于一个应用程序。 该应用程序在短时间内创build套接字,closures它们,然后立即需要打开另一个套接字。 缓慢与套接字使用的过程有关。

当创build一个套接字有选项 – SO_REUSEADDR abnd SO_REUSEPORT。 他们有一些相似的function,但我怀疑在Centos 5 SO_REUSEPORT不可用。 无论如何,socket调用的可选设置允许立即重用端口。

所以,一个常用的解决方法是重新编码。 这可能是一个networking应用程序连接几秒钟,然后结束会议。

它为套接字设置属性,然后它们被内核允许/强制执行。

  1. 创build套接字时,SO_REUSEADDR是符合POSIX标准的选项。

http://pubs.opengroup.org/onlinepubs/009695399/functions/setsockopt.html

  1. 简短的回答 – 是的,是的。 所以,如果你在慢速DSL上与孤独的远程办公室进行非常缓慢的连接,可能会出现“迟到”数据包的问题。 但是,如果这些连接在您的局域网中,可能不是。

  2. 你的一个应用程序必须打开套接字批发,然后closures它们。 lsof将显示哪个pid有一个打开的套接字。 从那里你可以派生用户和正在运行的东西。 例如,它可能像滥用netcat的bash shell脚本一样简单。

底线:这是滥用networking设施或代码问题。 而且你有一个networking应用程序 – 这是一个吃你的系统。 我的networking应用的定义是“使用TCP / UDP套接字”。 不一定是一个Web服务器。