No Linux, desejo migrar as páginas de memória de uma máquina virtual KVM de um nó NUMA para outro nó NUMA no tempo de execução. Mas não consigo encontrar nenhuma interface para fazer isso no hypervisor KVM ou usando a API libvirt. Depois, tentei usar a numa_migrate_pages
função -lnuma
e migrar as páginas de memória do processo da VM. Mas descobri que a numa_migrate_pages
função pode migrar apenas algumas páginas, não pode migrar todas as páginas. Por exemplo, o texto abaixo mostra a distribuição das páginas de memória deste processo da VM:
Node0: 0 pages
Node1: 1538 pages
Node2: 270641 pages
Node3: 552 pages
E eu quero migrar todas as páginas no Nó2 para o Nó0. Mas depois de usar a numa_migrate_pages
função, apenas algumas páginas são migradas, como mostra o texto abaixo:
Node0: 7952 pages
Node1: 1538 pages
Node2: 262113 pages
Node3: 552 pages
Em seguida, abro o arquivo e percebo que a maioria das páginas restantes no Node2 são páginas anônimas e sujas:/proc/[pid of VM process]/numa_maps
7f572c000000 default anon=262143 dirty=262143 N2=262113 ...
Então, por que não é possível migrar todas as páginas no Nó2 para o Nó0? Qual é o problema aqui?
Respostas:
Você quer o
migratepages
binário nonumactl
pacote.Uso e exemplo
Limitações
Hardware da VM
As páginas podem ser bloqueadas para um nó, por exemplo. se eles estiverem relacionados à passagem de hardware e representam hardware localizado em um nó específico.
Memória livre e tamanho da página
Obviamente, você precisa de memória livre suficiente no nó de destino, mas também não precisa ser fragmentado demais para mover páginas grandes. Se uma das páginas for uma alocação contígua de ordem grande e a memória livre do nó de destino não tiver regiões livres grandes o suficiente, a movimentação da página grande poderá falhar (dependendo da compactação sendo acionada e bem-sucedida).
fonte