Di Linux, saya ingin memigrasi halaman memori mesin virtual KVM dari satu simpul NUMA ke simpul NUMA lainnya saat runtime. Tetapi saya tidak dapat menemukan antarmuka untuk melakukan itu di hypervisor KVM atau menggunakan API libvirt. Kemudian saya mencoba menggunakan numa_migrate_pages
fungsi dalam -lnuma
, dan memigrasi halaman memori dari proses VM. Tetapi saya menemukan bahwa numa_migrate_pages
fungsinya hanya dapat memigrasi beberapa halaman, tidak dapat memigrasi semua halaman. Misalnya, teks di bawah ini menunjukkan distribusi halaman memori dari proses VM ini:
Node0: 0 pages
Node1: 1538 pages
Node2: 270641 pages
Node3: 552 pages
Dan saya ingin memigrasi semua halaman di Node2 ke Node0. Tetapi setelah menggunakan numa_migrate_pages
fungsi, hanya beberapa halaman yang dimigrasikan, seperti yang ditunjukkan oleh teks di bawah ini:
Node0: 7952 pages
Node1: 1538 pages
Node2: 262113 pages
Node3: 552 pages
Lalu saya membuka file, dan menemukan bahwa sebagian besar halaman yang tersisa di Node2 adalah halaman anonim dan kotor:/proc/[pid of VM process]/numa_maps
7f572c000000 default anon=262143 dirty=262143 N2=262113 ...
Jadi mengapa tidak semua halaman di Node2 dapat dimigrasi ke Node0? Apa masalahnya di sini?