Java 多核上的jvm

Java 多核上的jvm,java,performance,jvm,multicore,Java,Performance,Jvm,Multicore,我不久前读过一篇博客文章,声称当允许Java应用程序在多核机器中使用单个cpu时,它运行得更好: 运行在多核机器上的Java应用程序比运行在单核机器上的速度慢得多,有什么原因呢 我怀疑“很多”部分 我的猜测是,将状态从一个cpu移动到另一个cpu的代价非常高,足以引起注意。通常,您希望作业保持在同一个cpu上,以便尽可能多地在本地缓存其数据。这完全是猜测,没有讨论的文章/数据,但是有一些类型的程序不适合并行化-也许应用程序从来没有cpu限制(这意味着CPU不是瓶颈,可能是某种I/O) 但是,这个

我不久前读过一篇博客文章,声称当允许Java应用程序在多核机器中使用单个cpu时,它运行得更好:

运行在多核机器上的Java应用程序比运行在单核机器上的速度慢得多,有什么原因呢

我怀疑“很多”部分


我的猜测是,将状态从一个cpu移动到另一个cpu的代价非常高,足以引起注意。通常,您希望作业保持在同一个cpu上,以便尽可能多地在本地缓存其数据。

这完全是猜测,没有讨论的文章/数据,但是有一些类型的程序不适合并行化-也许应用程序从来没有cpu限制(这意味着CPU不是瓶颈,可能是某种I/O)


但是,这个问题/对话毫无根据,没有更多的细节。

这没有Java特有的原因,但将状态从一个核心移动到另一个核心,甚至从一个CPU移动到另一个CPU都需要时间。如果进程停留在一个单核上,则可以更好地利用这段时间。此外,在这种情况下,可以改进缓存


但是,只有当程序不使用多线程,因此可以有效地将其工作分配到多个内核/CPU时,这才有意义。

最近的英特尔CPU具有Turbo Boost:


这将取决于应用程序生成的线程数。如果您生成四个工作线程来执行大量的数字运算,则应用程序在四核计算机上的速度将几乎快四倍,这取决于您必须执行的簿记和合并量。

如果不同应用程序中的共享资源之间存在明显的争用在nt线程中,锁定和解锁对象可能需要大量时间(处理器间中断),处理器丢弃其L1和L2缓存并从其他CPU重新获取数据的时间可能比实际解决手头问题所花费的时间要长

如果应用程序有办法,这可能是一个问题。(我曾经听过这样的总结:“每个CPU缓存线拥有一个以上的锁是没有意义的”,这肯定是正确的,而且可能仍然过于细粒度。)

Java的“每个对象都是互斥对象”可能会导致运行系统中的锁过多,如果有太多的锁处于活动状态并处于争用状态


我毫不怀疑有人会有意编写这样的应用程序,但这可能并不常见。大多数开发人员都会编写应用程序,以尽可能减少资源争用。

应用程序可能会很难利用阻止线程间通信。然而,这完全是由于应用程序编程异常糟糕


没有任何理由认为,即使是具有适度可并行工作负载的普通编程多核应用程序,在多核上的运行速度也会较慢。

从纯性能的角度来看,挑战往往在于内存子系统。因此,虽然更多的CPU通常是好的,但拥有不接近Jav的内存的CPU对象所在的位置非常非常昂贵。它非常特定于机器,并且在很大程度上取决于每个CPU和内存之间的精确路径。Intel和AMD在这里都有不同的形状/速度,结果差异很大

请参阅以了解多核可能会阻碍的原因


我们已经看到性能增量在30%或更大范围内,这取决于JVM固定到处理器的方式。SPECjbb2005现在主要在“多JVM”中运行因此,与给定CPU/内存关联的每个JVM的模式。

CPU通常对其产生的热量有限制。这意味着内核较少的芯片可以以较高的频率运行,如果不能有效地使用额外的内核,则会导致程序运行得更快。今天的区别是4、6和8核之间,其中re-core单独比较慢。我不知道有哪个单核系统比最快的4核系统快。

如果JIT认为它在单核中运行,它将不包括内存障碍。我怀疑这就是参考文章中发生的情况

下面是对内存障碍的一个非常简洁的解释,它还提供了一种查看JIT代码的简洁技术:


这并不是说所有的应用程序都能从一个内核上获益。

有很多很有前途的链接。如果这篇博文在列表上,你能留下一个注释吗?最坏的情况是,这意味着一个真正荒谬的(如果不是恶意的话)应用程序任务调度器可以尝试安排一些事情,这样Turbo Boost就不会启动了——我甚至不确定它是否可以被这样操作。无论如何,它永远不会有6倍的性能差异。我同意。Turbo Boost甚至没有接近6倍。在这篇文章中,作者通过将其分配给单个服务器,使服务器更快CPU而不是6您是对的,他将所有进程分配到一个核心。如果这样做有效,他几乎肯定会有一个调优问题,尽管还不清楚是什么。这是忽略了,基本上可以归结为:有些事情不能很好地分解为并行任务,而不管语言/环境如何。