記一次線上dubbo服務超時和線程池滿問題排查


線上某dubbo服務A調用dubbo服務B的接口X方法,調用端A日志中出現了很多超時的情況,提供端B該接口X超時時間設置為60s;

查看提供端B的日志,報了很多線程池滿的異常:

Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-10.1.5.69:20914, Pool Size: 700 (active: 700, core: 700, max: 700, largest: 700), Task: 69117 (completed: 68417), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://10.1.5.69:20914!
        at com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport.rejectedExecution(AbortPolicyWithReport.java:53) ~[dubbo-2.5.4.2.jar:2.5.4.2]
        at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:821) [na:1.7.0_79]
        at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1372) [na:1.7.0_79]

服務B部署了4個節點,僅1個節點有線程池滿情況;

服務B的dubbo配置如下,線程池固定700個線程:

<dubbo:protocol name="dubbo" port="xxx" dispatcher="all" threadpool="fixed" threads="700" />

 

通過ps aux | grep 服務B的jmx端口號,查到進程pid;

通過jstack pid > jstatck.log dump出jstack日志文件;

vi打開該文件,搜索BLOCKED關鍵字:

"DubboServerHandler-10.1.5.69:20914-thread-134" daemon prio=10 tid=0x00007f32fc033000 nid=0x4e36 waiting for monitor entry [0x00007f32e8f31000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:112)
        - waiting to lock <0x0000000780066ae0> (a org.apache.tomcat.jdbc.pool.DataSource)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102)
        at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126)
        at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)

發現是很多的線程是阻塞在獲取數據庫連接;

工程使用了阿里開源的druid數據庫連接池,獲取連接超時時間設置的30s;

X方法並沒有查詢數據庫,而是服務B中的其它方法查詢了數據庫;

那么線程池滿原因大概清楚了:當其它服務調用服務B中查詢數據庫的方法,因方法獲取連接超時,線程處理速度慢所以逐漸堆積,最終導致線程池滿。

 

服務B使用了阿里雲的RDS數據庫,4個節點僅一個節點連接超時。而之前連接都是正常的。

 

跟運維同學反饋溝通,工程中配置的數據庫連接用的ip,通過VPN做了路由轉發的。

昨天下午該節點虛擬機維護,關閉並重啟過;檢查發現路由規則配置,沒有設置開機啟動;

配置規則,並添加到開機啟動。

 

問題解決:)

------------------------------------------------------------------------------------------------------------------------------

參考:

dubbo Thread pool is EXHAUSTED-故障排除 https://blog.csdn.net/lsm135/article/details/77712130

Dubbo線程池耗盡異常原理分析RejectedExecutionException:Thread pool is EXHAUSTED https://www.aliyun.com/jiaocheng/791713.html

dubbo線程池溢出解決 https://blog.csdn.net/shaoyingchendsg/article/details/77551159


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM