あるNUMAノードから別のノードにプロセスのすべてのメモリページを移行する方法は?

あるNUMAノードから別のノードにプロセスのすべてのメモリページを移行する方法は?

Linuxでは、実行時にKVM仮想マシンのメモリページをあるNUMAノードから別のノードに移行したいと思います。ただし、KVMハイパーバイザーまたはlibvirt APIを使用してこの操作を実行できるインターフェースを見つけることはできません。その後、VMプロセスのメモリページnuma_migrate_pagesで機能を使用して移行してみました。しかし、この機能は、ページ全体ではなく一部のページのみを移行できること-lnumaを発見しました。numa_migrate_pagesたとえば、次のテキストは、このVMプロセスのメモリページ展開を示しています。

Node0:  0             pages
Node1:  1538          pages
Node2:  270641        pages
Node3:  552           pages

Node2のすべてのページをNode0に移行したいと思います。ただし、この機能を使用した後は、次のようにnuma_migrate_pages一部のページのみが移行されます。

Node0:  7952          pages
Node1:  1538          pages
Node2:  262113        pages
Node3:  552           pages

その後、ファイルを開き、Node2に残っているほとんどのページが匿名ページとダーティページであることがわかりました。/proc/[pid of VM process]/numa_maps

7f572c000000 default anon=262143 dirty=262143 N2=262113 ...

それでは、Node2のすべてのページをNode0に移行できないのはなぜですか?ここで問題は何ですか?

ベストアンサー1

migratepagesパッケージにバイナリが必要ですnumactl

使い方と例

sudo migratepages $VM_PID $SRC_NODE $DEST_NODE
sudo migratepages 12345 2 0

限定

仮想マシンハードウェア

ページはノードにロックできます。ハードウェアパススルーに関連し、特定のノードにあるハードウェアを表す場合。

利用可能なメモリとページサイズ

明らかに、ターゲットノードには十分なメモリが必要ですが、大きなページを移動するには断片化しすぎてはいけません。ページの1つが大規模な順次割り当てであり、ターゲットノードの使用可能なメモリに十分な空き容量がない場合、大規模なページの移動は失敗する可能性があります(トリガと圧縮の成功によって異なります)。

おすすめ記事