【问题标题】:Ideal thread pool size in other multi-threaded framework其他多线程框架中的理想线程池大小
【发布时间】:2017-06-18 21:47:41
【问题描述】:

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

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

【问题讨论】:

  • 在 Apache Tomcat 中是否有一些您可以搭载的通用线程池?线程池是一个相当重量级的东西。在没有那么多额外任务要运行的情况下,使用一个可能有点过头了。
  • @HoriaComan 我同意这是最好的解决方案。我实际上对您无法做到的理论情况感兴趣

标签: java multithreading threadpool executorservice


【解决方案1】:

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

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)

【讨论】:

  • 然而,OP 不太可能应用这些公式,因为:1) 他实际上有多个池要考虑,2) 请求可能是 CPU 和 I/ O在不同时间绑定
【解决方案2】:

如果不在具有代表性工作负载的生产环境(在生产硬件等上)的 Web 容器中运行应用程序,则无法确定“理想”池大小。

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

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


我没有给你一个明确的建议或公式的原因是最佳池大小将高度依赖于你的应用程序的性质和你的工作量。有一些公式据说适用于理想化的任务,但它们不太可能比“第一个近似值”更好。

【讨论】:

    猜你喜欢
    • 2022-12-29
    • 2016-09-01
    • 2013-04-14
    • 2013-08-05
    • 2015-09-30
    • 2023-03-30
    • 2023-03-30
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多