设置线程池的大小理想[复制](Setting Ideal size of Thread Pool [

2019-08-31 16:09发布

这个问题已经在这里有一个答案:

  • 用的newFixedThreadPool性能问题VS newSingleThreadExecutor 1个回答

有什么差别─

newSingleThreadExecutor vs newFixedThreadPool(20)

在操作系统和观点编程角度而言。

每当我使用的运行我的程序newSingleThreadExecutor我的程序工作得很好,端到端的延迟(第95百分位)恶有恶报5ms

但只要我开始运行我的程序using-

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:

Answer 1:

好。 理想的情况是假设你的线程没有锁定,使得它们不会相互阻塞(相互独立的),你可以假设的工作负荷(处理)是一样的,那么事实证明,有一个游泳池大小Runtime.getRuntime().availableProcessors()availableProcessors() + 1给出了最好的结果。

但是说,如果线程互相干扰或具有I / O inlvolved,然后Amadhal定律解释了相当不错。 从维基,

Amdahl定律指出,如果P是可以由并行程序的比例(即从并行化的好处),以及(1 - P)是不能并行的比例(依然串口),那么最大加速,可以是通过使用N个处理器实现

在你的情况下,基于可用的内核数量,什么工作,他们正是这样做(纯计算?I / O?持有锁?封锁一些资源?等),您需要根据上面拿出解决方案参数。

例如:几个月后,我参与了从数字web站点收集数据。 我的机器是4核的,我有一个池大小4 。 但由于操作纯粹是I/O和我的网速是体面的,我意识到,我与池大小最佳性能7 。 这是因为,线程没有战斗的计算能力,但对于I / O。 所以,我可以利用的事实,更多的线程可以大赛核心积极。

PS:我建议,通过本章的性能从书中去 - Java并发实践Brian Goetz撰写。 它涉及具体事项等。



Answer 2:

所以,现在我想但从架构上看是什么的线程数是指在这里明白了吗?

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

而如何决定什么是最佳线程数,我应该选择?

交换价格之间的权衡与机会,避免空闲时间取决于你的任务是什么样子的小细节(多少I / O,以及何时,用多少I / O,使用多少内存之间的工作完成)。 实验始终是关键。

如果我使用多线程的数量又会怎么样呢?

通常会有吞吐量线性肥胖型生长在第一,然后相对平坦部分,然后下降(其可以是相当陡峭)。 每个系统是不同的。



Answer 3:

综观Amdahl定律是好的,特别是如果你知道大P和N究竟如何。 由于这将永远不会真的发生,你可以监视的性能(你应该这样做无论如何),并增加/减少你线程池的大小,以优化任何性能指标是对你很重要。



文章来源: Setting Ideal size of Thread Pool [duplicate]