問題:
dubbo線程池耗盡,活躍線程數超過線程池最大線程數(dubbo默認線程池最大線程數為200)
登錄服務提供者所在服務器
通過命令行連接dubbo:
//telnet 服務提供者ip dubbo端口 telnet 20.1.16.26 20881
查看dubbo活躍線程:
status -l
可以通過增加線程池最大線程數來解決:
<dubbo:provider timeout="50000" threadpool="fixed" threads="500" accepts="1000" /> timeout="5000":設置遠程調用服務的超時時間為5000毫秒 threadpool="fixed":線程模型為固定大小的線程池,啟動時建立線程,不關閉,一直持有 threads="500":線程數為500 accepts="1000":限制服務器端的接受的連接的最大值為1000
導致原因:
服務提供者數據源連接池最大連接數300,提供者數據庫連接池連接數在高峰時已經超過最大連接數,導致服務調用響應速度非常慢,請求全部超時,而dubbo請求超時是針對客戶端的,客戶端阻塞的線程報錯拋出超時異常,而此時服務端的線程不會拋超時異常,服務端線程不會釋放,而是繼續執行,然后根據默認的重試機制,再次發起請求,服務端再次從線程池拿線程處理請求,循環往復,服務端dubbo的線程長時間保持連接,一直未釋放,越來越多,導致活躍線程超過最大線程數,最終報出線程池滿的異常