记录一次大量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 里头的分析过程有 ...
随机推荐
- Exp5 MSF基础应用 20164314
一.实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.一个主动攻击实践,如ms08_067; (成功) 2.一个针对浏览器的攻击,如ms1 ...
- CentOS 6.6 系统升级到 CentOS 6.7
1.利用Centos6.7 ISO镜像挂载为本地镜像 创建一个挂载目录 CentOS 6.6 系统升级到 CentOS 6.7 mkdir /mnt/data 2.挂载镜像(远程镜像) mount - ...
- S2-045漏洞初步分析
0x01 前言 前几天刚分析完s2-032这个漏洞,今天又爆发了一个s2-045的漏洞,又是直接的命令执行,影响了struts2绝大多数的版本. 官方给的漏洞公告在这里 https://cwiki ...
- ”dpkg: 处理归档 /var/cache/apt/archives/XXXXXX(--unpack)时出错“的解决方法
在安装ROS时出现了下面的问题: 解决方法: sudo dpkg -i --force-overwrite <filename> 在我的问题中我的解决方法是: sudo dpkg -i - ...
- vue项目中遇到的那些事。
前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...
- tomcat用redis做session共享
在context.xml添加以下配置: <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerVa ...
- Docker-----常见问题
docker中删除dead状态的容器 其现象如下:docker ps -a docker rm ytn删除时报错如下:解决方法: 先查出其进程,kill掉,在进行删除 查 ,复制上图白底部分,用以下命 ...
- put your hands up PHPLFI +CVE
当时做了''一年'',都没做出来,hint了一个PHPLFI,我就懵了,任意文件上传怎么和PHPLFI结合呢,还是要看的多,做的多,才有那种感觉. 习惯性查看源码 CVE-2017-12615,PUT ...
- Python爬虫基础之requests
一.随时随地爬取一个网页下来 怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等.我们之前 ...
- 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.m
Windows服务中程序发布之后会如下错误: 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“Syste ...