ThreadPoolTask Executor中corePoolSize和maxPoolSize的理想值应该是什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThreadPoolTask Executor中corePoolSize和maxPoolSize的理想值应该是什么相关的知识,希望对你有一定的参考价值。

当我们每秒获得200个请求时,线程之间的资源没有任何依赖性。

我们目前正在使用以下代码

@Bean
    public ThreadPoolTaskExecutor getTaskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        int maxPoolSize = 1;
        if(Runtime.getRuntime().availableProcessors()-4>1){
            maxPoolSize = Runtime.getRuntime().availableProcessors()-4;
        }
        taskExecutor.setMaxPoolSize(maxPoolSize);
        System.out.println("Thread pool size SaveThread : "+taskExecutor.getMaxPoolSize());
        taskExecutor.setDaemon(true);
        taskExecutor.setThreadNamePrefix("SaveThread-");
        taskExecutor.initialize();
      return taskExecutor;
     }
答案

对于粗略估计,您可以考虑以下公式:

number_of_threads =(request_processing_time_ms / 1000)* number_of_request_to_handle

示例:您在30ms内处理请求。要处理200个请求/秒,您需要大约6个线程+一些缓冲区。

你还需要考虑:

  • 此解决方案不能线性扩展(因为context switching
  • 处理请求时间的分配(统计上)
  • gc暂停
  • 机器上的其他进程
  • 等等

最好的方法是设置从其他机器执行的性能测试,而不是运行软件。

以上是关于ThreadPoolTask Executor中corePoolSize和maxPoolSize的理想值应该是什么的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中创建不同的 ThreadPoolTask​​Executor? [复制]

logback 不会将异常记录到从 ThreadPoolTask​​Executor 池线程抛出的文件中

ThreadPoolTask Executor中corePoolSize和maxPoolSize的理想值应该是什么

OpenShift 中的 Spring 批处理 JDBCPagingItemReader、ThreadPoolTask​​Executor 和多个 pod

Spring ThreadPoolTask Executor自动装配不同的实例

ThreadPoolTask Scheduler不适用于线程池