8

ホストが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を使用しています。

4

2 に答える 2

8

これらの/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
于 2012-04-11T16:31:18.333 に答える
1

Oracleドキュメントには次のようにも記載されています。

注:Linuxカーネルには既知のバグがあり、-XX:UseNUMAを指定するとJVMがクラッシュする可能性があります。このバグは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が最初の安全なバージョンであることを意味しました。

于 2015-01-21T21:26:47.880 に答える