场景:dubbo 线程池耗尽,报错。
Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-XX.XX.XX.XX:XXXX, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 39522284 (completed: 39422084), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://XX.XX.XX.XX:XXXX!
at com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport.rejectedExecution(AbortPolicyWithReport.java:53)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler.received(AllChannelHandler.java:56)
dubbo 线程池配置参数:
属性 | 默认 | 备注 |
---|---|---|
threadpool | fixed | 线程池类型,可选:fixed/cached |
threads | 200 | 服务线程池大小(固定大小) |
accepts | 0 | 服务提供方最大可接受连接数 |
dispatcher | all | 协议的消息派发方式,用于指定线程模型,比如:dubbo协议的all, direct, message, execution, connection等 |
dubbo 默认的线程池是固定大小的线程池。
- fixed固定大小线程池,启动时建立线程,不关闭,一致持有。
- cached 缓存线程池,空闲一分钟,线程会消费,需要时重新创建新线程。
Dispatcher
- all
所有消息都派发到线程池,包括请求、响应、连接事件、断开事件、心跳等。
- direct
所有消息都不派发到线程池,全部在IO线程上直接执行。
- message
只有请求响应消息派发到线程池,其他连接断开事件、心跳等消息,直接在IO线程上执行。
- execution
只请求消息派发到线程池,不含响应,响应和其他连接断开事件、心跳等消息,直接在IO线程上执行。
- connection
在IO线程上,将连接断开事件放入队列,有序逐个执行,其他消息派发到线程池。
出现dubbo 线程池耗尽,一般推荐性能调优是。 dubbo 协议消息分派方式是message,并调大线程池大小。
比如:
<dubbo:protocol name="dubbo" dispatcher="message" threads="500" threadpool="fixed"/>