terça-feira, 5 de outubro de 2010

Como funciona o gerenciamento de memória no ESX? – Parte 2

                 

Como foi dito no post anterior, o ESX não sabe quando uma página de memória física da máquina virtual foi liberada ou não, por isso, para resolver esse problema, foram criadas as técnicas de recuperação de memória (Memory Reclamation). Sem essas técnicas não seria possível alocar para as máquinas virtuais mais memória do que a memória física existente no host ESX, o que chamamos de sobrecarga de memória (Memory Overcommited).

Um ambiente virtual é composto de diversas máquinas virtuais, umas trabalhando a todo vapor, consumindo todos os recursos que lhe foram oferecidos e outras nem tanto. E é aí que as técnicas de recuperação de memória entram, para recuperar memória física do host que está alocada para uma VM, mas que não está sendo usada, e disponibilizá-la para que outra máquina virtual possa usá-la.

As seguintes técnicas de recuperação de memória estão presentes no ESX:

1. TPS – Transparent Page Sharing
2. Ballooning
3. Memory Compression (disponível a partir do lançamento da versão 4.1)
4. Swapping

Vamos às explicações sobre como cada uma delas funciona.

Transparente Page Sharing (TPS)

Primeiramente vamos à tradução do nome, que é Compartilhamento Transparente de Páginas, com isso já temos uma idéia do que pode ser essa técnica, não é mesmo?

Bem, quando temos várias máquinas virtuais rodando num mesmo host, é bem provável que muitas delas possuam algumas coisas em comum, como por exemplo, o mesmo sistema operacional. Com a utilização da técnica do TPS, é possível que as máquinas virtuais que possuem páginas de memória idênticas compartilhem essas páginas, permitindo que o ESX armazene apenas uma cópia desta página em sua memória física.

Mas como o ESX identifica que uma VM possui uma página de memória idêntica à de outra VM? Através do seu conteúdo. De tempos em tempos, o ESX varre o conteúdo de toda a memória física de uma máquina virtual (Guest Physical Memory) em busca de páginas que possam ser compartilhadas. Para cada página que é vasculhada pelo ESX, um valor de ‘hash’ é gerado, em seguida este valor é comparado com valores existentes em uma tabela com o ‘hash’ de várias páginas que estão compartilhadas e suas respectivas localizações na memória física do host.



Caso o ESX encontre alguma entrada na tabela que se assemelhe ao valor de ‘hash’ da página de memória da VM, então uma comparação mais detalhada é feita entra as duas páginas para confirmar que as duas são mesmo idênticas. Depois de confirmado que as páginas são idênticas, o mapeamento que existe para aquela página de memória da memória física da máquina virtual (Guest Physical Memory) para a memória física do host (Machine Physical Memory) é alterado e passa a apontar para página de memória que já está compartilhada na memória física do host (a página toda vermelha na imagem acima). A outra página (a listrada de vermelho na imagem acima) é então recuperada e fica disponível para que outra máquina virtual possa utilizá-la.
Mas... se duas ou mais VM’s compartilham a mesma página de memória, quando uma delas fizer alguma alteração nesta página, isso não irá afetar às demais?? Não! Estas páginas compartilhadas são somente leitura (Read-Only), portanto quando uma das máquinas virtuais tenta alterar o conteúdo desta pagina, acontece um ‘Page Fault’ e o ESX faz uma cópia daquela página em uma outra página da sua memória física, permitindo que aquela VM altere o conteúdo da página sem interferir nas demais máquinas virtuais que acessam àquela página compartilhada.

É importante lembrar que a técnica de TPS está sempre ativa, independente se o host possui memória livre suficiente ou não.

É possível ver informações sobre o funcionamento do TPS através da ferramenta ‘esxtop’ na console do ESX. Veja a imagem abaixo:



O contador a ser observado é o “PSHARE”. O valor ‘shared’ é a quantidade total de memória física das máquinas virtuais que está sendo compartilhada. O valor ‘common’ é a quantidade de memória física do host sendo utilizada para compartilhar a memória física das VM’s. O ‘saving’ é a quantidade de memória que está sendo economizada no host através da utilização do TPS.

Ballooning

O ‘ballooning’ é uma técnica de recuperação de memória completamente diferente da técnica de TPS. A começar pela sua utilização, diferentemente da técnica de TPS que já está ativa por padão, a técnica de ballooning só entra em cena quando o host encontra-se realmente com pouca memória livre disponível ou se a VM possui o parâmetro de configuração ‘Limit’ setado.

A técnica consiste em um driver de balloon (vmmemctl) que é carregado no sistema operacional da máquina virtual através do VMTools. Quando um host precisa recuperar alguma memória da máquina virtual ele informa para o driver de balloon a quantidade de memória que ele precisa, em seguida o driver de balloon começa a inflar dentro do sistema operacional, fazendo que o mesmo utilize suas próprias técnicas de gerenciamento de memória para oferecer a memória necessária ao driver de balloon. Ou seja, caso haja memória livre suficiente dentro dá máquina virtual, serão oferecidas ao driver de balloon as páginas de memória contidas na lista de páginas livre da VM, caso a VM não possua aquela quantidade de memória suficiente, a VM irá fazer paginação das páginas de memória menos utilizadas para liberar memória para o driver de balloon.



