CLOSE_WAIT 套接字突发-可能是因为 iptables 设置?

CLOSE_WAIT 套接字突发-可能是因为 iptables 设置?

我有一个 Ubuntu 12.04 服务器虚拟盒,其中安装的软件和配置基本上都是默认的,另外还安装了 jetty 6 服务器,该服务器为一些网站提供服务。为了简单起见,我没有安装 apache httpd,而是使用 iptables 将 jetty(在 8080 端口上运行)暴露给端口 80。以下是

/sbin/iptables -t nat -L

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             localhost            tcp dpt:http redir ports 8080
REDIRECT   tcp  --  anywhere             Ubuntu-1104-natty-64-minimal  tcp dpt:http redir ports 8080

Chain INPUT (policy ACCEPT) 
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  anywhere             localhost            tcp dpt:http redir ports 8080
REDIRECT   tcp  --  anywhere             Ubuntu-1104-natty-64-minimal  tcp dpt:http redir ports 8080

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

我必须承认,我对 iptables 的工作方式(尤其是对于不同类型的链)的理解很肤浅。这个东西可以工作,但有时我会遇到大量套接字,这些套接字会永久处于 CLOSE_WAIT 状态。我知道这个状态意味着什么,但由于我没有编写管理 servlet 的代码(它们由 jetty 处理),所以我无法通过修补代码来解决问题。最终,CLOSE_WAIT 套接字的数量会累积起来,导致服务器无响应,因此我必须重新启动 jetty。

我查找了与 CLOSE_WAIT 相关的类似问题,但只发现与程序员代码相关的案例,或与 Tomcat 相关的问题,而不是 Jetty。我想知道它们是否与部分损坏的 iptables 配置有关(另一种可能是 Jetty 6 中的错误,但我首先想排除其他可能的原因)。

谢谢。

答案1

到目前为止,还没有反馈:-(对于遇到麻烦的其他人,我至少能够编写一个快速的 crontab 脚本来检测问题并重新启动 jetty。这并不能完全解决问题,但可以减轻影响。

#!/bin/sh

CLOSE_WAIT_COUNT=`/bin/netstat | /bin/grep CLOSE_WAIT | /usr/bin/wc -l`
TIMESTAMP=`/bin/date`
THRESHOLD=5

echo "$TIMESTAMP Reported $CLOSE_WAIT_COUNT sockets in CLOSE_WAIT state..." >> /var/log/jettyrestarter.log

if [ $CLOSE_WAIT_COUNT -gt $THRESHOLD ]
then
    echo "$TIMESTAMP Restarting jetty" >>  /var/log/jettyrestarter.log
    service jetty restart
fi

答案2

另一个快速跟进,以防对其他人有用。几周前,我升级了运行 jetty 的虚拟服务器,从 512MB RAM 的虚拟服务器升级到 1GB RAM 的虚拟服务器。问题似乎已经消失 - 在 jettyrestarted 的日志中(见上文),最新事件来自 12 月 6 日。

相关内容