2

Linux用のユーザーモードNUMA対応メモリアロケータを構築しています。初期化中のアロケータは、NUMA ノードごとに 1 つのチャンクである大量のメモリ チャンクを取得します。この後、ユーザーが要求したメモリー・ページは、ラージ・チャンク・プールからできるだけ多くのメモリー・ページを提供することで満たされます。

ユーザーが n ページを要求した場合、特定のチャンクから n ページを提供するのは簡単です。しかし今は、インターリーブ割り当てポリシーを実装したいと考えています。このポリシーでは、ユーザーは各チャンクから 1 ページをラウンドロビン方式で最大 n ページ取得します。これにより、これらのページの仮想アドレスが連続しなくなるという問題が発生します。

Q1: 仮想的にアドレス可能な連続メモリを返す方法はありますか? 私が考えることができる唯一の解決策は、あるページから別のページにジャンプする方法を知っている「スマート」ポインターを使用することです。

私がこの道を歩んでいる理由の 1 つは、ラウンドロビン ポリシーが厳密ではない (決定論的) Linux の MPOL_INTERLEAVE メモリ割り当てポリシーに満足できないことです。

Q2: 特定の仮想アドレス範囲がどのページと NUMA ノードにマップされているかを安価に知る方法はありますか? より正確には、 /proc/< proc_id >/numa_maps を読み取ってページレベルの詳細な情報を取得する方法がわかりません。

回答ありがとうございます。

4

1 に答える 1

0

A1。実質的に隣接するメモリは、物理メモリが隣接していることを意味するものではありません。Linuxでは、物理ページはmalloc中に仮想ページにバインドされるのではなく、最初のページフォールト中にバインドされます。

本当に必要な場合は、デフォルトの割り当てポリシーを使用して厳密なインターリーブを作成するために、ページを事前にフォールトして特定のnumaノードにバインドできるようにする必要があります。

例えば

N - # numa nodes
PAGES - # pages in allocation

for(i=0; i < N; i++):
   pin current thread to node i
   for(p=i; p < PAGES; p += N)
      touch page p;

それを設定した後、事前にインターリーブされた連続したページをディッシュすることができます。

Q2。move_pagesfromを使用<numaif.h> し、ターゲットノードとしてNULLを渡すことにより、仮想アドレスのNUMAノードを判別できます。現在のノードの場所は、ステータスの戻り値になります。

例えば

int status[1];
move_pages(0, 1, &ptr_to_check,  NULL, status, 0);
于 2012-11-26T08:33:56.033 に答える