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つが大規模な順次割り当てであり、ターゲットノードの使用可能なメモリに十分な空き容量がない場合、大規模なページの移動は失敗する可能性があります(トリガと圧縮の成功によって異なります)。