我正在使用多线程框架(Apache Tomcat(,并且编写我自己的服务(在资源内部(,该服务使用固定的线程池大小(Java ExecutorService
(来运行其任务。
如何确定相对于框架或其他服务的池的理想池大小?
如上所述,线程池大小没有固定的规则。但是,根据您的用例,可以使用一些建议或最佳实践。
CPU 密集型任务
对于 CPU 密集型任务,Goetz (2002, 2006( 建议
线程数 = CPU 数 + 1
IO 绑定任务
为 IO 绑定任务计算出最佳数量不太明显。在 IO 绑定任务期间,CPU 将保持空闲状态(等待或阻塞(。此空闲时间可以更好地用于启动另一个 IO 绑定请求。
Subramaniam(2011,第31页(根据以下公式描述了最佳线程数。
threads = number of cores * (1 + wait time / service time)
生产环境(生产硬件等(的 Web 容器中运行具有代表性工作负载的应用程序,则无法确定"理想"池大小。
换句话说,将池大小设置为配置参数并对其进行调整。
如果您在同一个 Web 容器中运行多个应用程序,则需要一起调整它们。
我没有给你一个明确的建议或公式的原因是,最佳池大小将高度依赖于应用程序的性质和工作负载。 有一些公式据说适用于理想化的任务,但它们不太可能比"第一近似"更好。