其他多线程框架中的理想线程池大小

Ideal thread pool size in other multi-threaded framework

我正在使用多线程框架 (Apache Tomcat),并且 编写我自己的服务(在资源内),该服务使用固定的线程池大小 (Java ExecutorService) 以便 运行 它的任务。

如何根据框架或其他服务的池确定理想的池大小?

在具有代表性工作负载的生产环境(在生产硬件等)的 Web 容器中没有 运行 应用程序的情况下,无法确定 "ideal" 池大小。

换句话说,将池大小作为配置参数并对其进行调整。

如果您的 运行 多个应用程序在同一个 Web 容器中,则需要将它们一起调整。


我没有给您明确的建议或公式的原因是最佳池大小将在很大程度上取决于您的应用程序的性质和您的工作负载。有一些公式据说适用于理想化的任务,但它们不太可能比 "first approximation".

更好

如上所述,线程池大小没有固定规则。但是可以根据您的用例使用一些建议或最佳实践。

CPU绑定任务

对于 CPU 绑定任务,Goetz (2002, 2006) 推荐

线程 = CPU 的数量 + 1

IO 绑定任务

计算出 IO 绑定任务的最佳数量不太明显。在 IO 绑定任务期间,CPU 将处于空闲状态(等待或阻塞)。这段空闲时间可以更好地用于发起另一个 IO 绑定请求。

Subramaniam (2011, p.31) 根据以下公式描述了最佳线程数。

threads = number of cores * (1 + wait time / service time)