我如何确认一个主机NUMA感知? 在甲骨文的文档说,NUMA意识开始于内核2.6.19,但NUMA手册页说,它与2.6.14介绍。 我想,以确保Java进程开始-XX:+UseNUMA
实际上正在的东西优势。
检查的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
虽然我的内核是什么背后甲骨文指出:
# uname -sr
Linux 2.6.18-92.el5
我目前使用的RHEL5.1 64位jdk1.6.0_29。
这些的/ proc文件的存在表示你的Linux内核是支持NUMA。 不要担心自己太多比较版本号,如,特别是与甲骨文/ 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
Oracle的文档还指出:
注:有在Linux内核中一个已知的bug可能导致JVM是吨,-XX时崩溃:UseNUMA。 该错误是固定在2012年,所以这不应该影响到Linux内核的最新版本。 要看看你的内核有这个错误,你可以运行本地再现 。
我在这里转载证明它的简单:
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/reproducer.c
要构建再生器中,您可能需要安装取决于你的分布numactl的或numactl的-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是第一个安全版本。