如何确认NUMA?

如何确认主机是否支持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 

尽pipe我的核心背后是Oracle所说的:

 # uname -sr Linux 2.6.18-92.el5 

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

Solutions Collecting From Web of "如何确认NUMA?"

那些/ proc文件的存在表明你的linux内核是numa-aware的。 不要过多地关注版本号的比较,特别是对于Oracle / RHEL内核,供应商端口/ backport许多功能,而不会保持版本字符串“最新”。

其他方法测试同样的事情:

 $ 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 

Oracle文档还指出:

注意:Linux内核中有一个已知的错误,当使用-XX:UseNUMA时,可能导致JVM崩溃。 该错误在2012年得到修复,因此这不应该影响最新版本的Linux内核。 要查看你的内核是否有这个bug,你可以运行本机的重现器 。

我在这里转载的是为了展示其简单性:

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是第一个安全版本。