这可能是更一般的问题,关于如何决定线程池的大小,但让我们使用Spring ThreadPoolTaskExecutor
这种情况。对于池核心和最大大小以及队列容量,我有以下配置。我已经阅读了所有这些配置的含义 - 有一个很好的答案here。如何决定ThreadPoolTaskExecutor池和队列大小?
@SpringBootApplication
@EnableAsync
public class MySpringBootApp {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(MySpringBootApp.class, args);
}
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(25);
return executor;
}
}
上述数字对我来说是随机的,我想了解如何根据我的环境正确设置它们。我将概述如下约束,我有:
- 应用程序将在双核CPU箱
- 执行人将在这通常需要大约1-2 秒完成任务的工作运行。
- 通常我想到800/min的任务提交给我的遗嘱执行人,在2500 /分钟
- 任务将构建一些对象,使一个HTTP调用谷歌发布订阅扣球。
理想情况下,我想了解我需要考虑,并根据他们什么将是我的游泳池和队列大小进行合理的配置还有什么其他的限制。
您预计在任何特定时刻您会排队提交多少任务?即提交到您的游泳池的任务的速度是多少?无论如何,我会建议你阅读https://www.infoq.com/articles/Java-Thread-Pool-Performance-Tinging – Sneh
@Sneh通常约800 /分钟,但在高峰时间可能会达到2500 /分钟! –
可能需要补充说明的是,应用程序有两个应用程序可以处理这个负载,这两个应用程序都在2核CPU的机器上运行。 –