En Linux, quiero migrar las páginas de memoria de una máquina virtual KVM de un nodo NUMA a otro nodo NUMA en tiempo de ejecución. Pero no puedo encontrar ninguna interfaz para hacer eso en el hipervisor KVM o usando la API libvirt. Luego intenté usar la numa_migrate_pages
función -lnuma
y migrar las páginas de memoria del proceso VM. Pero descubrí que la numa_migrate_pages
función solo puede migrar algunas páginas, no puede migrar todas las páginas. Por ejemplo, el texto a continuación muestra la distribución de páginas de memoria de este proceso de VM:
Node0: 0 pages
Node1: 1538 pages
Node2: 270641 pages
Node3: 552 pages
Y quiero migrar todas las páginas en Node2 a Node0. Pero después de usar la numa_migrate_pages
función, solo se migran algunas páginas, como muestra el texto a continuación:
Node0: 7952 pages
Node1: 1538 pages
Node2: 262113 pages
Node3: 552 pages
Luego abro el archivo y encuentro que la mayoría de las páginas que quedan en el Nodo2 son páginas anónimas y sucias:/proc/[pid of VM process]/numa_maps
7f572c000000 default anon=262143 dirty=262143 N2=262113 ...
Entonces, ¿por qué no se pueden migrar todas las páginas del Nodo2 al Nodo0? ¿Cuál es el problema aquí?
Respuestas:
Desea el
migratepages
binario en elnumactl
paquete.Uso y ejemplo
Limitaciones
Hardware VM
Las páginas pueden estar bloqueadas a un nodo, por ejemplo. si se relacionan con el paso de hardware y representan hardware ubicado en un nodo específico.
Memoria libre y tamaño de página
Obviamente, necesita suficiente memoria libre en el nodo de destino, pero también no debe estar demasiado fragmentado para mover páginas grandes. Si una de las páginas es una asignación contigua de orden grande, y la memoria libre del nodo de destino no tiene regiones libres lo suficientemente grandes, entonces el movimiento de la página grande puede fallar (dependiendo de que la compactación se active y tenga éxito).
fuente