`

httpclient连接池相关参数的坑

阅读更多

 

今天早上UIOC,现象是发现调用某个服务的接口总是超时,这个环境昨晚没有发版本无缘无故就出问题很是奇怪。到公司各种查,最终通过问题服务重启前打印的堆栈信息看到几乎所有的线程都在等待连接池释放连接后获取空闲连接。错误如下:

"xxxxxxxxxxxxx" prio=10 tid=0x00007f6b7c002800 nid=0x40ff waiting on condition [0x00007f6b37020000]

java.lang.Thread.State: TIMED_WAITING (parking)

at sun.misc.Unsafe.park(Native Method)

- parking to wait for <0x00000000f97918b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)

at java.util.concurrent.locks.LockSupport.parkUntil(LockSupport.java:239)

at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitUntil(AbstractQueuedSynchronizer.java:2072)

at org.apache.http.pool.PoolEntryFuture.await(PoolEntryFuture.java:129)

at org.apache.http.pool.AbstractConnPool.getPoolEntryBlocking(AbstractConnPool.java:281)

at org.apache.http.pool.AbstractConnPool.access$000(AbstractConnPool.java:62)

at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:176)

at org.apache.http.pool.AbstractConnPool$2.getPoolEntry(AbstractConnPool.java:172)

at org.apache.http.pool.PoolEntryFuture.get(PoolEntryFuture.java:100)

at org.apache.http.impl.conn.PoolingClientConnectionManager.leaseConnection(PoolingClientConnectionManager.java:212)

 

问题已经很明显,因为使用了连接池,但连接不够用,造成大量的等待,后面的请求获取不到连接所以最终超时,并且这种等待都有滚雪球的效应。

问题原因主要因为我们对httpclient连接池参数设置不合理造成,我们使用的是httpclient4.4.1,除了连接超时和响应超时这两个参数之外,和连接池相关的两个参数如下:

1、MaxtTotal:整个连接池的大小

2、DefaultMaxPerRoute:根据连接到的主机对MaxTotal的一个细分

比如:MaxtTotal=400 DefaultMaxPerRoute=200

只连接到http://x.com时,到这个主机的并发最多只有200;而不是400;

连接到http://x.com 和 http://y.com时,到每个主机的并发最多只有200;即加起来是400(但不能超过400),所以起作用的设置是DefaultMaxPerRoute。

 

之前一直对线程池和连接池有点混淆,总结一下:

线程池和连接池(http连接池或db连接池)概念上其实是一样的,反复创建都要消耗系统资源,所以才需要使用池保存起来反复使用。针对使用tomcat容器的场景,tomcat工作线程池中每个运行线程都在处理一个upstream请求,需要访问第三方接口或DB时,都是从对应池中取连接进行同步请求操作(一般情况不会另外启动一个线程来异步请求第三方接口或DB)。同步请求操作中(请求发出后),tomcat工作线程会切换到等待状态(WAITING),等请求响应返回后,操作系统再根据调度算法,最终唤醒线程并切换到运行状态(RUNNABLE),如果同步请求操作(访问第三方接口或DB)响应很快,这个线程两次上下文切换(context switch)也是很快的,用jstack几乎是看不到中间状态。

 

相关链接:

使用httpclient必须知道的参数设置及代码写法、存在的风险

http://jinnianshilongnian.iteye.com/blog/2089792

0
0
分享到:
评论

相关推荐

    httpclient获取目标网站内容,get、post方式(可运行)

    httpclient获取目标网站内容,get、post方式(可运行),可以通过配置参数、配置连接池实现

    Java NIO+多线程实现聊天室

    HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子指标 内置锁 竣工服务 log4j+slf4j日志 实现的功能 登录注销 单聊 群聊 客户端提交任务,下载图片并显示 上线下线公告 在线用户记录 批量下载豆瓣电影的...

    custom-http:基于httpclient自定义http请求工具类

    1、http连接池。2、可配置正向代理。3、可配置忽略https中CA用户证书认证。4、提供form表单和body两种方式请求。包含功能 1、简便连接网关。2、连接第三方机构。 使用说明 工具类 CustomReqUtil(主调工具类) 工具...

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    - HttpClient连接池 - Spring依赖注入 - lombok简化POJO开发 - 原子变量 - 内置锁 - CompletionService - log4j+slf4j日志 - 实现的功能 - 登录注销 - 单聊 - 群聊 - 客户端提交任务,下载图片并显示 -...

    基于SpringMVC的一个web框架

    1.0.5 从web项目迁移成maven项目 1.0.6 增加菜单框架ext实现,类路径调整 1.0.7 ...1.0.8 socket工具类,权限组件,菜单组件,jdbc分页支持多种数据库,ant路径工具类,增加jquery easyUI ...使用数据库连接池druid dubbo使用

    基于Spring MVC的web框架 1.1.11

    使用数据库连接池druid dubbo使用 1.1.11 集成Spring Cache,FastJson Spring Cache增加redis缓存实现 Mybatis使用二级缓存,增加redis实现 增加reactJs 增加Mybatis插件pageHelper,Mapper doc内有相关文档

    一个可以直接运行的基于SpringMVC的web框架1.1.12

    使用数据库连接池druid dubbo使用 1.1.11 集成Spring Cache,FastJson Spring Cache增加redis缓存实现 Mybatis使用二级缓存,增加redis实现 增加reactJs 增加Mybatis插件pageHelper,Mapper 1.1.12 使用draft富文本编辑...

    可以直接运行的基于SpringMVC的web框架示例,也可以直接当公司框架

    使用数据库连接池druid dubbo使用 1.1.11 集成Spring Cache,FastJson Spring Cache增加redis缓存实现 Mybatis使用二级缓存,增加redis实现 增加reactJs 增加Mybatis插件pageHelper,Mapper 1.1.12 使用draft富文本编辑...

    apache-commons源码及jar文件

    Commons-DBCP 提供数据库连接池服务 DbUtils DbUtils 是一个 JDBC helper 类库,完成数据库任务的简单的资源清除代码. Digester Commons-Digester 是一个 XML-Java对象的映射工具,用于解析 XML配置文件. ...

    HTTP请求库java-requests.zip

    Java的世界里,HttpClient 是一个功能强大的Http请求库,然而接口非常复杂,设计上遵从正交性,简单的...如果使用了连接池,verify 和 proxy 需要在连接池中设置,Requests 中的设置无效。 标签:javarequests

    java开源包4

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包1

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包11

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包2

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包3

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包6

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包5

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包10

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包8

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包7

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

Global site tag (gtag.js) - Google Analytics