记录一次大量CLOSE_WAIT的情况
近期的项目中,有一个特殊的需求,对于每个客户端程序有若干个机构,对于每个机构有不同的客户端证书,程序间隔一段时间向服务端进行请求,根据请求的成功与否更新各机构的状态(如正常,证书未配置,证书过期等)。
实际投入测试环境进行使用的时候,运行了一段时间之后,客户端程序出现了大量的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的情况的更多相关文章
- sqlServer 查询表中31到40的记录,考虑id不连续的情况
SQL 查询表中31到40的记录,考虑id不连续的情况 写出一条sql语句输出users表中31到40记录(数据库为SQL Server,以自动增长的ID作为主键,注意ID可能不是连续的)? -- ...
- 记录Winform开发过程中遇到的情况
前两天开发了个Winform操作Excel和数据库的一个小程序,把Winform的一些东西又给捡了起来,当中又学到了一些新的东西,特来写出来留作纪念. 一.CSKIN美化框架的使用 刚开始做的时候,发 ...
- Python实现监测抖音在线时间,实时记录一个人全天的在线情况
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小dull鸟 今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的 ...
- SQL Server使用sp_spaceused查看表记录存在不准确的情况
在之前写过一篇博客"关系数据库如何快速查询表的记录数",里面介绍了使用sp_spaceused查看表的记录数是否正确的问题,具体如下: 关于问题3:有多个索引的表,是否记录数会 ...
- TCP连接(Time_Wait、Close_Wait)说明
修改Time_Wait和CLOSE_WAIT时间 修改Time_Wait参数的方法 (在服务端修改)Windows下在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlS ...
- HttpClient4 TIME_WAIT和CLOSE_WAIT
最近,公司的接口服务器(客户端,向外发送数据)频繁出现了connect timeout 以及readtime out 的情况,经过运维平台检测,并没有网络延时的情况.于是,开始怀疑连接池出了问题. 使 ...
- TCP之 TIME_WAIT和CLOSE_WAIT 状态 的原因分析和处理
转自:http://blog.csdn.net/shootyou/article/details/6622226 昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http: ...
- 再谈应用环境下的TIME_WAIT和CLOSE_WAIT
昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/article/details/6615051 里头的分析过程有 ...
- 谈应用环境下的TIME_WAIT和CLOSE_WAIT[转]
昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/article/details/6615051 里头的分析过程有 ...
随机推荐
- requests 获取token
# encoding:utf-8 import reimport jsonimport randomfrom requests.sessions import Session class Regist ...
- Linux下删除乱码文件
删除乱码文件 一些文件乱码
- CDH5.16.1的maven依赖版本查询地址
1查询官网地址,提供了详细的各个版本的jar依赖版本信息 https://www.cloudera.com/documentation/enterprise/release-notes/topics/ ...
- 【vue】函数式组件
在 2.5.0 及以上版本中,如果你使用了单文件组件,那么基于模板的函数式组件可以这样声明: <template functional> <div class="cell& ...
- 【interview】汉诺塔学递归
https://www.cnblogs.com/yanlingyin/archive/2011/11/14/2247594.html https://www.cnblogs.com/dmego/p/5 ...
- h1-h3使用
一个页面也就只允许出现一个h1标签.内容页文章的标题,是seo中使用最多的地方,基本的文章页面标题都是使用h1标签.一.<h1>用来修饰网页的主标题,一般是网页的标题 ,文章标题,< ...
- Oracle建立全文索引详解
Oracle建立全文索引详解1.全文检索和普通检索的区别 不使用Oracle text功能,当然也有很多方法可以在Oracle数据库中搜索文本,比如INSTR函数和LIKE操作: SELECT *FR ...
- 跨域资源共享(CORS)
同源策略 同源策略是浏览器的一个安全策略,只允许当前页面或当前域下发送请求,如果向其他域发送请求,会被浏览器拦截 同源的意思:协议.IP地址.端口三者一致,浏览器才会认为是同一个域,三者中有一个不一致 ...
- JQuery插件:ScrollTo平滑滚动到页面指定位置
1.准备jQuery库和scrollTo.js插件. <script type="text/javascript" src="js/jquery.js"& ...
- psutil(搬运,一个月后稍后修改)
psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要用来做系统监控,性能分析,进程管理 安装:pip install psutil 1. ...