我正在开发一个Java程序来创build一个非常大的Neo4J数据库。 我使用batchinserter和Executors.newFixedThreadPool来加快速度。 我的Win2012R2服务器有2个CPU(2×6核心+ 2×6超线程)和256GB的NUMA架构 。 我的问题是现在,我的import商只使用1个CPU(节点)。 是否可以同时使用两个NUMA节点只有一个javaprocess?
Java选项:-XX:+ UseNUMA -Xmx64g -Xms64g
目前尚不清楚为每个节点分配了多少内存 – 是256GB还是128GB? 无论哪种方式,据我所知,设置最大堆大小小于分配给节点的内存量通常意味着应用程序保持与单个节点的关系。 就我所知,在Windows,Solaris和Linux下是这样的。
即使您将JVM最大堆大小分配给节点的分配内存,如果您的堆不会超出该大小,那么进程将不会溢出,因为JVM对象分配器将始终尝试在该节中创建一个新对象与创建线程相同的内存池 – 并且包含新的线程对象。
NUMA体系结构的主要设计目标是使不同的进程能够在不同的CPU上运行,每个CPU都有本地化的内存访问,而不是让所有的CPU都争夺相同的全局共享内存。 跨多个节点运行相同的进程并不一定高效,除非您可以安排特定线程始终使用与特定节点(线程相关性)关联的本地内存。 否则,远程内存访问会降低你的速度。
我怀疑要在你的例子中使用多个节点,你需要为不同的节点分配不同的任务,或者在多个节点上并行执行相同的任务。 在后一种情况下,您需要确保每个节点都有本地内存中相同数据的副本。 有些库可用于从Java代码管理线程关联。
BatchInserter是单线程的。 您应该使用导入工具。 请参阅http://neo4j.com/docs/stable/import-tool.html