java - 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)?
解决方案
如果没有关于工作负载类型、最大并发、突发和平均任务持续时间的更多信息,真的很难判断这里是否存在问题。
根据定义,只要将新任务添加到队列中,弹性调度程序就会创建无限数量的线程。
如果工作负载是突发性的,有规律的夜间并发,那么发现大量线程并不意外。您可以利用newElastic
变体来减少 TTL(默认为 60 秒)。
同样,如果没有更多信息,很难判断,但您的工作负载可能不适合此调度程序。如果您的工作负载受 CPU 限制,则并行调度程序更适合。弹性是为 IO/延迟绑定任务量身定制的。
推荐阅读
- linux - 如何通过 bash 向程序发送快捷方式?
- c# - 标题和 DATE.NOW 后的首字母缩略词
- java - 如何让计数器在android studio中递增
- python - random.seed AttributeError:模块“随机”没有属性“randrange”
- python - 如何集成 2 个 keras 模型输出?
- dictionary - 在地图中插入对
- python - beautifulsoup 得到一个 AttributeError:'NoneType' 对象没有来自 div 子文本的属性 'text'
- python - 具有softmax似然的多类分类
- php - 关系中的空值属于laravel?
- python-3.x - Python解释器与IDLE内存分配