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?
Jawaban:
Anda ingin
migratepages
biner dalamnumactl
paket.Penggunaan & Contoh
Keterbatasan
Perangkat keras VM
Halaman dapat dikunci ke suatu simpul, mis. jika mereka terkait dengan hardware pass-through dan mereka mewakili perangkat keras yang terletak pada node tertentu.
Memori & Ukuran Halaman Gratis
Anda jelas membutuhkan cukup memori bebas pada node tujuan, tetapi juga tidak perlu terlalu terfragmentasi untuk memindahkan halaman besar. Jika salah satu halaman adalah alokasi berdampingan pesanan besar, dan memori bebas simpul tujuan tidak memiliki daerah bebas yang cukup besar, maka memindahkan halaman besar mungkin gagal (tergantung pada pemadatan yang dipicu & berhasil).
sumber