java – 设置线程池的理想大小

前端之家收集整理的这篇文章主要介绍了java – 设置线程池的理想大小前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Performance Issues with newFixedThreadPool vs newSingleThreadExecutor1
有什么区别 –

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:

解决方法

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

但是说如果线程干扰对方或者有I / O的话,那么Amadhal的定律很好.从维基,

Amdahl’s law states that if P is the proportion of a program that can be made parallel (i.e.,benefit from parallelization),and (1 − P) is the proportion that cannot be parallelized (remains serial),then the maximum speedup that can be achieved by using N processors is

在你的情况下,根据可用的核心数量,以及他们精确地做的工作(纯粹的计算?I / O?保持锁定一些资源?等等),你需要根据上面提出的解决方案参数.

例如:几个月后,我参与了从数字网站收集数据.我的机器是4核,我有一个游泳池的大小为4.但是由于操作是纯粹的I / O,我的净速度是体面的,我意识到我有最好的性能,池大小为7.那是因为,线程不是用于计算能力,而是用于I / O.所以我可以利用这样一个事实,即更多的线程可以积极地参与核心竞争.

PS:我建议,通过本书中的性能 – Brian Goetz的Java并发实践.它详细地处理这些事情.

猜你在找的Java相关文章