W systemie Linux chcę przeprowadzić migrację stron pamięci maszyny wirtualnej KVM z jednego węzła NUMA do innego węzła NUMA w czasie wykonywania. Ale nie mogę znaleźć żadnych interfejsów w hiperwizorze KVM lub za pomocą interfejsu API libvirt. Następnie próbowałem użyć numa_migrate_pages
funkcji w -lnuma
i przeprowadzić migrację stron pamięci procesu VM. Ale odkryłem, że numa_migrate_pages
funkcja może migrować tylko niektóre strony, nie może migrować wszystkich stron. Na przykład poniższy tekst pokazuje rozkład stron pamięci tego procesu maszyny wirtualnej:
Node0: 0 pages
Node1: 1538 pages
Node2: 270641 pages
Node3: 552 pages
Chcę migrować wszystkie strony w Node2 do Node0. Ale po użyciu numa_migrate_pages
funkcji migrowane są tylko niektóre strony, jak pokazuje poniższy tekst:
Node0: 7952 pages
Node1: 1538 pages
Node2: 262113 pages
Node3: 552 pages
Następnie otwieram plik i stwierdzam, że większość stron pozostawionych w Node2 to anonimowe i brudne strony:/proc/[pid of VM process]/numa_maps
7f572c000000 default anon=262143 dirty=262143 N2=262113 ...
Dlaczego więc nie można migrować wszystkich stron w Node2 do Node0? W czym problem?
Odpowiedzi:
Chcesz
migratepages
plik binarny wnumactl
pakiecie.Użycie i przykład
Ograniczenia
Sprzęt VM
Strony mogą być zablokowane w węźle, np. jeśli odnoszą się do przekazywania sprzętowego i reprezentują sprzęt zlokalizowany w określonym węźle.
Wolna pamięć i rozmiar strony
Oczywiście potrzebna jest wystarczająca ilość wolnej pamięci w węźle docelowym, ale nie musi ona również być zbyt pofragmentowana, aby przenosić duże strony. Jeśli jedna ze stron jest ciągłym przydziałem dużego rzędu, a wolna pamięć węzła docelowego nie ma wystarczająco wolnych wolnych regionów, wówczas przenoszenie dużej strony może się nie powieść (w zależności od uruchomienia i udanego kompakowania).
źródło