Eu tenho uma máquina que é destinada para uso geral e que eu também usei para executar uma máquina virtual QEMU. Como a máquina virtual deve ser a mais eficiente possível, quero fazer o backup da memória da VM com mais de uma página, idealmente, 1GB de página. A máquina tem 32GB de RAM e eu quero fornecer 16 para a VM. O problema é que, durante o uso normal da máquina, talvez precise usar todos os 32GB, portanto, alocar os 16G de hugepages na inicialização não é uma opção.
Para contornar isso, eu tenho um script de gancho que aloca o 16G de hugepages quando a VM é inicializada. Como você pode esperar, por 1GB de página, isso falha se a máquina host tiver sido usada por qualquer período de tempo (parece funcionar de forma confiável com 2M hugepages, embora isso não seja o ideal).
O que eu não entendo é exatamente porque isso está acontecendo. Por exemplo, posso abrir vários aplicativos (janela do navegador, editor de código, etc. apenas para forçar alguma fragmentação para teste) e, em seguida, fechá-los para que somente minha área de trabalho esteja aberta. Meus usos de memória neste caso são em torno de 2.5G / 32G.
Existe realmente nenhuma maneira que o kernel possa encontrar 16 páginas 1G de memória alinhada contígua, dos 30G restantes de RAM, que parece uma fragmentação muito alta. Além disso, posso correr
$ sudo tee /proc/sys/vm/compact_memory <<<1
para tentar desfragmentar a RAM, mas, mesmo assim, nunca aloquei com sucesso 16 1G hugepages para a VM. Isso é particularmente chocante para mim, já que depois de desfragmentar apenas 2.5G de RAM, os 30G ainda não são contíguos ou alinhados.
O que eu estou entendendo mal sobre esse processo? Isso parece um comportamento esperado? Além disso, existe alguma maneira de verificar se compact_memory
realmente fez alguma coisa? Não vejo nenhuma saída em dmesg
ou similar depois de executar esse comando.