一次服务端大量CLOSE_WAIT问题的解决

原创 2015年03月27日 15:54:22
     今天在运行服务器的时候发现一个问题,问题的表现是客户端一直在请求,但是返回给客户端的信息是异常,服务端压根没有收到请求,查看了一下配置信息没有错误,首先查看了一下是不是服务器的连接已经满了,打开netstat命令发现服务器的连接有大量的CLOSE_WAIT状态的socket,没怎么遇到这个问题,开始还真有段懵了,第一反应就是是不是客户端的问题(是不是出问题的第一反应都是别人的问题),但是马上补充了一下socket状态机的知识,发现这个状态是由于客户端关闭了socket连接,发送了FIN报文,服务端也发送了ACK报文,此时客户端处于FIN_WAIT_2状态,服务端处于CLOSE_WAIT状态,如下图:



     可以看出,出现问题的原因是由于我这边没有发送第二个FIN报文导致的,分明是我的问题啊,为什么服务器没有发送FIN报文呢?我的服务器使用的是嵌入式的jetty,连接管理应该都是它帮我管理的,重启了一下服务器发现服务器的CLOSE_WAIT开始的时候没有出现,之后逐渐的上升,貌似随着请求的数量逐渐增长的,而我这边的日志也非常奇怪,我会在收到请求的时候打印日志,然后在执行完毕的时候输出一个accesslog信息,发现日志中有入口的请求日志,但是accessLog没有增长,于是单步调试了一下,发现了问题:一个servlet的执行走到主流程就走不下去了,阻塞在数据库访问那一步上,具体表现就是获取不到数据库连接!
     查看了一下代码,发现原来是自己创建连接,执行sql,完成之后没有关闭连接,OMG,这么愚蠢的错误,于是在所有的数据库操作的最后加上如下的代码:
     finally {
          DbUtils.closeQuietly(conn);
     }



     好了,既然问题能够解决了,现在回头来思考一下问题产生的具体步骤:首先,我这边的大部分请求都需要查询数据库,我的数据库连接池设置的最大连接数是100,所以每一个请求创建了一个连接,等到100个请求就把连接池占满了,但是处理servlet的那个线程并没有释放这个连接,于是接下来的请求再去创建数据库连接的时候就会一直阻塞在那里,这里我所用的是DBCP作为连接池的,它的实现好像是使用apache的objectPool来实现的,如果没有可用的连接对象会导致线程等待,好了,servlet由于得不到数据库连接而阻塞了,这个客户端的请求就一直等待,客户端使用httpclient设置了5s的请求超时时间,那么超时之后就会抛出异常,关闭连接,关闭连接导致客户端发送了FIN报文,我这边的TCP/IP返回了ACK报文,但是由于处理请求的线程还处于阻塞的状态,所以当前的连接状态时CLOSE_WAIT。

警示:
1、代码一定要规范,尤其是在写一些关于自愿申请的部分,一定要在写函数之前写上注释告诉自己别忘了释放资源。
2、数据库连接和访问要设置超时时间,这点避免阻塞。
3、服务器的线程数也需要设置,使得问题尽可能的出现。

版权声明:本文为博主原创文章,未经博主允许不得转载。

服务器中很多的CLOSE_WAIT

服务器中很多的CLOSE_WAIT,请教各位大虾!!!!!!!!! 最近遇到一个问题,工程在LINUX服务器上面跑起来了以后,运行一段时间就有很多的CLOSE_WAIT链接,多了之后,网站就访问不了...
  • huoyunshen88
  • huoyunshen88
  • 2015年08月03日 20:05
  • 10978

linux服务器出现大量CLOSE_WAIT状态的连接

http://blog.kankanan.com/article/linux-670d52a1566851fa73b0592791cf-close_wait-72b6600176848fde63a5....
  • scdxmoe
  • scdxmoe
  • 2016年11月28日 18:05
  • 3520

服务器产生大量CLOSE_WAIT状态的socket问题的排查过程

周一高高兴兴来上班,突然同事说网关服务G挂了,偶尔正常。         什么,10台服务竟然大部分都挂了,以下是排查步骤:         服务简称G、A,G转发到A,服务器地址简称AIP1、A...
  • peppengliu
  • peppengliu
  • 2017年07月25日 18:31
  • 658

处理CLOSE_WAIT过多,导致oracle服务无法访问的问题

某天公司网站突然不能访问了,无论是页面加载还是登录均无法进行,查看应用服务器状态没有问题,从应用服务用 SQLPlus访问Oracle数据,提升无法连接,看来问题在数据库了。登录数据库服务器,查看服务...
  • starshine
  • starshine
  • 2013年11月22日 14:49
  • 3419

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法

近来在写服务端的时候纠结服务端要不要主动调用close()关闭socket,后来深入了解tcp断开连接四次握手,心中有点答案了。 下面内容均为转载:昨天解决了一个HttpClient调用错误导致的服...
  • luomoshusheng
  • luomoshusheng
  • 2016年07月25日 23:44
  • 2666

close_wait造成tomcat假死

Tomcat 假死原因分析报告       最近监控服务发现有台tomcat 的应用出现了无法访问的情况 ,由于已做了集群,基本没有影响线上服务的正常使用。下面来简单描述该台tomcat当时具体的...
  • lxlmj
  • lxlmj
  • 2016年11月02日 10:08
  • 8549

服务端出现大量close_wait问题

问题场景湖南骚扰电话的soap 集团在更换链路之后,web soap会造成大量的close_wait连接 然后集团再次下发请求后就不响应了原因分析这是由于client不正常关闭socket造成的,...
  • zly9923218
  • zly9923218
  • 2016年05月05日 15:30
  • 1516

HttpClient连接池抛出大量ConnectionPoolTimeoutException: Timeout waiting for connection异常排查

今天解决了一个HttpClient的异常,汗啊,一个HttpClient使用稍有不慎都会是毁灭级别的啊。这里有之前因为route配置不当导致服务器异常的一个处理:http://blog.csdn.ne...
  • shootyou
  • shootyou
  • 2011年07月18日 20:11
  • 85041

CLOSE_WAIT状态的原因与解决方法

CLOSE_WAIT状态的原因与解决方法 2009-09-24 13:52:18 分类: C/C++ 这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司...
  • lishenglong666
  • lishenglong666
  • 2015年04月28日 14:39
  • 2433

linux 下 CLOSE_WAIT过多的解决方法

linux 下 CLOSE_WAIT过多的解决方法
  • wesleyluo
  • wesleyluo
  • 2010年12月16日 09:17
  • 36233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一次服务端大量CLOSE_WAIT问题的解决
举报原因:
原因补充:

(最多只允许输入30个字)