今天出现一次dubbo的Thread pool exhausted导致服务不可用。根本原因是Mysql的慢查询。
1
| Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name...
|
RejectedExecutionException表示线程池已经达到最大值,并且没有空闲连,拒绝执行了一些任务。
Thread pool exhausted通常是min和max不一样大时,表示当前已创建的连接用完,进行了一次扩充,创建了新线程,但不影响运行。
原因可能是连接池不够用,可以在provider的配置文件中设置threads参数:
1
| <dubbo:provider port="20920" timeout="20000" threads="200"/>
|
如果线程池已经有200,还不够,通常是业务处理占用线程时间过长,
需优化业务,可通过jstack查看进程的状态,分析当前大多数线程都在干什么,从而分析出哪个地方是瓶颈,
比如,如果大部分线程都在处理SQL,可能是数据库连接不够,或数据源配置错误,或SQL没走索引等。
参考:
http://alibaba.github.io/dubbo-doc-static/FAQ-focusedCommentId=9633823.htm#FAQ-9.%E5%87%BA%E7%8E%B0java.util.concurrent.RejectedExecutionException%E6%88%96%E8%80%85Threadpoolexhausted%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F