我们的一台服务器存在生产问题,并且性能缓慢与处于该状态的套接字过多有关TIME_WAIT
。我们不必对这个问题进行长篇大论,我们基本上知道每次服务器运行缓慢时,大约 80% 的服务器套接字都处于此TIME_WAIT
状态,当然,我们可以通过运行 来查看netstat
。具体来说,由于TIME_WAIT
超时和消失,当我们的服务器运行缓慢时,我们会TIME_WAIT
非常频繁地看到这些套接字出现(大约每 5-10 分钟一次)。
我做了一些调查,发现TIME_WAIT
当服务器关闭活动连接但保留该连接以防任何延迟的数据包通过时,会发生这种情况。最终TIME_WAIT
超时。
无论如何,要确切了解为什么单个套接字会进入该TIME_WAIT
状态?这是 CentOS 5 - Linux 是否将此信息记录在var/logs
任何地方,或者是否有任何方法可以执行 tcpdump 并查找导致 的特定模式TIME_WAIT
?提前致谢。
答案1
简短回答 - 这是由于应用程序造成的。应用程序在短时间内创建套接字,然后关闭它们,然后它立即需要打开另一个套接字。缓慢与进程用尽可用的套接字有关。
创建套接字时有选项 - SO_REUSEADDR 和 SO_REUSEPORT。它们具有类似的功能,但我怀疑在 Centos 5 中 SO_REUSEPORT 不可用。无论如何,套接字调用上的可选设置允许立即重用端口。
因此,常用的修复方法是重新编码。它可能是一个连接几秒钟然后结束会话的网络应用程序。
答案2
它为套接字设置属性,然后由内核允许/强制执行这些属性。
- 创建套接字时,SO_REUSEADDR 是符合 POSIX 的选项。
http://pubs.opengroup.org/onlinepubs/009695399/functions/setsockopt.html
简短的回答 - 是的,是的。因此,如果您使用慢速 DSL 与偏远办公室建立非常慢的连接,则可能存在“迟缓”数据包的问题。但如果这些是 LAN 中的连接,则可能不存在问题。
您的某个应用程序必须批量打开套接字,然后关闭它们。 lsof 将显示哪个 pid 打开了套接字。 从那里您可以获得用户和正在运行的内容。 例如,它可以是像滥用 netcat 的 bash shell 脚本一样简单的东西。
底线:这要么是网络设施滥用,要么是代码问题。而且您确实有一个网络应用程序 - 这个应用程序正在吞噬您的系统。我对网络应用程序的定义是“使用 TCP/UDP 套接字”。不一定是 Web 服务器。