Depois de inflado, o driver de balloon avisa ao hypervisor quais foram as páginas de memória física da VM que foram alocadas, então o host ESX encontra a página de memória correspondente na memória física do host e em seguida recupera aquela página para ser utilizada por outra VM.

Como já foi dito anteriormente o driver de ballon é instalado juntamente com o VMTools, portanto para que o mesmo funcione corretamente é necessário que o VMTools esteja instalado na máquina virtual. Além disso, é necessário que dentro do S.O da máquina virtual exista espaço suficiente para a paginação de memória.

Memory Compression

A técnica de Memory Compression é bastante simples. Introduzida a partir do lançamento da versão 4.1 do VSphere, a técnica de Memory Compression entra em cena quando o host está sob pressão e mesmo com a ajuda das técnicas de TPS e Ballooning, não foi possível recuperar memória suficiente, então, ao invés de fazer swap para disco das páginas físicas que serão recuperadas de uma VM, o ESX irá comprimir estas páginas e armazena-las em um cache de compreensão.

Para que uma página comprimida seja armazenada no cache, é necessário que a taxa de compreensão tenha sido de no mínimo 50%, ou seja, uma página de 4KB quando comprimida, será armazenada no cache ocupando um espaço de 2KB.

É importante observar que apenas as páginas selecionadas para o ‘swap’ podem ser comprimidas, ou seja, o ESX não age pró-ativamente, comprimindo as páginas de memória de uma VM, isso só ocorre quando o host necessita fazer swap.
Suponhamos que um host ESX necessite recuperar duas páginas de memória, com 4KB cada, de uma determinada máquina virtual. Foram selecionadas as páginas A e B (figura a). Se existisse apenas a técnica de swap, essas duas páginas seriam transferidas diretamente para o disco e o host recuperaria aquela quantidade de memória (figura b). Com a técnica de Memory Compression, cada uma das paginas selecionadas para o swap, seria comprimida e armazenado no cache de compreensão daquela VM, ocupando um espaço de 2KB, metade do seu tamanho original (figura c). Veja que a compreensão de memória é muito mais rápida do que a operação de swap, já que não necessita executar I/O em disco.



Quando uma dessas páginas comprimidas for acessada pela VM, ela será então descomprimida e devolvida à memória física da máquina virtual. Em seguida a página é removida do cache de compreensão.

Cada máquina virtual possui o seu próprio cache de compreensão, ou seja, nenhuma memória adicional do host é necessária durante a utilização do Memory Compression. Por padrão este cache pode ocupar até 10% da memória física da VM. Este valor pode ser alterado nas configurações avançadas no Vsphere Client através do parâmetro Mem.MemZipMaxPct.

Swapping

Quando nenhuma das técnicas de recuperação de memória é suficiente, o ESX utiliza como um último recurso para recuperar memória a técnica de ‘swap’.

Durante a inicialização de uma máquina virtual é criado um arquivo ‘.vswp’ no disco, que é utilizado durante o processo de swapping. Quando o host sente a necessidade de fazer o swapping, ele transfere páginas da memória física da VM para este arquivo, liberando essas páginas na memória física do host para serem utilizadas por outras máquinas virtuais.

Como este processo é feito sem nenhum envolvimento do S.O da máquina virtual, pode ocorrer de páginas que estão ativas serem transferidas para o arquivo de swap.

Devido às necessidades de acesso a disco que esta técnica implica, a performance de uma VM que está fazendo swap é drasticamente afetadda.


Fontes:
http://www.van-lieshout.com/2009/05/esx-memory-management-%E2%80%93-part-3/
http://www.vmware.com/files/pdf/techpaper/vsp_41_perf_memory_mgmt.pdf
http://www.vmware.com/files/pdf/perf-vsphere-memory_management.pdf

2 comentários:

  1. Tiago, meu nome é Rafael trabalho no setor publico federal e sou um grande fã, além de utilizador de virtualização através de VMware. Queria parabeniza-lo pelo blog, textos com ótima clareza e ótimas dicas sobre Virtualização.

    Bem, lendo os posts sobre memória do ESX, tive um dúvida sobre a técnica de Swapping. Utilizo no meu ambiente ESXi 4.0(última versão) e através do monitor Vsphere client percebo que meu host ESXi está com a carga de 75% ou menos de utilização de memoria, ou seja, ainda há espaço para as VMs e mesmo assim vejo o apareceminto de arquivos de swap(.vswp). Isto só deveria acontecer em caso de utilização extrema da memoria do ESX pela VMs?

    Um abraço.

    ResponderExcluir
  2. Olá Rafael. Agradeço aos elogios sobre o blog.
    Quanto a sua dúvida sobre os arquivos '.vswp', estes são criados quando uma VM é ligada e removidos quando a mesma é desligada. O tamanho do arquivo é igual à quantidade de memória alocada para a máquina virtual, exceto se houver algum reservation para a máquina, aí o tamanho do arquivo será igual a quantidade de memória alocada menos a quantidade reservada. O fato do arquivo existir não quer dizer que o host esteja sobrecarregado e consequentemente fazendo o swapping. A melhor maneira de acompanhar se suas máquinas virtuais estão fazendo swap é pelo esxtop. No seu caso que é ESXi, execute o resxtop a partir de uma vMA. Segue um link sobre como fazer isso: http://gestaltit.com/all/tech/virtualization/simon/esxtop-vmware-esxi/

    ResponderExcluir