線上bug導致tomcat 線程池堆積
事情經過
今天早上項目搜索頁偶現504 頁面!
馬上查看線上日誌 發現大量的 ConnectionTimeOut 異常.
裏面跟蹤下代碼
RequestConfig config = RequestConfig.custom().setConnectTimeout(10000).setSocketTimeout(10000).build();
ConnectionTimeOut 居然是10s
這個時候能確定2個問題:
- 第三方接口存在不可用情況
- 自身應用timeout設置過長
難道就是這個原因導致的?
仔細分析了下 發現 出現ConnectionTimeOut異常的地方並
不是搜索頁的功能.而是一個依賴於第三方接口用戶綁定功能.
這個時候很迷惑了.
到底是什麼原因呢?
查看線程堆棧
通過查看線程堆棧
發現大量的線程都wait在httpGet在第三方接口上
我們看下線程樹
發現一共有920上下的線程數目
我們在來看下容器(tomcat)的線程數
容器處理請求的線程數最大是1000個.
這個時候我們就可以大膽猜測
就是大量的第三方接口請求
導致耗光了容器的線程池.所以其他請過過來,
只能等待線程池中資源釋放 才能正常處理.
驗證
- 修改connectionTimeOut時間爲1000
- 重啓應用
ok 業務恢復正常了。線程數也降下來了