Java只使用2个CPU中的1个(NUo4J)

问题描述:

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

Javaoptions:-XX:+ UseNUMA -Xmx64g -Xms64g

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

+0

我有多个线程同步BatchInserter插入。一个NUMA节点为100%(12个核心的HT),另一个约为0%。所以线程似乎起作用。导入工具不是我所需要的。我的原始数据是〜600GB xml(拆分) – Escalus

+0

噢,实际上,可以修改导入工具以读取任何类型的输入...导入工具利用多个CPU并有利于顺序I/O,所以应该比BatchInserter。 XML可以通过https://github.com/neo4j/neo4j/blob/2.3/community/kernel/src/main/java/org/neo4j/unsafe/impl/batchimport/input/Input.java的实现来解析通过https://github.com/neo4j/neo4j/blob/2.3/community/kernel/src/main/java/org/neo4j/unsafe/impl/batchimport/ParallelBatchImporter.java导入 –

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

即使您分配的JVM最大堆大于分配的内存大小,如果您的堆没有增长超过该大小,进程也不会溢出,因为JVM对象分配器将始终尝试创建一个与创建线程位于同一个内存池中的新对象 - 并且包含新的线程对象。

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

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

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