當前位置:
首頁 > 知識 > httpclient連接池相關參數的坑

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幾乎是看不到中間狀態。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

Android 基於 Speex 的高度封裝語音庫,0 耦合,沒三方jar包
echarts添加點擊事件

TAG:達人科技 |

您可能感興趣

機器學習特徵工程之皮爾森相關係數 pearson correlation of features
Meta Learning相關
Spring Boot 2.1.X整合最新版本Elasticsearch的相關問題
Android Wifi 連接相關流程
keepalived相關配置
VMware Horizon View Real-Time Audio-Video 相關配置
崔勝鉉 Ins Story更新及markgrotjahn Ins Story更新相關
在原有的nginx上面安裝Openresty和lua相關的模塊
廠商紛紛建議用戶暫停spectre和meltdown相關更新
Eur J Gastroenterol Hepatol:肝臟指數與心血管疾病發生風險間的相關性
蘋果bug大爆發!緊急修復iCloud相關服務 iTunes Store仍癱瘓...
Ghost開源博客Restful API相關介紹
關於索尼「Xperia XZ2 Premium」的相關信息
JAMA Otolaryngol Head Neck Surg:認知和年齡相關聽力損失相關性研究
關於Android Wifi掃描相關
《Nature Communications》:乳腺癌基因譜得以拓寬!新增110個相關基因!
蘋果修復大量iCloud相關服務 iTunes Store癱瘓
Kafka 源碼分析2 : Network 相關
蘋果bug大爆發!緊急修復iCloud相關服務 iTunes Store仍癱瘓……
Arthritis Rheumatol:血液補體裂解產物iC3b和血漿C3濃度與SLE疾病活動性相關