DUBBO Thread pool is EXHAUSTED! 的問題

先來看看這個異常日誌樣子

Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-172.16.166.211:9491, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 165633 (completed: 165433), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://172.16.166.211:9491! at com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport.rejectedExecution(AbortPolicyWithReport.java:53) at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:768) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:656) at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.caught(AllChannelHandler.java:65) 

一句話,dubbo的線程池滿了,用完了。怎麼解決,1:修改dubbo的連接池中的大小; 2:優化系統業務邏輯,但是問題就要先找到那線程的幹活的他佔用了,要先找到才能優化。

一、 修改dubbo的線程池大小

方法1:調整dubbo.properites的配置

// 設成一樣大,減少線程池收縮開銷dubbo.service.min.thread.pool.size=200dubbo.service.max.thread.pool.size=200

方法2: 修改項目中的具體

項目的實際配置:

timeout="5000":設置遠程調用服務的超時時間為5000毫秒

threadpool="fixed":線程模型為固定大小的線程池,啟動時建立線程,不關閉,一直持有

threads="500":線程數為500

accepts="1000":限制服務器端的接受的連接的最大值為1000

再看看dubbo官網上的線程模型的內容

DUBBO Thread pool is EXHAUSTED! 的問題

Dispatcher

all 所有消息都派發到線程池,包括請求,響應,連接事件,斷開事件,心跳等。

direct 所有消息都不派發到線程池,全部在IO線程上直接執行。

message 只有請求響應消息派發到線程池,其它連接斷開事件,心跳等消息,直接在IO線程上執行。

execution 只請求消息派發到線程池,不含響應,響應和其它連接斷開事件,心跳等消息,直接在IO線程上執行。

connection 在IO線程上,將連接斷開事件放入隊列,有序逐個執行,其它消息派發到線程池。

ThreadPool

fixed 固定大小線程池,啟動時建立線程,不關閉,一直持有。(缺省)

cached 緩存線程池,空閒一分鐘自動刪除,需要時重建。

limited 可伸縮線程池,但池中的線程數只會增長不會收縮。(為避免收縮時突然來了大流量引起的性能問題)。

配置如:

配置標籤

例:

項目中的配置如下:

 

二、 優化系統業務邏輯

要優化業務邏輯就要先定位問題點,其實就是找問題產生的原因。

如何找出JAVA應用中佔用CPU的代碼

高手是怎麼使用jstack精確找到異常代碼的

對線程狀態進行分析。線程狀態如下所示:1) 死鎖,Deadlock(重點關注)2) 執行中,Runnable 3) 等待資源,Waiting on condition(重點關注,等待什麼資源)4) 等待獲取監視器,Waiting on monitor entry(重點關注)5) 暫停,Suspended6) 對象等待中,Object.wait() 或 TIMED_WAITING7) 阻塞,Blocked(重點關注)8) 停止,Parked

1 : 獲取進程號(ID)

通過 ps -ef |grep tomcat-xxx 或者 知道dubbo提供服務的端口來獲取進程ID。

ps -ef |grep tomcat-xxx ; ps -ef |grep xxx.jar ; netstat -anlp |grep 9491 9491為dubbo工作端口

DUBBO Thread pool is EXHAUSTED! 的問題

2 : 使用jstack 進程號 導出信息

jstack 'pid' > t.log

DUBBO Thread pool is EXHAUSTED! 的問題

3 : 查看導出新中的信息

vim t.log

這裡查看有許多關鍵字來幫助確認如:

DubboServerHandler-192.168.10.117:9491-thread-111

java.lang.Thread.State: BLOCKED (on object monitor)

通查找這個來確定問題點

DUBBO Thread pool is EXHAUSTED! 的問題

DUBBO Thread pool is EXHAUSTED! 的問題

這樣基本就確定了問題點了。剩下的就是去優化她。

tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=2284732365


分享到:


相關文章: