对于大量多线程的Java服务器应用程序,建议使用更多CPU内核(6个而不是4个)或更高的CPU频率(2.53 Ghz而不是2.4 Ghz)。
在我看来,明显更多核心是要走的路,但我想听听第二个意见。
感谢。
答案 0 :(得分:5)
既然你说过“多线程”,我会说更多核心是首选。更高的时钟速度只意味着更快的线程上下文切换。如果您的算法是并行化的,我会说更多内核会给你更大的提升。
答案 1 :(得分:4)
如果您的应用程序当前受CPU限制,并且很容易增加正在进行计算工作的并行线程数(即它们之间的依赖关系最小),那么您将从增加内核数量中受益。 / p>
如果这些都不是真的(例如,如果你的大部分线程都用于处理磁盘,网络或用户IO),那么无论如何都不会有太大的好处。
答案 2 :(得分:2)
如果您的应用程序可以很好地扩展,那么在比较相同架构的计算机时,您可以假设您的处理能力为speed * cores
。
根据这些假设,您的吞吐量可能与
成比例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)
我还想补充一点,在进行类似的分析时应该考虑另外三个因素。
任务内存密集吗? I / O密集型?花费大量时间等待内存/磁盘/网络访问完成的程序不会受益于更高的频率,因为处理器不是瓶颈。然而,它们确实受益于并行性,因为可以并行触发更多请求,并且可以隐藏一些延迟。
正如有人已经指出的那样,考虑应用程序可伸缩性。如果app只有4个并发执行线程,那么6个核心将无济于事,但更高的频率可能会有所帮助。
串行代码的数量(由于关键部分争用或负载不平衡引起的固有或偶然)可能意味着更高的频率优于更多的核心。运行串行代码时,运行单线程的单核的速度更为重要。这来自Ahmdahl定律。
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充满了它们,使得线程在竞争关键部分时能够有效地串行化。