对卡在CLOSE_WAIT状态的连接进行故障排除

2022-09-01 13:00:28

我有一个Java应用程序在Windows上的WebLogic 11g中运行,几天后,它变得无响应。我注意到的一个可疑症状是,即使服务器处于空闲状态,大量连接(约3000个)也显示为CLOSE_WAIT状态。由于应用程序服务器正在管理客户端连接,因此我不确定是什么原因造成的。我们还进行了许多Web服务调用,这些调用环回同一服务器,但我相信这些连接可以正确关闭。还有什么可能导致这种情况,如何解决这样的问题?netstat


答案 1

CLOSE_WAIT是当远程主机发送 FIN(关闭其连接)但本地应用程序尚未执行相同操作并发送回复 FIN 时本地 TCP 状态机所处的状态。尽管客户端无法接收数据(除非它在连接上只关闭了一半),但本地计算机仍然可以在此时发送数据。

当远程主机关闭(发送 FIN)时,本地应用程序将获得某种事件(它是基 C 库中套接字上的“read”事件),但从该连接读取将返回错误以指示连接已关闭。此时,本地应用程序应关闭连接。

我对Java知之甚少,对WebLogic也一无所知,但我认为应用程序可能没有正确处理读取错误,因此从未关闭过连接。


答案 2

我一直遇到同样的问题,我一直在研究套接字来摆脱这个问题。

让我说几句话,但在此之前我必须说我不是Java程序员。

我不会解释close_wait是什么,因为布莱恩·怀特已经说过了所有应该说的话。

为了避免close_wait,您需要确保服务器在发回响应后不会关闭连接,因为首先断开连接的人都会陷入close_wait并time_wait。因此,如果您的服务器卡在close_wait它会告诉我它在发送响应后正在断开连接。

你应该通过做一些事情来避免这种情况。

1 - 如果客户端应用程序未使用 http 1.1 协议,则必须将其设置为使用该协议,因为 http 标头选项。'keep-alive

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 连接


推荐