使用多个执行程序时,理想/最佳线程池大小是多少?

时间:2017-12-16 12:38:35

标签: java multithreading concurrency

从很多帖子我都可以看到有关最大池大小的公式,这取决于CPU + 1的数量。这是一个明确的解释。

但是,如果应用程序定义了许多Executor或ThreadPoolExecutor,该怎么办?然后我们还必须考虑应用程序共享相同的硬件。这对池大小选择有何影响。

我们需要计算全局大小和它取决于定义的线程池数量的除法吗?

1 个答案:

答案 0 :(得分:2)

nosCPUs + 1"经验法则"假设线程将受CPU限制(不受I / O限制),并且不会出现明显的锁争用。这对于典型应用来说是不现实的。

如果您有多个线程池,则还必须考虑相应池中的线程是否将同时处于忙碌状态。

  • 如果它们是并且之前的假设适用于所有池,那么nosCPUs + 1规则可以全局应用;即所有池的大小之和。

  • 否则,找出预测池最佳大小的公式很可能太复杂了。

实际上,典型的多线程应用程序的行为非常复杂,nosCPUs + 1规则不能提供最佳的线程数。此外,您通常无法推导出能够准确预测最佳线程数的公式。

相反,通常的做法是使线程池大小/大小成为可调参数或属性,并调整它们以获得典型工作负载的良好性能。如果您的应用程序只有一个线程池,它将使调优更容易,但可能有理由不这样做。

但好消息是,有点太大的有界线程池的性能影响通常不大。当池大小太大时出现问题(内存使用,争用,上下文切换等)。