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

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

是否有可能只使用一个javaprocess的NUMA节点?

Java选项:-XX:UseNUMA -Xmx64g -Xms64g

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

即使您将JVM最大堆大小分配给节点分配的内存大小,如果堆不超过该大小,该进程也不会溢出,因为JVM对象分配器将始终尝试在其中创建新对象.与创建线程相同的内存池 – 包括新的线程对象.

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

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

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

点赞