Compreendendo a fragmentação de memória principal e as abreviaturas

4

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.

    
por Max Ehrlich 20.06.2018 / 16:53

0 respostas