我们将ActivePivot应用程序迁移到新服务器(4个插座Intel Xeon,512GB的内存)。部署后,我们启动了应用程序基准(这是与实时交易同时发生的大型OLAP查询的混合体)。测得的性能几乎比我们以前的服务器慢两倍,后者具有相似的处理器,但内核的两倍,记忆少两倍。
我们已经研究了两个服务器之间的差异,看来大型服务器具有 numa架构(非均匀的内存coccess)。每个CPU插座物理上接近内存的1/4,但距离其余部分较远...运行我们应用程序的JVM分配了一个大的全局堆,每个NUMA节点上都有一个随机分数。我们的分析是,内存访问模式是非常随机的,CPU内核经常浪费时间访问遥不可及的内存。
我们正在照顾有关利用Numa dever上的ActivePivot的更多反馈。我们可以配置ActivePivot立方体或线程池,更改我们的查询,配置操作系统吗?
peter描述了当今可用的一般JVM选项,以减少NUMA架构的性能影响。为了使其简短,NUMA知道的JVM将相对于NUMA节点分区堆,当线程创建新对象时,将对象分配在运行该线程的核心的NUMA节点(如果同一线程以后使用,则该对象将在本地内存中)。同样,在压实堆时,Numa Aware JVM避免了在节点之间移动大数据块(并缩短停止事件的长度)。
因此,在任何numa硬件上,对于任何Java应用程序 -XX: USENUMA 选项可能应启用。
但对于无济于事的ActivePivot:ActivePivot是一个内存数据库。有实时更新,但是大部分数据都属于应用程序寿命的主要内存。无论JVM选项如何,数据都会在NUMA节点之间分配,并且执行查询的线程将随机访问内存。知道ActivePivot查询引擎的大多数部分都可以像记忆一样快地运行,NUMA撞击特别明显。
那么,如何从Numa硬件上的ActivePivot解决方案中获得最大收益?
当ActivePivot应用程序仅使用一小部分资源时,就会有一个简单的解决方案(我们发现当几个ActivePivot Solutions在同一服务器上运行时通常是这种情况)。例如,仅使用64个内核和256GB的ActivePivot解决方案中的解决方案。在这种情况下,您可以将JVM进程本身限制为numa节点。
在Linux上,您的JVM启动以下选项(http://linux.die.net/man/8/numactl):
numactl --cpunodebind=xxx
如果整个服务器专用于一个ActivePivot解决方案,则可以利用ActivePivot分布式体系结构来分区数据。如果有4个NUMA节点,则启动4个JVM托管4个ActivePivot节点,每个节点绑定到其NUMA节点。随着此部署查询,请在节点之间分布,每个节点将在最大绩效中执行其作品的份额。
您可以尝试使用-XX:+UseNUMA
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html
如果这没有产生结果,则您希望您可能必须使用taskset
将JVM锁定到特定的插座,并有效地将服务器分解为四台JVM。
我观察到,具有更多插座的机器可以较慢访问其内存(甚至是本地内存),以及如何始终为您提供所需的性能增长。