Sous Linux, je souhaite migrer les pages mémoire d'une machine virtuelle KVM d'un nœud NUMA vers un autre nœud NUMA lors de l'exécution. Mais je ne trouve aucune interface pour le faire dans l'hyperviseur KVM ou en utilisant l'API libvirt. J'ai ensuite essayé d'utiliser la numa_migrate_pages
fonction dans -lnuma
et de migrer les pages mémoire du processus VM. Mais j'ai trouvé que la numa_migrate_pages
fonction ne peut migrer que certaines pages, elle ne peut pas migrer toutes les pages. Par exemple, le texte ci-dessous montre la distribution des pages mémoire de ce processus VM:
Node0: 0 pages
Node1: 1538 pages
Node2: 270641 pages
Node3: 552 pages
Et je veux migrer toutes les pages de Node2 vers Node0. Mais après avoir utilisé la numa_migrate_pages
fonction, seules certaines pages sont migrées, comme le montre le texte ci-dessous:
Node0: 7952 pages
Node1: 1538 pages
Node2: 262113 pages
Node3: 552 pages
Ensuite, j'ouvre le fichier et constate que la plupart des pages restantes sur Node2 sont des pages anonymes et sales:/proc/[pid of VM process]/numa_maps
7f572c000000 default anon=262143 dirty=262143 N2=262113 ...
Alors pourquoi toutes les pages de Node2 ne peuvent-elles pas être migrées vers Node0? Quel est le problème ici?
Réponses:
Vous voulez le
migratepages
binaire dans lenumactl
paquet.Utilisation et exemple
Limites
Matériel VM
Les pages peuvent être verrouillées sur un nœud, par exemple. s'ils sont liés à la transmission matérielle et qu'ils représentent du matériel situé sur un nœud spécifique.
Mémoire libre et taille de page
Vous avez évidemment besoin de suffisamment de mémoire libre sur le nœud de destination, mais il doit également ne pas être trop fragmenté pour déplacer de grandes pages. Si l'une des pages est une allocation contiguë d'ordre important et que la mémoire libre du nœud de destination n'a pas de régions libres suffisamment grandes, le déplacement de la grande page peut échouer (selon le compactage déclenché et réussi).
la source