在 Linux 上,无需终止父进程即可终止 CLOSE_WAIT 套接字

在 Linux 上,无需终止父进程即可终止 CLOSE_WAIT 套接字

Tomcat 给我留下了 CLOSE_WAIT 套接字,最终达到了最大连接数。

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

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

有没有什么办法可以杀死这些僵尸插座?

运行 Ubuntu。

答案1

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

一旦确认已从连接中读取了所有数据,则由应用程序放弃连接。

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

表明它与“TCP_tuning”无关

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

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

更新
根据您的 Tomcat 版本,您可能遇到过此问题,这是由于 Tomcat 6 中引入的 bug,该 bug 涉及 Coyote 的 AJP 协议中的 keepAliveTimeout 功能。
此问题的本质是由于 Tomcat 在 keepAliveTimeout 到期后无法关闭套接字。Tomcat 套接字将保持 CLOSE_WAIT 状态,但相应的 mod_jk 套接字将正常关闭。

该错误已在 SVN 提交 r589062 中修复,并在 Tomcat 6.0.15 中发布

相关内容