我们有一个连接到外部计费服务器的应用程序。一旦客户端的服务器出现故障,就会有数百个连接处于CLOSE_WAIT状态。
我已经检查了客户端代码。而且客户端似乎正在正常关闭TCP连接。
如果发生这种情况是因为服务器端的问题导致服务器没有正确关闭连接,那么有没有一种方法可以防止客户端将套接字保持在CLOSE_WAIT状态?
我还观察到线程计数和cpu使用率比平时上升得更多。
应用程序重新启动后,即使在几个小时后也没有CLOSE_WAIT构建,线程计数和cpu使用率恢复到正常水平。
如果服务器有时无法正常关闭连接,除了重启客户端删除CLOSE_WAITs之外,我们还能做什么吗?(我的意思是,有没有什么代码改进可以防止客户端出现这种问题)
我们在客户端使用定制的JDiameter代码连接到计费服务器。
(我们无法访问服务器端代码)
发布于 2013-06-13 19:31:26
如果发生这种情况,是因为服务器端的问题导致服务器没有正确关闭连接...
事实并非如此。
RFC 793声明:"CLOSE_WAIT -表示正在等待来自本地用户的连接终止请求。“这意味着对等项已关闭连接: TCP已收到FIN,它正在等待本地应用程序也执行同样的操作。
如果您在自己的连接端遇到此问题,则表明一件事:您没有关闭自己的套接字。您忽略了套接字上的EOS条件或异常,并继续使用它。
解决方案:不要。EOS意味着您必须停止读取并关闭套接字。除SocketTimeoutException之外的任何IOException都具有相同的含义。
https://stackoverflow.com/questions/17085079
复制相似问题