Memória Virtual no Hyper-V

Fala galera, 100%?

Falaremos hoje sobre como o recurso de memória virtual do Hyper-V funciona. É de conhecimento geral que a virtualização tem como beneficio (um dos principais, diria) o melhor uso do hardware disponível de um host como CPU, Disco e memória. O último deles, ao meu ver, é o mais desperdiçado e também escasso na maior parte dos ambientes. Tendo com base as premissas acima, a partir do Service Pack 1 do Windows Server 2008 R2 a Microsoft introduziu o recurso de Memoria Dinâmica (Dynamic Memory).

Como o nome propõe esse recurso traz flexibilidade e dinamismo em relação ao uso e gerenciamento da memória disponível. Um exemplo simples: Temos uma aplicação de pequeno porte alocada em uma maquina virtual com 8GB de memória, sabemos que o consumo de memória chegará ao teto em dias pontuais, por poucas horas, no decorrer do uso a maquina consumirá, no máximo 2GB. Esse exemplo ilustra que, em teoria, 6GB do host estão ociosos em mais de 90% do tempo. A utilização de Memória Dinâmica impede que esse tipo de situação ocorra e garante um uso mais inteligente do recurso disponível. Devemos entender alguns conceitos antes de iniciar as configurações.

Para habilitar e ter acesso as configurações de memória dinâmica basta clicar com o botão direito do mouse sobre a VM e selecionar “Settings” (configurações). É importante lembrar que essa opção só pode ser habilitada quando a VM estiver desligada. Vamos as opções de configuração:

Vm_DynamicMemory

  • Startup RAM: Aqui definimos qual a quantidade de memória a maquina virtual precisa para ser ligada. Tenho por pratica buscar os requisitos mínimos de cada sistema para realizar essa configuração. Um ponto importante a ser considerado é que, se no momento de ligar a VM o host não tiver a quantidade de memória disponível definida nesta opção, a mesma não será iniciada (em breve falaremos sobre um recurso que mitiga essa possibilidade).
  • Maximum RAM: Conforme o título propõe, é a quantidade máxima de memória RAM que uma VM poderá consumir. Essa configuração permite que, durante picos de utilização da VM a memória seja expandida até determinada quantidade. O valor definido aqui pode partir da quantidade da Startup RAM até 1TB, respeitando a quantidade de memória que o OS utilizado suporte. Por exemplo: Aloquei 16GB de memória maxima, mas meu SO x86 suporte gerenciar apenas 4GB. Obviamente a memória máxima será limitada a 4GB
  • Minimum RAM: O contrário do item anterior, neste, definimos qual o valor mínimo de RAM a maquina pode alocar. Aqui existem limites, sendo eles o mínimo de 32MB e o máximo sendo o valor definido na Startup RAM.

Uma questão que sempre surge é: Qual sentido em ter valores diferentes entre memória minima e memória de startup? Analisando com mais cuidado chegará a conclusão de que a inicialização de um sistema exige mais recursos do que um S.O ocioso, concorda? Ao realizar o boot, o sistema operacional carregará uma serie de serviços e recursos. Após a inicialização grande parte destes serviços fica ocioso, apenas aguardando uma chamada de sistema para ser executado. Entendido?

  • Memory Buffer: Aplica-se nesta configuração o conceito de buffer. O valor padrão para essa config é de 20%, significa, portante, se uma VM precisa de 1MB o gerenciador de memória dinamica adicionará mais 20MB (20%). Esse buffer é utilizado para atender a maquina virtual, caso o OS precise do recurso de forma muito rápida.
  • Memory Weight: O peso (weight) também pode ser entendido como “Prioridade”. Esse recurso é acionado em momentos que várias VMs solicitam acesso a memória ao host, que, naquele momento, não possui a quantidade solicitada por todas as maquinas virtuais. Os valores vão de 0 (mais baixo) a 100 (mais alto). Em uma disputa, a VM que possuir maior peso/prioridade terá o recurso alocado. Esse valor geralmente é mantido em 50 e deve-se realizar uma analise mais cautelosa para melhor configuração.

E como tudo isso funciona junto, na pratica?

De forma simplificada, tomaremos como base a imagem abaixo:

VirtualMemory

Nossa maquina virtual possui a seguinte configuração: Startup: 1GB; Maximum RAM: 10Gb; Minimum RAM: 256; Buffer: 20%. Ao iniciar, podemos checar no gerenciador de tarefas do windows e teremos o valor de 1GB de memória, pois esse foi o valor definido para inicialização. Após algum tempo de uso o consumo de memória aumentou. O Hyper-V identificou tal mudança e alocou mais 2GB para a VM, passando então a ter 3GB disponível e visível via Gerenciador de Tarefas.

A medida que o S.O for ficando ocioso a memória alocada começará a ser devolvida ao host (removida da maquina virtual). Como não é possível remover memória de uma maquina em funcionamento (virtual ou física), um processo chamado “Ballooning” passa a ocorrer. A memória que for desalocada da VM é “substituida” por “balão” (sim, esse é o termo utilizado) que iludi o sistemas operacional, o fazendo acreditar que existe o recurso. Esse mascaramento pode ser observado no Gerenciador de Tarefas, que continuará a exibir 3GB de memória disponível. Esse valor será atualizado assim que a maquina for reinicializada.

E se a demanda por memória aumentar novamente? O balão passará, aos poucos,  a ser substituído pelo recurso de fato (chamamos esse processo de balloonig deflate).

A medida que a maquina virtual fica ociosa seu necessidade de memória RAM é reduzida. Seguindo a lógica o Hyper-V checará a configuração de Minimum RAM e passará a devolver o recurso para o host, novamente o processo de ballooning ocorrendo. Suponhamos que o valor da RAM minima seja de 256MB, via console de gerenciamento do Hyper-V teremos o valor de 308MB, referente a 256 de memoria minima + 20% de buffer.

Levando em conta o exemplo acima, nossa VM sofreu as seguintes aletarções:

  1. Iniciou com 1GB de RAM
  2. Aumento para 3GB de RAM
  3. Reduziu seu consumo (não foi citado, mas vamos dizer que caiu para 2GB de RAM) – Ballooning
  4. Reduziu para 308 MB – Ballooning

Assim finalizamos nossa introdução a Memória Virtual no Hyper-V. Espero que tenha sido útil!

Grande abraço