近期的项目中,有一个特殊的需求,对于每个客户端程序有若干个机构,对于每个机构有不同的客户端证书,程序间隔一段时间向服务端进行请求,根据请求的成功与否更新各机构的状态(如正常,证书未配置,证书过期等)。

  实际投入测试环境进行使用的时候,运行了一段时间之后,客户端程序出现了大量的CLOSE_WAIT的情况,导致压力测试无法正常进行。

  对相关的代码进行了检查之后,发现了之前的做法是对于每一个机构,维护一个RestTemplate对象,在其中进行读取证书等操作。怀疑和大量的restTemplate有关这个问题,因为本地开发的时候基本只有几个机构进行测试,所以未出现以上情况。根据CLOSE_WAIT出现在客户端的情况进行分析,是服务端发起了关闭连接的请求,而客户端进行了响应之后,接收了数据完成后并没有进行关闭,导致出现了CLOSE_WAIT。

  首先增加了连接池的参数 setValidateAfterInactivity(如下),发现不起作用。

PoolingHttpClientConnectionManager connectionManager = new
PoolingHttpClientConnectionManager(socketFactoryRegistry);
connectionManager.setValidateAfterInactivity(200);

  然后在初始化HttpClient时增加了参数 evictIdleConnections ,发现生效。

            CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(csf)
.setConnectionManager(connectionManager)
.evictIdleConnections(2, TimeUnit.SECONDS)
.build();

  通过分析源码发现,RestTemplate在不做额外配置的情况下,会默认开启KeepAlive,而服务端不进行额外配置的时候,不会返回额外的内容,此时客户端进行了相关的判断之后,如果响应头没有Keep-Alive会返回-1,即认为默认不释放,后续服务端进行相应的连接的断开时,客户端认为可重用,就不进行清理,导致一致处于CLOSE_WAIT状态,而由于使用了大量的RestTemplate,导致大量的CLOSE_WAIT出现。

连接池的配置不起作用是因为底层调用的是连接池的release方法,而release方法内部会进行相应的判断,如果发现是可重用的链接,就不会释放。

CloseableHttpClient的配置生效是因为底层是查看是否过期,如果过期,则调用关闭方法。

记录一次大量CLOSE_WAIT的情况的更多相关文章

  1. sqlServer 查询表中31到40的记录,考虑id不连续的情况

    SQL   查询表中31到40的记录,考虑id不连续的情况 写出一条sql语句输出users表中31到40记录(数据库为SQL Server,以自动增长的ID作为主键,注意ID可能不是连续的)? -- ...

  2. 记录Winform开发过程中遇到的情况

    前两天开发了个Winform操作Excel和数据库的一个小程序,把Winform的一些东西又给捡了起来,当中又学到了一些新的东西,特来写出来留作纪念. 一.CSKIN美化框架的使用 刚开始做的时候,发 ...

  3. Python实现监测抖音在线时间,实时记录一个人全天的在线情况

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小dull鸟 今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的 ...

  4. SQL Server使用sp_spaceused查看表记录存在不准确的情况

    在之前写过一篇博客"关系数据库如何快速查询表的记录数",里面介绍了使用sp_spaceused查看表的记录数是否正确的问题,具体如下:   关于问题3:有多个索引的表,是否记录数会 ...

  5. TCP连接(Time_Wait、Close_Wait)说明

    修改Time_Wait和CLOSE_WAIT时间 修改Time_Wait参数的方法 (在服务端修改)Windows下在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlS ...

  6. HttpClient4 TIME_WAIT和CLOSE_WAIT

    最近,公司的接口服务器(客户端,向外发送数据)频繁出现了connect timeout 以及readtime out 的情况,经过运维平台检测,并没有网络延时的情况.于是,开始怀疑连接池出了问题. 使 ...

  7. TCP之 TIME_WAIT和CLOSE_WAIT 状态 的原因分析和处理

    转自:http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http: ...

  8. 再谈应用环境下的TIME_WAIT和CLOSE_WAIT

    昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/article/details/6615051 里头的分析过程有 ...

  9. 谈应用环境下的TIME_WAIT和CLOSE_WAIT[转]

    昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/article/details/6615051 里头的分析过程有 ...

随机推荐

  1. requests 获取token

    # encoding:utf-8 import reimport jsonimport randomfrom requests.sessions import Session class Regist ...

  2. Linux下删除乱码文件

    删除乱码文件 一些文件乱码

  3. CDH5.16.1的maven依赖版本查询地址

    1查询官网地址,提供了详细的各个版本的jar依赖版本信息 https://www.cloudera.com/documentation/enterprise/release-notes/topics/ ...

  4. 【vue】函数式组件

    在 2.5.0 及以上版本中,如果你使用了单文件组件,那么基于模板的函数式组件可以这样声明: <template functional> <div class="cell& ...

  5. 【interview】汉诺塔学递归

    https://www.cnblogs.com/yanlingyin/archive/2011/11/14/2247594.html https://www.cnblogs.com/dmego/p/5 ...

  6. h1-h3使用

    一个页面也就只允许出现一个h1标签.内容页文章的标题,是seo中使用最多的地方,基本的文章页面标题都是使用h1标签.一.<h1>用来修饰网页的主标题,一般是网页的标题 ,文章标题,< ...

  7. Oracle建立全文索引详解

    Oracle建立全文索引详解1.全文检索和普通检索的区别 不使用Oracle text功能,当然也有很多方法可以在Oracle数据库中搜索文本,比如INSTR函数和LIKE操作: SELECT *FR ...

  8. 跨域资源共享(CORS)

    同源策略 同源策略是浏览器的一个安全策略,只允许当前页面或当前域下发送请求,如果向其他域发送请求,会被浏览器拦截 同源的意思:协议.IP地址.端口三者一致,浏览器才会认为是同一个域,三者中有一个不一致 ...

  9. JQuery插件:ScrollTo平滑滚动到页面指定位置

    1.准备jQuery库和scrollTo.js插件. <script type="text/javascript" src="js/jquery.js"& ...

  10. psutil(搬运,一个月后稍后修改)

    psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要用来做系统监控,性能分析,进程管理 安装:pip install psutil 1. ...