首页 > 解决方案 > Schedulers.elastic() 不使用早期生成的线程

问题描述

我在 spring-boot-2.0 上编写了 web-server,它在后台使用了 netty。此应用程序使用Schedulers.elastic()线程。

当它开始时,大约创建了 100 个弹性线程。这些线程很少使用,我们也很少加载。但是经过一个工作日后,elastic pool 中的线程数增加到了 1300 个。现在执行在 elastic-1XXX、elastic-12XX 线程上,(名称的数字在 100 甚至 900 以上)。

据我了解,Elastic 在底层使用 cachedThreadPool。为什么创建了新的弹性线程,为什么任务切换到新线程?

添加新趋势的标准是什么?为什么没有关闭旧线程(elastic-XX、elastic-1xx)?

标签: javaproject-reactor

解决方案


如果没有关于工作负载类型、最大并发、突发和平均任务持续时间的更多信息,真的很难判断这里是否存在问题。

根据定义,只要将新任务添加到队列中,弹性调度程序就会创建无限数量的线程。

如果工作负载是突发性的,有规律的夜间并发,那么发现大量线程并不意外。您可以利用newElastic变体来减少 TTL(默认为 60 秒)。

同样,如果没有更多信息,很难判断,但您的工作负载可能不适合此调度程序。如果您的工作负载受 CPU 限制,则并行调度程序更适合。弹性是为 IO/延迟绑定任务量身定制的。


推荐阅读