Balão de memória no sistema operacional

13

Alguns hipervisores otimizam o uso da memória usando um método chamado balão (pelo menos é o que a KVM chama), esse método deduplica a memória entre VMs e define páginas comuns como somente leitura com cópia na gravação.
É o oposto de uma chamada de bifurcação.

É possível implementar no nível do sistema operacional para processos (eu estava pensando principalmente na duplicação de memória ao navegar com o Chromium com várias guias no mesmo site), já foi implementado?

Didi Kohen
fonte

Respostas:

14

Na verdade, o que você descreveu confunde balão e 'mesclagem na mesma página'. Vou tentar elaborar os dois para tornar a distinção aparente.

Balão de memória

Esse é um truque para garantir que parte da memória alocada para a máquina virtual convidada permaneça utilizável por outro convidado ou pelo próprio host (caches, etc). É feito da seguinte maneira:

O kernel convidado é injetado com um driver, que monitora o uso da memória do convidado e 'rouba' parte da memória não utilizada (alocando-o no espaço de memória do convidado, garantindo que nada nesse convidado possa tocar nesse intervalo).

Em seguida, ele informa ao kernel do host que, de fato, pode remover essas páginas de memória do núcleo, que elas não serão usadas no convidado (até que o convidado experimente alguma pressão de memória, momento em que o balão irá esvaziar e usar esses intervalos novamente).

Por fim, o kernel pode alocar exatamente a mesma memória para outro convidado e tornar todo o uso da memória muito mais eficiente se os convidados estiverem executando com muita memória livre.

Mesclagem na mesma página

Essa técnica identifica páginas de memória idênticas, que por algum motivo ainda não estão marcadas como 'somente leitura' com cópia na gravação e as marca como tal.

Agora, no nível do sistema operacional, há uma necessidade limitada desses tipos de truques. Simplesmente, na maioria das vezes, quando você tem páginas de memória idênticas, elas já são somente leitura (às vezes até sem CoW), pois geralmente são códigos de aplicativos, bibliotecas etc. Elas são nativamente abertas por meio de um Mapa de Memória e, portanto, o kernel pode manter apenas uma cópia delas no núcleo (se houver alguma), também pode paginar completamente e permitir que ela seja paginada do repositório principal, conforme necessário).

No nível do SO virtualizado, o mesmo princípio é aplicado adequadamente em cada subsistema convidado. No entanto, o kernel host não tem idéia se dois dos convidados estão executando principalmente o mesmo código e, portanto, estão compartilhando a mesma memória - os convidados não se comunicam para coordenar isso.

É por isso que ocasionalmente pode verificar todo o sistema de páginas de memória idênticas - a maior parte do tempo, eles vão ser idênticos em todo o sistema operacional convidado de, não dentro de cada um - o kernel convidado faz um trabalho decente manter a memória pura dentro de sua faixa. Assim, no ambiente típico de VM, onde um kernel host lida com mais de 50 convidados, a economia de memória pode ser bastante substancial.

Ambos de uma só vez

O balão e a mesclagem na mesma página podem coexistir muito bem, obtendo uma supercompromoção de memória bastante substancial para sistemas idênticos.


Para responder à sua pergunta - a mesclagem de mesma página pode e às vezes é ativada no nível do sistema operacional. Tem a ver com o compartilhamento de páginas que é interpretado e, portanto, pode acabar sendo idêntico sem ter o mesmo arquivo de backup.

No seu exemplo do Chromium - os próprios binários do processo já estão deduplicados por meio do mapa de inicialização somente leitura - eles compartilham exatamente o mesmo espaço de memória. Os caches de página (conteúdo das guias) geralmente também são compartilhados entre os processos (cópia somente na gravação), devido à maneira como o cache do disco é gerenciado - o mesmo arquivo em disco pode ser aberto simultaneamente entre processos diferentes na VM sentido ótimo.

A vantagem seria mais evidente com o estado compartilhado de diferentes mecanismos Javascript - mas não tenho certeza se eles estão alocados exatamente no mesmo layout de memória, garantindo que a página inteira da memória seja idêntica.

Isso é diferente em sistemas móveis. O Android, por exemplo, emprega extensivamente o KSM para desduplicar código idêntico entre aplicativos diferentes.

Em qualquer um dos casos, você pode ativá-lo no Linux (Kernel SamePage Merging). O driver exporta várias estatísticas que, depois de ler esta resposta, você deve ser capaz de interpretar e tomar sua própria decisão se é uma boa combinação para o seu objetivo.

https://www.kernel.org/doc/Documentation/vm/ksm.txt

qdot
fonte
3
A mesclagem na mesma página também é chamada de 'memória transcendente', dependendo do hypervisor (e da idade).
Tim Post
Obrigado, vejo que o KSM exige que o aplicativo esteja ciente e, a partir de uma pesquisa (rápida), o Chromium não oferece suporte a partir de agora. Estou ciente de que os binários são duplicadas, mas estou principalmente referindo-se à saída de JIT e os scripts matérias que colocam uma forte pressão sobre a minha RAM ...
Os scripts brutos no Chromium também são deduplicados - eles pousam no cache do disco, como em todos os outros objetos da Web, e o cache do disco é mapeado, e não lido.
Qdot
Os scripts brutos são mapeados, mas mesmo os scripts comuns (como jQuery e Angular.js) são replicados no cache e não são compatíveis entre si, pois há um uso intenso de CDNs e réplicas exatas de arquivos de script nos vários servidores do site.
Provavelmente isso deve acabar no bate-papo, mas eu adoraria ver suas estatísticas do KSM do Linux.
qdot 26/08/14