我有一个Java应用程序在Windows上运行的WebLogic 11g中,在几天后会变得无响应。我注意到一个可疑的症状是,即使服务器处于空闲状态,大量连接(约3000个)显示为CLOSE_WAIT状态。由于应用服务器正在管理客户端连接,我不确定是什么原因导致了这种情况。我们还进行了一些回环到同一服务器的Web服务调用,但我相信这些连接会被正确关闭。还有什么其他可能导致这种情况,并且如何排除这样的问题?
我有一个Java应用程序在Windows上运行的WebLogic 11g中,在几天后会变得无响应。我注意到一个可疑的症状是,即使服务器处于空闲状态,大量连接(约3000个)显示为CLOSE_WAIT状态。由于应用服务器正在管理客户端连接,我不确定是什么原因导致了这种情况。我们还进行了一些回环到同一服务器的Web服务调用,但我相信这些连接会被正确关闭。还有什么其他可能导致这种情况,并且如何排除这样的问题?
我一直遇到同样的问题,为了解决这个问题,我一直在研究socket。
让我简单说几句话,但是必须先声明,我不是Java程序员。
我不会解释close_wait是什么,因为Brian White已经说了应该说的一切。
为了避免close_wait,你需要确保服务器在发送响应后不关闭连接,因为谁先断开连接就会被卡在close_wait和time_wait中。所以,如果你的服务器陷入了close_wait状态,那么说明它在发送响应后断开了连接。
你可以通过以下几种方式来避免这种情况:
1- 如果你的客户端应用程序没有使用http 1.1协议,你必须设置它使用'keep-alive'
http头选项。
2 - 如果你的客户端正在运行http 1.1并且这并不起作用,或者如果你必须使用http 1.0,则应设置连接请求头属性:
connection: keep-alive
这告诉服务器在完成请求后,客户端和服务器都不应该断开连接。通过这样做,您的服务器将不会在接收每个请求后立即断开连接。
3- 在您的客户端中,重复使用您的套接字。例如,如果您正在循环创建许多套接字客户端,您应该创建一个套接字,然后在每次需要发送请求时重复使用它。我在我的应用程序中使用的方法是拥有一个套接字池,并获取一个可用的套接字(已经连接到服务器并具有keep-alive属性)。然后我使用它,完成后将其放回池中以便重复使用。
4- 如果您确实需要在发送请求后断开连接,请确保您的客户端这样做,并保持connection: keep-alive
。
是的,当服务器端出现大量close_waits或time_waits时,您可能会遇到问题。
请查看此[链接][1],了解keep-alive
是什么。
希望这对您有所帮助。使用这些方法,我成功地解决了我的问题。
[1]: http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Persistent 连接
CLOSE_WAIT
是本地TCP状态机处于的状态,当远程主机发送FIN(关闭其连接),但是本地应用程序尚未做出相同的回复FIN时。此时仍有可能让本地机器发送数据,但是客户端无法接收它(除非它只对连接进行了一半的关闭)。
当远程主机关闭连接(发送FIN)时,您的本地应用程序会收到某种事件(在基本C库中为“读”事件),但是从该连接读取将返回错误,以指示连接已关闭。此时,本地应用程序应关闭连接。
我对Java知之甚少,对WebLogic一无所知,但我认为应用程序可能没有正确处理读取错误,因此从未关闭连接。
CLOSE_WAIT
状态表示另一端已经发起了连接关闭,但是本地应用程序尚未关闭套接字。
这听起来像是您的本地应用程序存在错误。