ars*_*nal 25 java concurrency multithreading cpu-cores processors
有什么区别 -
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:
Run Code Online (Sandbox Code Playgroud)
Jat*_*tin 45
好.理想情况下假设您的线程没有锁定,使得它们不会相互阻塞(彼此独立),并且您可以假设工作负载(处理)是相同的,那么事实证明,具有池大小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并发实践"一书中的性能章节.它详细讨论了这些问题.
所以现在我试图从架构的角度来理解这里有多少线程意味着什么?
每个线程都有自己的堆栈存储器,程序计数器(如指向下一个指令执行的指针)和其他本地资源.交换它们会损害单个任务的延迟.好处是当一个线程空闲时(通常在等待i/o时),另一个线程可以完成工作.此外,如果有多个处理器可用,则如果任务之间没有资源和/或锁定争用,它们可以并行运行.
以及如何确定我应该选择的最佳线程数?
交换价格与避免闲置时间的机会之间的权衡取决于你的任务看起来的细节(多少i/o,以及何时,i/o之间的工作量,使用多少内存到完成).实验始终是关键.
如果我使用更多的线程,那会发生什么?
通常在吞吐量方面会有线性增长,然后是相对平坦的部分,然后是下降(可能非常陡峭).每个系统都不同.
查看阿姆达尔定律很好,特别是如果您确切知道 P 和 N 有多大。由于这永远不会真正发生,您可以监控性能(无论如何您都应该这样做)并增加/减少线程池大小以优化对您很重要的任何性能指标。
| 归档时间: |
|
| 查看次数: |
25227 次 |
| 最近记录: |