先來看看這個異常日誌樣子
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官網上的線程模型的內容
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工作端口
2 : 使用jstack 進程號 導出信息
jstack 'pid' > t.log
3 : 查看導出新中的信息
vim t.log
這裡查看有許多關鍵字來幫助確認如:
DubboServerHandler-192.168.10.117:9491-thread-111
java.lang.Thread.State: BLOCKED (on object monitor)
通查找這個來確定問題點
這樣基本就確定了問題點了。剩下的就是去優化她。
tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=2284732365
閱讀更多 JAVA小酷 的文章