2012-04-11 40 views
6

ホストがNUMA対応であることを確認するにはどうすればよいですか? Oracle docによれば、NUMAの認識はカーネル2.6.19から始まりますが、NUMA man pageは2.6.14で導入されたと言います。私は-XX:+UseNUMAで始まるJavaプロセスが実際に何かを利用していることを確認したいと思います。NUMAの確認方法は?

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 

私は現在、64ビットのjdk1.6.0を使用していますRHEL5.1の_29

+0

カーネルをもっと新しいものにアップグレードすることを検討しましたか? –

+0

RHEL 5.1(2007-11-07)はかなり古く、おそらくアップグレードする時間です。 –

+0

@Peter私の経験では、NUMAプロセッサを扱う人は通常、ソフトウェアの更新を担当する人ではなく、更新するためにかなりの官僚主義を経なければなりません。先週、2kコアを搭載したスーパーコンピュータで* a * python 2.4 *をインストールしました。 – Voo

答えて

8

これらの/ procファイルが存在することは、お使いのLinuxカーネルがnuma-awareであることを示します。特に、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 
+0

rhelのバックポートも私の心の中にあった。/boot/config –

+2

でうまくやっていますが、それはJVMがそれを使用していることを意味していますか? numaが使用中であることを示すログがありますか? – easytiger

1

Oracleのドキュメントも述べて:

注:されたときにJVMがクラッシュする可能性がありますLinuxカーネルの既知のバグがありましたtを-XXとする:UseNUMA。このバグは2012年に修正されたので、Linuxカーネルの最新バージョンには影響しません。カーネルにこのバグがあるかどうかを確認するには、native reproducerを実行してください。私はそのシンプルさを証明するためにここに再現しており

:再生を構築するには

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が最初安全バージョンだったことを意味すると曖昧さを取りました。

+0

どうすればこれをコンパイルできますか?何がnumaヘッダーですか? – sloven

+0

@Nik numa_maps 'Library support'に従ってnumactlまたはnumactl-develをインストールする必要があります。 –