Какими должны быть идеальные значения corePoolSize и maxPoolSize в ThreadPoolTaskExecutor - PullRequest
0 голосов
/ 04 января 2019

, когда мы получаем 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;
     }

1 Ответ

0 голосов
/ 04 января 2019

Для грубой оценки вы можете рассмотреть следующую формулу:

number_of_threads = (request_processing_time_ms / 1000) * number_of_request_to_handle

Пример: вы обрабатываете запрос в течение 30 мс. Для обработки 200 запросов / с вам потребуется около 6 потоков + некоторый буфер.

Вам также необходимо учитывать:

  • это решение не масштабируется линейно (из-за переключения контекста )
  • распределение времени обработки запроса (статистически)
  • паузы gc
  • другие процессы на машине

Лучший способ - настроить некоторые тесты производительности, выполняемые на другом компьютере, а не на вашем программном обеспечении.

...