Java只使用2个CPU中的1个和NUMA(Neo4J)

时间:2016-03-21 09:51:05

标签: java windows neo4j numa

我正在研究一个java程序来创建一个非常大的Neo4J数据库。我使用batchinserter和Executors.newFixedThreadPool来加快速度。我的Win2012R2服务器有2个cpu(2x6核心+ 2x6超线程)和256GB NUMA架构。我的问题是,我的导入器只使用1个CPU(节点)。 是否可以同时使用只有一个javaprocess的NUMA节点?

Javaoptions:-XX:+ UseNUMA -Xmx64g -Xms64g

2 个答案:

答案 0 :(得分:2)

目前还不清楚每个节点分配了多少内存 - 是256GB还是128GB?无论哪种方式,据我所知,设置最大堆大小小于分配给节点的内存量通常意味着应用程序保持连接到单个节点。据我所知,在Windows,Solaris和Linux下都是如此。

即使你将一个JVM最大堆大小分配给一个节点分配的内存大小,如果你的堆没有超过那个大小,那么这个过程不会溢出,因为JVM对象分配器总是会尝试在与创建线程相同的内存池中创建一个新对象 - 包括新的线程对象。

NUMA架构的主要设计目标是使不同的进程能够在不同的CPU上运行,每个CPU都具有本地化的内存访问权限,而不是让所有CPU都争用同一个全局共享内存。除非您可以安排特定线程始终使用与特定节点关联的本地内存(线程关联),否则在多个节点上运行相同进程并不一定有效。否则,远程内存访问会降低您的速度。

我怀疑要在您的示例中使用多个节点,您需要将不同的任务分配给不同的节点,或者跨多个节点并行执行相同的任务。在后一种情况下,您需要确保每个节点在本地内存中都有相同数据的副本。有些库可用于管理Java代码中的线程关联。

https://github.com/peter-lawrey/Java-Thread-Affinity

答案 1 :(得分:0)

BatchInserter是单线程的。您应该使用导入工具。见http://neo4j.com/docs/stable/import-tool.html