2012-04-11 20 views
6

Wie kann ich bestätigen, dass ein Host NUMA-fähig ist? Die Oracle doc sagt, dass NUMA-Bewusstsein bei Kernel 2.6.19 beginnt, aber die NUMA man page sagt, dass es mit 2.6.14 eingeführt wurde. Ich möchte sicher sein, dass ein Java-Prozess, der mit -XX:+UseNUMA gestartet wurde, tatsächlich etwas ausnutzt.So bestätigen Sie NUMA?

Überprüfung der numa_maps, ich sehe, dass ich sie habe:

# 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 

Obwohl meine Kernel hinter ist, was Oracle heißt es:

# uname -sr 
Linux 2.6.18-92.el5 

ich zur Zeit mit 64-Bit-jdk1.6.0 _29 auf RHEL5.1.

+0

Haben Sie in Erwägung gezogen, Ihren Kernel auf etwas aktuelleres zu aktualisieren? –

+0

RHEL 5.1 (2007-11-07) ist ziemlich alt, vielleicht ist es an der Zeit zu aktualisieren. –

+0

@Peter Nach meiner Erfahrung sind die Leute, die mit NUMA-Prozessoren arbeiten, normalerweise nicht verantwortlich für die Aktualisierung der Software und müssen ziemlich viel Bürokratie durchmachen, um sie auf den neusten Stand zu bringen. Habe gerade eine * python 2.4 * letzte Woche auf einem Supercomputer mit 2k Kernen installiert .. – Voo

Antwort

8

Das Vorhandensein dieser/proc-Dateien zeigt an, dass Ihr Linux-Kernel numa-aware ist. Sie sollten sich nicht zu sehr mit dem Vergleich von Versionsnummern befassen, da insbesondere bei Oracle/RHEL-Kerneln die Hersteller viele Funktionen portieren/rückportieren, ohne den Versions-String "auf dem neuesten Stand" zu halten.

Andere Möglichkeiten, die gleiche Sache zu testen:

$ 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 
+0

Rheins Rückportierung ging mir auch in den Sinn. guter Ruf mit/boot/config –

+2

aber bedeutet das, dass die JVM es verwendet? Gibt es eine Protokollierung, um anzuzeigen, dass numa verwendet wird? – easytiger

1

Die Oracle-doc auch heißt:

Hinweis: Es war ein bekannter Fehler im Linux-Kernel, die die JVM zum Absturz verursachen kann, wenn sein t mit -XX: UseNUMA. Der Fehler wurde 2012 behoben, dies sollte sich nicht auf die neuesten Versionen des Linux-Kernels auswirken. Um zu sehen, ob Ihr Kernel diesen Fehler hat, können Sie native reproducer ausführen.

, die ich hier wiedergegeben haben seine Einfachheit zu demonstrieren:

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

die reproducer zu erstellen, können Sie die numactl oder numactl-devel Pakete je nach Distribution installieren. Details finden Sie unter 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; 
} 

Also nahm ich die Mehrdeutigkeit bedeuten, dass 2.6.19 die erste sichere Version war.

+0

Wie kompilieren Sie das? Wo sind die Kopfzeilen? – sloven

+0

@Nik Sie müssen möglicherweise numactl oder numactl-devel nach man numa_maps 'Library support' installieren –

Verwandte Themen