解决处于CLOSE_WAIT状态的连接问题

| 我有一个Windows上的WebLogic 11g中运行的Java应用程序,几天后,该应用程序变得无响应。我注意到的一个可疑症状是,即使服务器空闲,大量的连接(约3000个)也会以CLOSE_WAIT状态显示在“ 0”中。由于应用服务器正在管理客户端连接,因此我不确定是什么原因造成的。我们还进行了许多Web服务调用,这些调用回送到同一服务器,但是我相信这些连接会正确关闭。还有什么可能导致此问题,以及如何解决此类问题?     
已邀请:
我遇到了同样的问题,并且一直在研究套接字以摆脱此问题。 让我说几句话,但是在我必须说我不是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时,您可能会遇到问题。 看看这个[link] [1],它解释what4ѭ是什么。 我希望这可以帮到你。通过这些事情,我设法解决了我的问题。 [1]:http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Persistent Connections     
“ 5”是远程主机发送FIN(关闭其连接)但本地应用程序未执行此操作并发送FIN答复时本地TCP状态机所处的状态。尽管客户端无法接收到数据,但本地计算机仍可以在此时发送数据(除非它仅对连接进行了半关闭)。 当远程主机关闭(发送FIN)时,您的本地应用程序将获得某种事件(在基础C库中的套接字上是一个“ read \”事件),但是从该连接读取将返回错误表示连接已关闭。此时,本地应用程序应关闭连接。 我对Java几乎一无所知,但对WebLogic却一无所知,但我认为应用程序可能无法正确处理读取错误,从而永远不会关闭连接。     
“ 5”状态表示另一端已发起连接关闭,但是本地端的应用程序尚未关闭套接字。 听起来您的本地应用程序中有错误。     
问题是在webLogic中将\“ Use JSSE SSL \”设置为true触发的错误。对于我们的应用程序来说,使用WebLogic自己的SSL实现而不是JSSE并不是问题,因此我只是取消选中该设置,问题就消失了。     
我发现这是关于CLOSE_WAIT堆积的报价:\“某种原因阻止了 发生在HTTP会话中(我们被卡住了,所以永远不会结束调用close),或者引入了一些错误来阻止套接字被关闭。发生这种情况的方式有很多。” 思考:在处理请求时,您的应用程序是否有可能被卡住?还是WebLogic本身? 检查:您可以执行Java线程转储(在Linux的Oracle JVM上可以使用kill -SIGQUIT进行此操作),以查看实际上是否有任何线程被卡住了吗? 检查客户端:首先,找出连接到CLOSE_WAIT套接字的客户端的IP地址或主机名。然后,查看这些客户端上是否有任何可疑的事件。     
这可能意味着您没有通过accept()调用在套接字上调用\“ close \”。     

要回复问题请先登录注册