numa -
非対称型メモリアーキテクチャの概要
非対称型メモリアクセス
(Non-Uniform Memory Access; NUMA) は、
メモリが複数のメモリノードに分割されているマルチプロセッサシステム
のことである。メモリノードへのアクセス時間は、アクセス元の
CPU と
アクセス先のノードの相対的な位置関係に依存する
(これに対し、対称型マルチプロセッサシステムでは、どの
CPU から
どのメモリへのアクセス時間も同じである)。
通常は、 NUMA
システムの各 CPU
にはローカルのメモリノードがあり、
そのメモリノードには、他の
CPU
のローカルノードや全ての
CPU で
共有されるバス上のメモリよりも早くアクセスすることができる。
NUMA システムコール¶
Linux
カーネルには、次に示す
NUMA
関連のシステムコールが実装されている:
get_mempolicy(2),
mbind(2),
migrate_pages(2),
move_pages(2),
set_mempolicy(2).
ただし、アプリケーションは通常は
libnuma
が提供するインターフェース
を使用すべきである。下記の「ライブラリによるサポート」を参照。
/proc/[number]/numa_maps (Linux 2.6.14 以降)¶
このファイルは、プロセスの
NUMA
メモリポリシーと割り当てに関する
情報を表示する。
各行に、そのプロセスが使用しているメモリ領域に関する情報が表示される。その他の情報
—
そのメモリ領域に適用されているメモリポリシーや、そのページがどのノード上に割り当てられているか、など
—
もあわせて表示される。
numa_maps
は読み出し専用のファイルである。
/proc/<pid>/numa_maps
から読み出しが行われると、
カーネルはそのプロセスの仮想アドレス空間をスキャンし、
メモリの使用状況を報告する。
プロセスのメモリ領域の情報が
1 行に 1
領域で表示される。
各行の最初のフィールドはメモリ領域の開始アドレスを示す。
このフィールドは
/proc/<pid>/maps
ファイルの内容と対応している。
/proc/<pid>/maps
には、メモリ領域の末尾のアドレスや、アクセス許可や共有といった他の情報も含まれる。
2
番目のフィールドは、
そのメモリ領域に現在適用されているメモリポリシーを示す。
適用されているポリシーは、
必ずしもそのプロセスがこのメモリ領域に対して設定したポリシーとは限らない点に注意すること。
特に、
プロセスがその領域に対して「デフォルト」ポリシーを設定した場合、その領域に適用されるポリシーはプロセスのポリシーとなり、それが「デフォルト」ポリシーとなる場合もあればそうでない場合もある。
行の残りの部分には、そのメモリ領域に割り当てられたページに関する情報が入る。以下に詳細を示す。
- N<node>=<nr_pages>
- <node>
に割り当てられているページ数。
<nr_pages> には、
そのプロセスが現在マッピングしているページだけが含まれる。
ページの移動やメモリの再利用により、
このメモリ領域に関連付けられているが、
一時的にマッピングされていないページが存在する場合がある。
プロセスがそれらのページを参照しようとした後には、
これらのページは再び現れる可能性がある。
メモリ領域が共有メモリやファイルマッピングの場合には、
そのメモリ領域内に別のページを他のプロセスがマッピングしている場合もある。
- file=<filename>
- そのメモリ領域に関連付けられているファイル。
ファイルがプライベート
(非公開)
でマッピングされている場合、
書き込みアクセスがあると、
このメモリ領域に書き込み時コピー
(Copy-On-Write)
ページが生成されることがある。
これらのページは無名ページ
(anonymous page)
として表示される。
- heap
- ヒープに使用されているメモリ範囲。
- stack
- スタックに使用されているメモリ範囲。
- huge
- ヒュージメモリの範囲。表示されるページ数は、
通常の大きさのページではなく、ヒュージページの数である。
- anon=<pages>
- メモリ範囲内の無名ページ
(anonymous page) の数。
- dirty=<pages>
- dirty (変更された)
ページの数。
- mapped=<pages>
- マッピングされているページ数。
dirty および anon
のページ数と異なる値の場合に表示される。
- mapmax=<count>
- スキャン中に検出した
mapcount
(一つのページをマッピングしているプロセス数)
の最大値。
この値は、
そのメモリ領域でどの程度の共有が行われているかの指標として使うことができる。
- swapcache=<count>
- スワップデバイスに対応するエントリーが存在するページ数。
- active=<pages>
- アクティブリストに入っているページ数。
このフィールドが表示されるのは、
値がこのメモリ領域のページ数と異なる場合だけである。このフィールドが表示されるということは、
このメモリ領域に、まもなくスワッパ
(swapper)
によりこの領域から削除される可能性がある
inactive
なページが存在することを意味する。
- writeback=<pages>
- 現在ディスクに書き出されているページ数。
NUMA
インターフェースについて規定している標準はない。
Linux の NUMA
システムコールと
/proc
インターフェースは、カーネルが
設定オプション
CONFIG_NUMA
を有効にして作成されている場合のみ、利用
可能である。
ライブラリによるサポート¶
システムコールの定義を得るには
-lnuma
でリンクすること。
libnuma
と必要なヘッダファイル
<numaif.h> は
numactl
パッケージで提供されている。
ただし、アプリケーションはこれらのシステムコールを直接利用すべきでない。
推奨される方法は、
numactl パッケージの
numa(3)
の関数群が提供する
高レベルインターフェースの利用である。
numactl パッケージは
ftp://oss.sgi.com/www/projects/libnuma/download/
で入手できる。
このパッケージが収録されている
Linux
ディストリビューションもある。
ディストリビューションによっては、開発用のライブラリとヘッダファイルは
別パッケージ
numactl-devel
で提供されている。
関連項目¶
get_mempolicy(2),
mbind(2),
move_pages(2),
set_mempolicy(2),
numa(3),
cpuset(7),
numactl(8)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。