博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DUBBO Thread pool is EXHAUSTED! 的问题
阅读量:7081 次
发布时间:2019-06-28

本文共 2615 字,大约阅读时间需要 8 分钟。

hot3.png

 

先来看看这个异常日志样子

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 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。

配置如:

配置标签

<dubbo:provider/>
<dubbo:protocol/>

例:

<!-- 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值 -->
<dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000" />

项目中的配置如下:

 

二、 优化系统业务逻辑

要优化业务逻辑就要先定位问题点,其实就是找问题产生的原因。

 

 

对线程状态进行分析。线程状态如下所示: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)

通查找这个来确定问题点

 

这样基本就确定了问题点了。剩下的就是去优化她。

 

 

转载于:https://my.oschina.net/lenglingx/blog/1590127

你可能感兴趣的文章
递归调用例题
查看>>
风险控制的三种实践
查看>>
redis***事件
查看>>
我的友情链接
查看>>
python之psutil模块
查看>>
Python开发必学课程知多少?
查看>>
亚洲CIO关注的新热点:BI、移动、云计算
查看>>
G1通过笔记本无线网卡共享上网的方法
查看>>
XX校区×××和RADIUS服务的搭建部暑设计
查看>>
Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化
查看>>
我是不是在浪费生命?
查看>>
使用droppable插件实现对象的放置操作 8-2
查看>>
dedecms安装日志
查看>>
权限、列表、排序、搜索
查看>>
Telnet在Windows7下的安装
查看>>
k8s部署自己的web平台
查看>>
Aspect 使用崩溃记录
查看>>
bash变量
查看>>
***测试者的基本技能
查看>>
服装零售业变革 电商下水道VS传统下坡路
查看>>