在 Linux 上终止 CLOSE_WAIT 套接字而不终止父进程

Ale*_*eth 9 linux-networking socket

Tomcat 给我留下了 CLOSE_WAIT 套接字,最终使最大连接数饱和。

我在我的客户端和服务器代码中尝试了很多方法来摆脱这些都无济于事,包括关闭连接、调用 System.gc() 等。

现在我试图找到一种方法来简单地在操作系统中快速超时。我有 conntrack 工作,但不知道如何使用它来终止这些连接。我还将 /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close_wait 设置为 1,这当然太低了,但连接仍然存在。

有没有办法杀死这些僵尸套接字?

运行 Ubuntu。

Are*_*tar 3

我相信连接的服务器端的 CLOSE_WAIT 意味着服务器已收到来自客户端的 FIN,将向客户端确认此消息,然后通知应用程序可以关闭连接。

一旦从连接读取了所有数据,应用程序就可以放弃连接。

一旦放弃连接,服务器将向客户端发送最终的 FIN,并且连接将完全关闭。

建议它与“TCP_tuning”无关

您确定您的应用程序正在关闭套接字吗?

当我写一个 python 服务器时,我学到了这一点:D

更新
根据您的 Tomcat 版本,您可能遇到过此问题,因为 Tomcat 6 中 Coyote 的 AJP 协议中的 keepAliveTimeout 功能引入了一个错误。
这个问题的本质是由于 Tomcat 在 keepAliveTimeout 过期后未能关闭套接字造成的。Tomcat 套接字将保持在 CLOSE_WAIT 状态,但相应的 mod_jk 套接字将正常关闭。

他的错误在 SVN commit r589062 中修复并在 Tomcat 6.0.15 中发布