DUBBO Thread pool is EXHAUSTED! 的问题
2017-12-15 00:00
337 查看
先来看看这个异常日志样子
一句话,dubbo的线程池满了,用完了。怎么解决,1:修改dubbo的连接池中的大小; 2:优化系统业务逻辑,但是问题就要先找到那线程的干活的他占用了,要先找到才能优化。
一、 修改dubbo的线程池大小
方法1:调整dubbo.properites的配置
方法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" />
项目中的配置如下:
二、 优化系统业务逻辑
要优化业务逻辑就要先定位问题点,其实就是找问题产生的原因。
如何找出JAVA应用中占用CPU的代码
高手是怎么使用jstack精确找到异常代码的
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)
通查找这个来确定问题点
这样基本就确定了问题点了。剩下的就是去优化她。
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=200 dubbo.service.max.thread.pool.size=200
方法2: 修改项目中的具体
项目的实际配置:
<dubbo:provider timeout="50000" threadpool="fixed" threads="500" accepts="1000" />
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:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />
配置标签
<dubbo:provider/>
<dubbo:protocol/>
例:
<!-- 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值 -->
<dubbo:provider timeout="10000" threadpool="fixed" threads="100" accepts="1000" />
项目中的配置如下:
<!-- Application name --> <dubbo:application name="xxpaymer" /> <dubbo:registry address="${zk.address}" file="${zk.dubbo.file}" /> <dubbo:protocol name="dubbo" port="9491" /> <dubbo:provider retries="1" timeout="20000" /> <!-- 注册服务 --> <dubbo:service interface="com.xxpay.paymer.api.server.IMerService" ref="merService" version="${zk.merService.version}" /> <!-- 注册业务员服务 --> <dubbo:service interface="com.xxpay.salesman.api.server.ISalesmanService" ref="salesmanTotalService" version="${zk.salesmanTotalService.version}" > <dubbo:method name="setSalesmanData" async="true" return="false"></dubbo:method> <dubbo:method name="setTotalGatheingExpendData" async="true" return="false" ></dubbo:method> <dubbo:method name="deleteSalesmanDataExpend" async="true" return="false"></dubbo:method> <dubbo:method name="setSalesmanDataBack" async="true" return="false"></dubbo:method> <dubbo:method name="deleteSalesmanDataBack" async="true" return="false"></dubbo:method> </dubbo:service> <!-- 注册用户服务 --> <dubbo:service interface="com.xxpay.authority.api.server.IUserService" ref="userService" version="${zk.authority.version}" /> <!-- 注册资源服务 --> <dubbo:service interface="com.xxpay.authority.api.server.IResourceService" ref="resourceService" version="${zk.authority.version}" /> <!-- 引用API服务 --> <dubbo:reference id="inDealService" interface="com.xxpay.payapi.core.IInDeal" check="${zk.check}" version="${zk.inDealService.version}"/> <dubbo:reference id="iQueryService" interface="com.xxpay.payapi.core.IQueryDeal" check="${zk.check}" version="${zk.iQueryService.version}"/> <dubbo:reference id="outDealService" interface="com.xxpay.payapi.core.IOutDeal" check="${zk.check}" version="${zk.outDealService.version}"/>
二、 优化系统业务逻辑
要优化业务逻辑就要先定位问题点,其实就是找问题产生的原因。
如何找出JAVA应用中占用CPU的代码
高手是怎么使用jstack精确找到异常代码的
对线程状态进行分析。线程状态如下所示: 1) 死锁,Deadlock(重点关注) 2) 执行中,Runnable 3) 等待资源,Waiting on condition(重点关注,等待什么资源) 4) 等待获取监视器,Waiting on monitor entry(重点关注) 5) 暂停,Suspended 6) 对象等待中,Object.wait() 或 TIMED_WAITING 7) 阻塞,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)
通查找这个来确定问题点
这样基本就确定了问题点了。剩下的就是去优化她。
相关文章推荐
- Dubbo线程池耗尽异常原理分析RejectedExecutionException:Thread pool is EXHAUSTED
- DUBBO Thread pool is EXHAUSTED!
- dubbo Thread pool is EXHAUSTED-故障排除
- 关于dubbo使用过程中抛出【java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED!】的思考
- [DUBBO] Thread pool is EXHAUSTED! 关于duboo provider并发限流的错误及解决方案
- 高并发下hystrix熔断超时及concurrent.RejectedExecutionException: Rejected command because thread-pool queueSize is at rejection threshold问题
- Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name:
- Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name:
- ThreadPool.QueueUserWorkItem的性能问题
- 关于Scope 'session' is not active for the current thread的问题
- java线程池以及newCachedThreadPool使用过程中的问题
- Whether Thread Pool is Needed for You?
- Spring中ThreadPoolTaskExecutor的线程调度及问题
- ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题
- ThreadPool.QueueUserWorkItem的性能问题
- mysql thread pool 问题排查
- Whether Thread Pool is Needed for You?
- ThreadPool.QueueUserWorkItem的性能问题
- [转]ThreadPool.QueueUserWorkItem的性能问题
- 崩溃问题:iOS9 This application is modifying the autolayout engine from a background thread, which