【问题标题】:Setting Ideal size of Thread Pool [duplicate]设置线程池的理想大小[重复]
【发布时间】:2013-04-14 06:03:51
【问题描述】:

有什么区别-

newSingleThreadExecutor vs newFixedThreadPool(20)

从操作系统和编程的角度来看。

每当我使用 newSingleThreadExecutor 运行我的程序时,我的程序运行良好,端到端延迟(第 95 个百分位数)大约在 5ms 附近。

但是一旦我开始运行我的程序使用-

newFixedThreadPool(20)

我的程序性能下降,我开始看到端到端延迟为37ms

所以现在我试图从架构的角度来理解线程数在这里意味着什么?以及如何确定我应该选择的最佳线程数是多少?

如果我使用更多的线程,会发生什么?

如果有人能用通俗的语言向我解释这些简单的事情,那对我来说将非常有用。感谢您的帮助。

我的机器配置规范-我正在从 Linux 机器上运行我的程序-

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
stepping        : 7
cpu MHz         : 2599.999
cache size      : 20480 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm arat pln pts
bogomips        : 5199.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 45
model name      : Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
stepping        : 7
cpu MHz         : 2599.999
cache size      : 20480 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm arat pln pts
bogomips        : 5199.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

【问题讨论】:

  • 您对这里的答案不满意吗:stackoverflow.com/questions/16125626/… ?
  • 我想更详细地了解。我发布的那个问题更多的是关于编程和寻找瓶颈,但格雷认为这可能是线程大小的问题。所以我想让我们发布另一个问题,但这次更具体的是架构的观点。

标签: java multithreading concurrency cpu-cores processors


【解决方案1】:

好的。理想情况下,假设您的线程没有锁定,因此它们不会相互阻塞(彼此独立),并且您可以假设工作负载(处理)是相同的,那么事实证明,池大小为 Runtime.getRuntime().availableProcessors()availableProcessors() + 1 给出最好的结果。

但是说,如果线程相互干扰或涉及 I/O,那么 Amadhal 定律可以很好地解释。来自维基,

Amdahl 定律指出,如果 P 是程序可以并行化(即受益于并行化)的比例,并且 (1 - P) 是不能并行化(保持串行化)的比例,那么最大加速比使用N个处理器可以实现的是

在您的情况下,根据可用内核的数量以及它们的具体工作(纯计算?I/O?持有锁?因某些资源而阻塞?等等),您需要提出解决方案根据以上参数。

例如:几个月前,我参与了从数字网站收集数据的工作。我的机器是 4 核的,池大小为 4。但是因为操作纯粹是I/O,而且我的网速​​还不错,所以我意识到我在池大小为7 时性能最好。那是因为,线程不是为了计算能力而战,而是为了 I/O。所以我可以利用更多线程可以积极竞争核心这一事实。

PS:我建议,阅读 Brian Goetz 的书 - Java Concurrency in Practice 中的性能一章。它详细处理了这些问题。

【讨论】:

  • 感谢 Jatin 的建议。关于核心尺寸,我还在linux中发布了我机器的配置规范,你能弄清楚我的核心尺寸是多少吗?因为我无法通过查看配置规范来弄清楚这一点。
  • @TechGeeky 调用 Runtime.getRuntime().availableProcessors() 将返回核心数
  • 是的,看起来我的负载和性能机器中只有 2 个内核。我正在用 20 个线程运行我的程序,这就是我在程序中看到这么多高性能问题的原因。对吗?
  • @TechGeeky 绝对是。 20 实际上是一个杀戮:P。我建议,根据 Amadhal 法则设置大小,并通过增加或减少该值周围的池大小来玩弄它。
  • 是的,肯定会玩这个。我想澄清的另一件事是当您说池大小时。您在此代码newFixedThreadPool(threads) 中谈论threads。正确的?我应该在那里使用3,但我可以再次使用这些数字,看看它是如何表现的
【解决方案2】:

所以现在我试图从架构的角度来理解线程数在这里意味着什么?

每个线程都有自己的堆栈内存、程序计数器(如指向下一步执行的指令的指针)和其他本地资源。将它们交换出来会损害单个任务的延迟。好处是当一个线程空闲时(通常在等待 i/o 时)另一个线程可以完成工作。此外,如果有多个处理器可用,如果任务之间没有资源和/或锁定争用,它们可以并行运行。

以及如何确定我应该选择的最佳线程数是多少?

交换价格与避免空闲时间的机会之间的权衡取决于您的任务的细节(多少 I/O,何时,I/O 之间有多少工作,使用如何很多内存要完成)。实验永远是关键。

如果我使用更多的线程,会发生什么?

首先吞吐量通常会呈线性增长,然后是相对平坦的部分,然后是下降(可能非常陡峭)。每个系统都不同。

【讨论】:

    【解决方案3】:

    查看阿姆达尔定律很好,特别是如果您确切知道 P 和 N 有多大。由于这永远不会真正发生,您可以监控性能(无论如何您都应该这样做)并增加/减少线程池大小以优化对您而言重要的任何性能指标。

    【讨论】:

      猜你喜欢
      • 2016-09-01
      • 2022-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2010-12-23
      • 2023-03-30
      • 2012-02-12
      • 2020-01-22
      相关资源
      最近更新 更多