Unter Linux möchte ich die Speicherseiten einer virtuellen KVM-Maschine zur Laufzeit von einem NUMA-Knoten auf einen anderen NUMA-Knoten migrieren. Ich kann jedoch keine Schnittstellen dafür im KVM-Hypervisor oder unter Verwendung der libvirt-API finden. Dann habe ich versucht, die numa_migrate_pages
Funktion in zu verwenden -lnuma
und die Speicherseiten des VM-Prozesses zu migrieren. Ich habe jedoch festgestellt, dass die numa_migrate_pages
Funktion nur einige Seiten migrieren kann, nicht alle Seiten. Der folgende Text zeigt beispielsweise die Verteilung der Speicherseiten dieses VM-Prozesses:
Node0: 0 pages
Node1: 1538 pages
Node2: 270641 pages
Node3: 552 pages
Und ich möchte alle Seiten in Node2 auf Node0 migrieren. Nach Verwendung der numa_migrate_pages
Funktion werden jedoch nur einige Seiten migriert, wie der folgende Text zeigt:
Node0: 7952 pages
Node1: 1538 pages
Node2: 262113 pages
Node3: 552 pages
Dann öffne ich die Datei und stelle fest, dass die meisten auf Node2 verbleibenden Seiten anonyme und schmutzige Seiten sind:/proc/[pid of VM process]/numa_maps
7f572c000000 default anon=262143 dirty=262143 N2=262113 ...
Warum können nicht alle Seiten in Node2 auf Node0 migriert werden? Was ist das Problem hier?
Antworten:
Sie möchten die
migratepages
Binärdatei imnumactl
Paket haben.Verwendung & Beispiel
Einschränkungen
VM-Hardware
Seiten können an einen Knoten gebunden sein, z. wenn sie sich auf Hardware-Pass-Through beziehen und Hardware darstellen, die sich auf einem bestimmten Knoten befindet.
Freier Speicher und Seitengröße
Sie benötigen natürlich genügend freien Speicher auf dem Zielknoten, aber er muss auch nicht zu fragmentiert sein, um große Seiten zu verschieben. Wenn eine der Seiten eine zusammenhängende Zuordnung großer Ordnung ist und der freie Speicher des Zielknotens keine freien Bereiche hat, die groß genug sind, schlägt das Verschieben der großen Seite möglicherweise fehl (abhängig davon, ob die Komprimierung ausgelöst wird und erfolgreich ist).
quelle