【问题标题】:What is optimum thread pool size for simple program running cpu based tasks in Java在 Java 中运行基于 cpu 的任务的简单程序的最佳线程池大小是多少
【发布时间】:2012-10-08 16:51:19
【问题描述】:

我使用线程池来执行任务,这些任务主要基于 cpu 并带有一些 I/O, 大小比 cpu 的数量大一。

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)

假设一个简单的程序将其所有任务提交给这个执行程序并且几乎没有做其他事情,我认为拥有一个更大的线程池会减慢速度,因为操作系统必须更频繁地对它的 CPU 进行时间切片,从而有机会给线程池中的每个线程一个跑步的机会。

这是正确的,如果是这样,这是一个真正的问题还是主要是理论上的问题,即如果我将线程池大小增加到 1000,我会注意到一个巨大的差异。

【问题讨论】:

  • 没有通用的“最佳线程池大小”之类的东西,也没有最佳的其他东西。你必须试试看。测试和测量。不是一个真正的问题。
  • 我知道有人会这么说,但我认为我已经明确指定了用例并且我试图建立线程池如何工作的功能,下面给出的答案更有用。
  • 查看这些以前的答案stackoverflow.com/questions/4049498/…
  • 查看这些以前的答案stackoverflow.com/questions/4049498/…

标签: java concurrency threadpool executor


【解决方案1】:

如果您有 CPU 密集型任务,当您增加线程数时,您会增加开销并降低性能。注意:线程多于等待任务只是浪费资源,但可能不会减慢任务的速度。

我会使用 CPU 数量的倍数(例如 1 或 2),而不是只添加一个,因为线程过多会产生惊人的开销。

【讨论】:

  • 谢谢,但不明白你的最后一行,当然使用倍数而不是仅仅添加一个会产生更多线程,因此会产生更多开销。
  • 如果你有 9 个任务和 8 个 cpu,为了获得公平的调度,每个 cpu 需要被不同的任务中断,或者你得到一个 cpu 有两个任务,这意味着完成它们的总时间一切都翻了一番。如果您有 16 个任务,则可以通过每个 cpu 有一对任务来公平使用 8 个 cpu,这会减少对缓存的破坏,并且更坏的情况下时间差别不大。
  • 好吧,就我而言,我的任务可能比 cpus 多得多,假设 1000,这种情况还成立吗?
  • 它不是任务数量,而是它必须在你的 cpu 之间公平调度的活动线程数量。
  • 对不起,当然,我可以看到调度看起来更公平,你是说在实现中一个特定的线程总是绑定到特定的 cpu,所以一旦线程 9 在 cpu x 上运行一次然后cpux 将始终运行线程 9 以及它首先运行的任何线程。
【解决方案2】:

作为参考,请查看此说明。

http://codeidol.com/java/java-concurrency/Applying-Thread-Pools/Sizing-Thread-Pools/

简而言之,平均而言,您所拥有的(CPU + 1)是最优的。

【讨论】:

  • 谢谢你,这个链接写得非常好。
  • 正如链接所述,最优值是 N_CPU 的 倍数。值得注意的是,您的应用程序将有其他线程和少量 IO 仍在使用 CPU。
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
  • 2014-04-12
  • 2020-05-02
  • 1970-01-01
  • 2016-09-01
  • 2010-11-29
相关资源
最近更新 更多