Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NUMA体系结构如何影响ActivePivot的性能?_Java_Olap_Numa_Activepivot - Fatal编程技术网

Java NUMA体系结构如何影响ActivePivot的性能?

Java NUMA体系结构如何影响ActivePivot的性能?,java,olap,numa,activepivot,Java,Olap,Numa,Activepivot,我们正在将ActivePivot应用程序迁移到新服务器(4个插槽Intel Xeon,512GB内存)。部署之后,我们启动了我们的应用程序基准测试(这是并发于实时事务的大型OLAP查询的混合)。测量的性能几乎比我们以前的服务器慢两倍,我们以前的服务器具有相似的处理器,但内核和内存分别减少了两倍和两倍 我们调查了这两台服务器之间的差异,发现这台大型服务器具有NUMA体系结构(非统一内存访问)。每个CPU插槽在物理上接近内存的1/4,但离其余部分更远。。。运行我们的应用程序的JVM分配了一个大的全局

我们正在将ActivePivot应用程序迁移到新服务器(4个插槽Intel Xeon,512GB内存)。部署之后,我们启动了我们的应用程序基准测试(这是并发于实时事务的大型OLAP查询的混合)。测量的性能几乎比我们以前的服务器慢两倍,我们以前的服务器具有相似的处理器,但内核和内存分别减少了两倍和两倍

我们调查了这两台服务器之间的差异,发现这台大型服务器具有NUMA体系结构(非统一内存访问)。每个CPU插槽在物理上接近内存的1/4,但离其余部分更远。。。运行我们的应用程序的JVM分配了一个大的全局堆,每个NUMA节点上都有该堆的随机部分。我们的分析是,内存访问模式是非常随机的,CPU内核经常浪费时间访问远程内存


我们正在关注更多关于在NUMA服务器上利用ActivePivot的反馈。我们可以配置ActivePivot多维数据集或线程池、更改查询、配置操作系统吗?

您可以尝试使用
-XX:+UseNUMA

如果这不能产生您期望的结果,那么您可能必须使用
taskset
将JVM锁定到特定的套接字,并有效地将服务器分成四台机器,每台机器有一个JVM


我已经观察到,具有更多套接字的机器对其内存(甚至本地内存)的访问速度较慢,因此总是会给您带来所需的性能提升。

Peter介绍了目前可用的通用JVM选项,以减少NUMA体系结构对性能的影响。简而言之,NUMA感知JVM将根据NUMA节点对堆进行分区,当线程创建新对象时,该对象将分配到运行该线程的内核的NUMA节点中(如果同一线程稍后使用它,该对象将位于本地内存中)。此外,在压缩堆时,支持NUMA的JVM避免在节点之间移动大数据块(并减少停止世界事件的长度)

因此,在任何NUMA硬件和任何Java应用程序上,-XX:+UseNUMA选项可能都应该启用

但对于ActivePivot,这并没有多大帮助:ActivePivot是一个内存中的数据库。有实时更新,但在应用程序的整个生命周期中,大部分数据都驻留在主内存中。无论JVM选项如何,数据都将在NUMA节点之间分割,执行查询的线程将随机访问内存。知道ActivePivot查询引擎的大多数部分都能以获取内存的速度运行,NUMA的影响尤其明显

那么,如何在NUMA硬件上充分利用ActivePivot解决方案呢

当ActivePivot应用程序只使用一小部分资源时,有一个简单的解决方案(我们发现,当多个ActivePivot解决方案在同一台服务器上运行时,通常会出现这种情况)。例如,ActivePivot解决方案只使用64个内核中的16个,每TB中使用256GB。在这种情况下,可以将JVM进程本身限制为NUMA节点

在Linux上,可以使用以下选项()作为JVM启动的前缀:


如果整个服务器专用于一个ActivePivot解决方案,则可以利用ActivePivot分布式体系结构对数据进行分区。如果有4个NUMA节点,则启动承载4个ActivePivot节点的4个JVM,每个JVM都绑定到其NUMA节点。通过此部署,查询将分布在节点之间,每个节点将在右侧NUMA节点内以最大性能执行其工作份额。

使用numactl时,我建议使用开关
--membind=nodes,-m nodes
,另外使用
--cpunodebind=nodes,-N个节点
,以便将内存限制到该节点。否则,通常会在外部节点上分配一小部分内存(即使使用
-XX:+UseNUMA
),这可能会澄清一点:>>我观察到,具有更多套接字的机器对其内存(甚至其本地内存)的访问速度较慢,以及如何始终为您提供所需的性能增益。较慢的访问速度如何提高性能?谢谢
numactl --cpunodebind=xxx