更多核心VS更频繁的Java

时间:2011-04-04 11:20:22

标签: java multithreading cpu multicore frequency

对于大量多线程的Java服务器应用程序,建议使用更多CPU内核(6个而不是4个)或更高的CPU频率(2.53 Ghz而不是2.4 Ghz)。

在我看来,明显更多核心是要走的路,但我想听听第二个意见。

感谢。

6 个答案:

答案 0 :(得分:5)

既然你说过“多线程”,我会说更多核心是首选。更高的时钟速度只意味着更快的线程上下文切换。如果您的算法是并行化的,我会说更多内核会给你更大的提升。

答案 1 :(得分:4)

如果您的应用程序当前受CPU限制,并且很容易增加正在进行计算工作的并行线程数(即它们之间的依赖关系最小),那么您将从增加内核数量中受益。 / p>

如果这些都不是真的(例如,如果你的大部分线程都用于处理磁盘,网络或用户IO),那么无论如何都不会有太大的好处。

答案 2 :(得分:2)

如果您的应用程序可以很好地扩展,那么在比较相同架构的计算机时,您可以假设您的处理能力为speed * cores

根据这些假设,您的吞吐量可能与

成比例
  • 4 * 2.53 = 10.12
  • 6 * 2.4 = 14.4

6核心系统的吞吐量可提高40%。

然而,为了比较相似但不相同的架构的CPU,我建议您查看CPU的SPEC_int_rate或SPEC_fp_rate。 (如果浮点密集,只使用后者,如果有疑问,则不使用;)

答案 3 :(得分:1)

这取决于任务的性质。如果任务本质上是串行的(“任务1必须在任务2之前完成,任务2必须在任务3之前完成”,等等),那么处理器速度将获胜;如果任务可以并行执行(“任务1,2和3不使用它们之间的数据,任务4整理结果”)则核心计数更重要。

换句话说,它完全取决于处理器的用途。

答案 4 :(得分:1)

2.53/2.4 = 1.05

6/4 = 1.5

如果线程相对独立 - 在服务器应用程序中肯定是这种情况,其中池中只有一堆线程,并且每个线程都在客户端的下一个请求中给出 - 那答案确实很明显。

答案 5 :(得分:0)

我还想补充一点,在进行类似的分析时应该考虑另外三个因素。

  1. 任务内存密集吗? I / O密集型?花费大量时间等待内存/磁盘/网络访问完成的程序不会受益于更高的频率,因为处理器不是瓶颈。然而,它们确实受益于并行性,因为可以并行触发更多请求,并且可以隐藏一些延迟。

  2. 正如有人已经指出的那样,考虑应用程序可伸缩性。如果app只有4个并发执行线程,那么6个核心将无济于事,但更高的频率可能会有所帮助。

  3. 串行代码的数量(由于关键部分争用或负载不平衡引起的固有或偶然)可能意味着更高的频率优于更多的核心。运行串行代码时,运行单线程的单核的速度更为重要。这来自Ahmdahl定律。

  4.  Execution time with N cores = Time in Serial code  + (Time in parallel code as 1 thread/N)  
    
    Now if parallel part is small already, then increasing N will only help a little. Say Time in parallel when run as 1 thread is 10s and time in serial part is 5s. 
    
    With 1 core ,  15s. 
    With 2 cores,  10s,   
    With 4 cores,  7.5s,
    With 5 cores,  7s
    With 6 cores,  6.66s
    
    Now instead, if we had 4 cores with 5% higher frequency, 
    
    Total time will be 7.5/1.05 = 7.14s. Thusm 6 cores seem faster, clearly!
    
    Note: I assumed frequency perfectly translates into performance but this is often not the case due to memory and i/o accesses but it was fine for this analysis.
    
    

    顺便提一下,一个有趣的旁注:你的6芯看起来更好的原因是因为这两种配置无法比较,因为它们的电/加热要求(从运行成本的角度来看)是不一样的。 6核将花费更多购买,更多运行,更多冷却等,因此它可能提供更高的性能。

    @Joonas:服务器应用程序可以拥有关键部分,例如,MySQL充满了它们,使得线程在竞争关键部分时能够有效地串行化。