如何删除CLOSE_WAIT套接字连接
我写了一个小程序,与特定端口上的服务器进行交互。 该程序工作正常,但:
一旦程序意外终止,并从该套接字连接显示在CLOSE_WAIT
状态。 如果我尝试运行一个程序,它会挂起,我必须强制它closures,这会累积更多的 CLOSE_WAIT
套接字连接。
有没有办法刷新这些连接?
CLOSE_WAIT
表示程序仍在运行,并没有closures套接字(内核正在等待它)。 将-p
添加到netstat
以获取pid,然后更有力地杀死它(如果需要,使用SIGKILL
)。 这应该摆脱你的CLOSE_WAIT
套接字。 您也可以使用ps
来查找pid。
SO_REUSEADDR
用于服务器和TIME_WAIT
套接字,所以在这里不适用。
正如Crist Clark所描述的那样。
CLOSE_WAIT表示连接的本地端从另一端接收到一个FIN,但是OS正在等待本端的程序实际closures它的连接。
问题是在本地机器上运行的程序没有closures套接字。 这不是一个TCP调优问题。 在程序保持连接打开的情况下,连接可以(并且非常正确地)保持在CLOSE_WAIT中。
一旦本地程序closures套接字,操作系统就可以将FIN发送到远端,并在等待FIN的ACK时将其转换为LAST_ACK。 一旦收到,连接完成并从连接表中删除(如果您的结束处于CLOSE_WAIT中,则不会以TIME_WAIT状态结束)。
我也有一个最新的Tomcat服务器(7.0.40)相同的问题。 它几天没有响应一次。
要查看打开的连接,您可以使用:
sudo netstat -tonp | grep jsvc | grep --regexp="127.0.0.1:443" --regexp="127.0.0.1:80" | grep CLOSE_WAIT
如本文所述,您可以使用/proc/sys/net/ipv4/tcp_keepalive_time
查看这些值。 该值似乎以秒为单位,默认为7200(即2小时)。
要改变它们,你需要编辑/etc/sysctl.conf
。
Open/create `/etc/sysctl.conf` Add `net.ipv4.tcp_keepalive_time = 120` and save the file Invoke `sysctl -p /etc/sysctl.conf` Verify using `cat /proc/sys/net/ipv4/tcp_keepalive_time`
即使过多的CLOSE_WAIT连接意味着你的代码在第一个有问题,这是不被接受的好习惯。
你可能想看看: https : //github.com/rghose/kill-close-wait-connections
这个脚本做的是发送连接正在等待的ACK。
这是为我工作。