如何确认NUMA?

10
我该如何确认主机是否支持NUMA?Oracle文档指出NUMA感知从2.6.19内核开始,但NUMA手册称其在2.6.14中就已被引入。我想确保使用-XX:+UseNUMA启动的Java进程确实利用了某些东西。
检查numa_maps,我发现我拥有它们。
# find /proc -name numa_maps
/proc/1/task/1/numa_maps
/proc/1/numa_maps
/proc/2/task/2/numa_maps
/proc/2/numa_maps
/proc/3/task/3/numa_maps

虽然我的内核落后于Oracle所述的版本:

# uname -sr
Linux 2.6.18-92.el5

我目前在RHEL5.1上使用64位jdk1.6.0_29。


你考虑过将内核升级到更高版本吗? - Basile Starynkevitch
RHEL 5.1(2007-11-07)相当古老,也许是时候升级了。 - Peter Lawrey
@Peter 在我的经验中,使用 NUMA 处理器的人通常不是负责更新软件的人,并且必须通过相当多的官僚主义来更新软件。就在上周,我看到一个拥有 2k 核心的超级计算机上安装了 Python 2.4 - Voo
@aix 我认为在单个主板上的多处理器机器上可能会出现这种情况(不确定),但是那样的人也不多,而在单个处理器Sandy Bridge上,所有CPU应该对整个内存具有相同的延迟时间?我非常确定英特尔将SB处理器描述为SMP。 - Voo
@Voo:说得好。我撤回我的评论。 - NPE
2个回答

10

这些/proc文件的存在表明你的Linux内核支持NUMA。不必太担心比较版本号,特别是在使用Oracle/RHEL内核时,厂商会在不更新版本字符串的情况下移植/回移很多功能。

测试相同内容的其他方法:

$ grep NUMA=y /boot/config-`uname -r`
CONFIG_NUMA=y
CONFIG_K8_NUMA=y
CONFIG_X86_64_ACPI_NUMA=y
CONFIG_ACPI_NUMA=y

$ numactl --hardware
available: 2 nodes (0-1)
node 0 size: 18156 MB
node 0 free: 9053 MB
node 1 size: 18180 MB
node 1 free: 6853 MB
node distances:
node   0   1
  0:  10  20
  1:  20  10

RHEL的后移植也在我的考虑范围内。/boot/config的选择很明智。 - Christopher Neylan
2
但这是否意味着JVM在使用它? 是否有日志记录表明NUMA正在使用中? - easytiger

1
Oracle文档还指出:
注意:Linux内核中存在已知的错误,可能会在使用-XX:UseNUMA时导致JVM崩溃。该错误已在2012年得到修复,因此不应影响最新版本的Linux内核。要查看您的内核是否有此错误,可以运行native reproducer来检查。
这里我复制了该错误以证明其简单性:

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/reproducer.c

要构建重现程序,您可能需要根据您的发行版安装 numactlnumactl-devel 软件包。有关详细信息,请参见 man numa_maps
#include <numaif.h>
#include <numa.h>
#include <stddef.h>
#include <sys/mman.h>
#include <stdint.h>

int main(void) {
   if (numa_all_nodes_ptr == (void*)0) {
     return -1;
   }

   size_t pagesize = getpagesize();

   void* mapped_memory = mmap(NULL, 3 * pagesize, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
   if (mapped_memory == MAP_FAILED) {
     return -2;
   }

   void* page0 = mapped_memory;
   void* page1 = (void*)((uintptr_t)page0 + pagesize);
   void* page2 = (void*)((uintptr_t)page1 + pagesize); 

 // Set up the last page as interleaved.
   mbind(page2, pagesize, MPOL_INTERLEAVE, numa_all_nodes_ptr->maskp,
numa_all_nodes_ptr->size, 0);

   // Setup the last two pages as interleaved.
   mbind(page1, 2 * pagesize, MPOL_INTERLEAVE,
numa_all_nodes_ptr->maskp, numa_all_nodes_ptr->size, 0);

   *((char*)page2) = 2;
   *((char*)page1) = 1;
   *((char*)page0) = 0; // Crash here, when mbind_merge was broken.

   return 0;
}

所以,我认为这里的模糊指的是2.6.19是第一个安全的版本。

你怎么编译这个?NUMA头文件在哪里? - niken
1
@Nik 根据 man numa_maps 中的“库支持”,您可能需要安装 numactl 或 numactl-devel。 - Donald_W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接