加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:28:54 所属栏目:Java 来源:网络整理
导读:参见英文答案 Performance Issues with newFixedThreadPool vs newSingleThreadExecutor1 有什么区别 – newSingleThreadExecutor vs newFixedThreadPool(20) 在操作系统和编程方面的观点. 每当我使用newSingleThreadExecutor运行我的程序,我的程序工作得很
参见英文答案 > 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并发实践.它详细地处理这些事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读