【发布时间】:2015-03-05 10:20:50
【问题描述】:
我在 Jetty 上运行的 java web 服务在几个小时后崩溃了,调查表明许多套接字处于 CLOSE_WAIT 状态。虽然它工作正常,但似乎没有处于 CLOSE_WAIT 状态的套接字,但是当它出错时有负载。
我找到了这个definition
CLOSE-WAIT:本地端点已收到连接终止请求并确认它,例如已执行被动关闭,本地端点需要执行主动关闭才能离开此状态。
在我的服务器上使用 netstat,我看到一个处于 CLOSE_WAIT 状态的 tcp 套接字列表,本地地址是我的服务器,外部地址是我的负载平衡器机器。所以我认为这意味着客户端(负载均衡器)刚刚以某种不正确的方式终止了连接,而我的服务器没有正确关闭其末端的连接。
但是我该怎么做,我的 Java 代码不处理低级套接字?
或者负载平衡器终止连接是因为我的服务器在代码中做错了什么导致的早期问题。
【问题讨论】:
-
标记为重复的问题看起来很相似,但解决方案没有帮助,因为它表明问题出在客户端,但我们不能仅通过服务器控制客户端,因此我们需要为服务器提供一种方法即使客户做错了什么也要应对。
-
问题不在于客户端,而在于服务器,或者更确切地说,无论哪一端显示 CLOSE_WAIT。 @Kayaman 不是真的重复,因为另一个是关于有这种情况的客户,并且有一个仅限客户的解决方案。
-
@EJP 哦,好吧,我不明白我该如何解决这个问题我的 servlet 中有一个 doGet(HttpServletRequest request, HttpServletResponse response) 方法,其中很多都执行 response.redirect(), response.sendError( ) 或更常见的 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), CHARSET))); writer.write(out, results, responseFormat, isPretty); out.close();然后返回。我不直接处理套接字,所以我该如何解决这个问题?
-
我认为你必须倒过来因果。 CLOSE_WAIT 中的套接字是服务器倒下的症状,而不是倒下的原因。
-
只有 client 发送一个 FIN 才能产生 CLOSE_WAIT,如果它持续存在是服务器 failing 做某事造成的,即关闭套接字。 @DavidSchwartz 是对的,你有这一切。
标签: java tomcat tcp jetty load-balancing