今天早上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
相关推荐
创建HttpClient实例时,我们需要设置连接池参数。`PoolingHttpClientConnectionManager`是HttpClient的连接池管理器,它可以管理连接的创建、复用和关闭。我们可以通过`PoolingHttpClientConnectionManager....
《连接池实现原理及效率测试》 连接池是数据库应用中的一个重要概念,它在系统设计中扮演着提高性能、优化...在实际开发中,我们需要根据项目需求,合理配置连接池参数,选择高效的连接池实现,以实现最佳的系统性能。
除了基本的连接配置,还可以通过`HikariConfig`类的其他方法设置更多的连接池参数,如连接超时、最大连接数、最小空闲连接数等。 如果你的应用程序使用了JPA或MyBatis等持久层框架,Spring Boot会自动配置这些框架...
4. **HttpClient连接池管理** - HttpClient默认使用长连接,Tomcat中,默认的最大长连接时间为`connectionTimeout`。 - 如果手动调用`releaseConnection`,在`ManagedClientConnectionImpl`中会关闭socket,而如果...
此外,合理设置连接超时、重试策略、连接池大小等参数也能显著提升性能。 九、与其他库的集成 HttpClient可以方便地与Spring框架、JUnit测试等结合使用,提供HTTP服务调用的能力。 总结,HttpClient 3.1 JavaDoc ...
- 对于高并发场景,应适当调整连接池参数,如最大连接数、超时时间等。 HttpClient 4.5.5 作为一个成熟的 HTTP 客户端库,不仅提供了丰富的功能,还具有良好的可扩展性和灵活性。开发者可以根据具体需求对其进行...
`commons-httpclient`库还支持HTTPS、代理服务器、连接池、Cookie管理、重定向处理、身份验证等多种功能。开发者可以通过设置各种配置参数来定制HTTP请求的行为,以适应不同的网络环境和应用需求。 在`commons-...
6. **Connection Management**:HttpClient提供了连接池管理,可以复用已建立的连接,提高性能。`PoolingHttpClientConnectionManager`是实现连接池的主要类。 7. **Redirect Handling**:HttpClient可以处理重定向...
HttpClient 4.2.1是该项目的一个稳定版本,它包含了对HTTP协议的全面支持,包括基本的GET、POST请求,以及更复杂的重定向处理、Cookie管理、连接池等功能。 HttpClient 4.2.1版本引入了一些重要的改进和修复,以...
HttpClient 4.5引入了`PoolingHttpClientConnectionManager`,它负责管理连接池,自动回收和复用连接。通过配置最大连接数、每个路由的最大连接数以及连接超时等参数,可以有效控制资源使用。 4. **异步编程支持**...
HttpClient是Apache基金会开发的一个HTTP客户端库,广泛应用于Java编程中,用于执行...在实际应用中,根据项目需求,还可以进一步优化和扩展HttpClient的功能,比如使用连接池来提高性能,或者处理更复杂的认证机制。
10. **性能优化**:了解如何关闭不再需要的连接,使用合适的连接超时,以及配置合适的连接池大小,都是提高HttpClient性能的关键。 理解并熟练使用这些知识点,可以让你在使用Apache HttpClient处理HTTP请求时更加...
4. **性能优化**:合理配置连接池大小、超时时间、重试策略等参数,可以显著提升HttpClient的性能。 5. **线程安全**:HttpClient实例不是线程安全的,如果在多线程环境中使用,需要为每个线程创建独立的HttpClient...
- **连接管理器**:理解HttpClient中的HttpConnectionManager接口,以及它的实现类如PoolingHttpClientConnectionManager,学习如何设置连接池参数。 - **认证与安全性**:学习如何处理HTTP基本认证、摘要认证,...
4. **HttpClientBuilder**: 这是一个配置工具,通过链式方法可以方便地设置HttpClient的各种参数,如超时时间、重试策略、连接池大小等。 5. **HttpClientContext**: 提供上下文信息,存储与特定请求或会话相关的...
这通常通过`HttpClientBuilder`或者`HttpClients`类完成,可以配置连接池、超时、重试策略等参数。 3. **执行HTTP请求**:HttpClient支持GET、POST以及其他HTTP方法。例如,`HttpGet`用于GET请求,`HttpPost`用于...
在HttpClient中,你可以自定义请求头、处理重定向、管理cookies、使用身份验证以及实现连接池等功能。 以下是一些关于HttpClient 4.2.5的关键知识点: 1. **基本概念**: - **HttpClient实例**:创建HttpClient...
2. **连接管理**:HttpClient提供了一种机制来管理HTTP连接,包括连接池(PoolingHttpClientConnectionManager),它可以重用已建立的TCP连接,提高性能并减少网络延迟。 3. **请求与响应**:HttpClient通过...
3. **连接管理**:HttpClient提供了连接池功能,可以有效地管理HTTP连接,避免频繁创建和关闭连接,提高性能和效率。 4. **身份验证和安全性**:HttpClient支持多种身份验证机制,包括基本认证、摘要认证、NTLM等,...