我们正在迁移的ActivePivot应用到新的服务器(4个插槽英特尔至强,512GB的内存)。 部署后,我们推出了我们的应用基准测试(这是大型OLAP查询并发实时交易的混合)。 测量的性能比我们以前的服务器,有类似的处理器,而是两次少核,两倍的内存较少的几乎两倍慢。
我们已经调查了两个服务器之间的差异,并出现大的一个具有NUMA架构 (非统一内存acccess)。 每个CPU插槽为物理上接近内存的1/4,但是从它的其余部分渐行渐远......运行我们的应用程序的JVM分配一个大的全局堆,还有每个NUMA节点上堆的随机分数。 我们的分析是,内存访问模式是相当随机的,CPU内核经常浪费时间访问远程存储。
关于利用上NUMA西弗斯ActivePivot更多的反馈后,我们正在寻找。 我们可以配置ActivePivot立方体,或线程池,改变我们的查询,配置操作系统?
彼得描述可用一般JVM选择今天来减少NUMA架构对性能的影响。 为了保持短NUMA感知JVM将对于NUMA节点分区堆,当一个线程创建一个新的对象,该对象在运行线程(如果同一个线程以后会使用这个核心的NUMA节点分配它的目标将是在本机存储器)。 也压实堆当NUMA意识到JVM避免移动节点之间的大的数据块(和降低的停止的世界的事件的长度)。
因此,对任何NUMA硬件和任何Java应用程序的-XX:+ UseNUMA选项可能应该启用。
但对于ActivePivot是不会有什么帮助:ActivePivot是一个内存数据库。 有实时更新,但该数据的大部分驻留在应用程序的生命中最重要的记忆。 无论JVM选项,该数据将NUMA节点之间进行分割,并执行查询的线程会随机访问内存。 明知ActivePivot查询引擎的大部分路段运行速度极快,内存可以提取时,NUMA影响尤为明显。
所以你怎么能得到您的ActivePivot解决方案在NUMA硬件的是什么?
有当ActivePivot应用只使用资源的一小部分(我们发现,这是经常发生的情况时,几个ActivePivot解决方案在同一台服务器上运行)一个简单的解决方案。 例如一个ActivePivot溶液仅使用16个核心出64和256GB出TB级的。 在这种情况下,你可以限制JVM进程本身的NUMA节点。
在Linux上,你前缀JVM启动使用下列选项( http://linux.die.net/man/8/numactl ):
numactl --cpunodebind=xxx
如果整个服务器专用于一个ActivePivot解决方案,您可以利用ActivePivot分布式架构对数据进行分区。 如果有4个NUMA节点,启动4个JVM中主机4个ActivePivot节点,每一个必然的NUMA节点。 通过这次部署查询节点之间分配,每个节点将在最大性能执行其份内的工作,正确的NUMA节点内。
您可以尝试使用-XX:+UseNUMA
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html
如果这不会产生结果,您希望您可能需要使用taskset
一个JVM锁定到特定的插座,有效地打破服务器进入四台机器每一个JVM。
我观察到,机器更插座具有自己的内存(甚至他们的本地内存),以及如何总是给你的性能提升你想要的结果更慢的访问。