sábado, 7 de agosto de 2010

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

                 

Como sabemos, o ESX é um “hypervisor” desenvolvido para gerenciar de forma eficiente os recursos de hardware (CPU, Memória, Storage, Rede) de uma máquina física entre diversas máquinas virtuais. Para entendermos como funciona o gerenciamento da memória, precisamos primeiro esclarecer algumas definições:

Host Physical Memory: é a memória física instalada no host ESX e gerenciada pelo kernel do ESX.

Guest Physical Memory: é a memória alocada para a VM. O sistema operacional da VM enxerga essa memória como sendo sua memória física (afinal de contas, ele não sabe que está rodando numa máquina virtual). Essa memória é gerenciada pelo sistema operacional da VM.

Guest Virtual Memory: é a memória vista pelas aplicações que rodam no S.O da VM.

O que é a memória virtual?

A memória virtual é uma técnica presente na maioria dos sistemas operacionais e suportada por quase todos os processadores existentes hoje em dia. O que ela faz é criar um espaço contínuo de endereços virtuais, fazendo que uma aplicação acredite que todo aquele espaço pertence a ela. A tradução de endereços entre o espaço de endereçamento virtual e o espaço de endereçamento físico é feita pelo sistema operacional e pelo hardware. Esta técnica não só simplifica o trabalho do programador, mas também se adapta ao ambiente de execução para suportar grandes espaços de endereço, protege os endereços utilizados por um determinado processo e permite o uso de arquivos de mapeamento e swap.

Mas como é feito o gerenciamento da memória virtual?

Bem, antes de qualquer coisa, para que seja possível trabalhar com memória virtual, é necessário que o hardware utilizado ofereça o que chamamos de ‘Unidade de Gerenciamento de Memória (MMU - Memory Management Unit). Normalmente a MMU está integrada ao processador e sua principal função é manter uma tabela que relaciona os endereços da memória virtual aos endereços da memória física. Essa tabela é conhecida como Translation Lookaside Buffer (TLB). Às vezes acontece de uma página de memória virtual não poder ser acessada porque não havia uma entrada correspondente na TLB, este tipo de situação causa o que chamamos de Page Fault.

Portanto, no caso de uma máquina virtual, além de virtualizar a memória, o VMM (Virtual Machine Monitor) também deve virtualizar a MMU, de forma que o S.O da VM também possa trabalhar com memória virtual.

Agora vamos entender como a memória é alocada para a VM.

Em ambientes que não são virtuais o sistema operacional é que assume toda a memória física da máquina. Dessa forma, sempre que uma aplicação necessita de memória para armazenar algum dado ela faz uma chamada ao sistema operacional. Este por sua vez conhece todas as páginas de memória que estão sendo usadas e todas as páginas que estão livres. É como se existissem duas listas, a lista de páginas livres e a lista de páginas usadas. Então quando uma aplicação faz uma chamada, o sistema operacional verifica a lista das páginas livres e disponibiliza uma página para a aplicação e em seguida move a página alocada para a lista de páginas usadas.

Como uma máquina virtual possui um sistema operacional e diversas aplicações, é necessário combinar as características de gerenciamento de memória do sistema operacional e também do gerenciamento da memória virtual utilizada pelas aplicações.

No ESX, a alocação de memória acontece sob demanda, ou seja, quando uma VM acessa à sua memória física (Guest Physical Memory) pela primeira vez, o hypervisor disponibiliza uma página de memória do host (Host Physical Memory) para aquela VM. Para cada máquina virtual o hypervisor mantém registrado em uma tabela qual página de memória está em uso e qual a sua localidade na memória física do host. Conforme mostrado na imagem abaixo:



Esta tabela é mantida pelo hypervisor internamente numa estrutura de dados chamada de PMAP (Physical Machine Mapping). Mas além desta tabela, o ESX também mantém um mapeamento das páginas de memória virtual (Guest Virtual Memory) para as páginas de memória física do host (Host Physical Memory). Este mapeamento é feito através de interceptações realizadas pelo hypervisor aos acessos que são feitos ao TLB da VM e pode ser realizado de duas formas, via Software ou via Hardware, isso vai depender do processador que está sendo utilizado no host e também do modo de execução escolhido pelo VMM, mas isso são assuntos para outros posts!

Agora já sabemos como ocorre a alocação de memória, mas e quando uma aplicação não precisa mais daquela página de memória, o que acontece? Bem, neste caso a aplicação fará uma nova chamada ao sistema operacional que em seguida moverá a página de memória em questão da sua lista de páginas usadas de volta para a lista de páginas livres, porém, como o S.O não tem o conhecimento de que ele está em uma máquina virtual, não ocorre nenhuma interação com o hypervisor, que por sua vez continua com aquela página de memória alocada para aquela VM.

Nesse ponto você pode estar se perguntando, mas como o ESX sabe a hora que ele precisa alocar uma página, mas não sabe a hora de liberar? Quando uma máquina virtual acessa pela primeira vez a memória física do host (Host Physical Memory) isso causa um “Page Fault”, que pode ser facilmente capturado pelo hypervisor. Já no caso da liberação da memória, fica difícil paro o hypervisor monitorar quando uma página foi liberada porque geralmente a lista de páginas livres no sistema operacional não é publicamente acessível.

Baseado nisso, foram criadas técnicas de recuperação de memória (Memory Reclamation) no ESX para melhor utilização da memória física instalada no host. Na parte 2 desse post pretendo explicar cada uma dessas técnicas detalhadamente.


Fontes:
http://www.vmware.com/files/pdf/techpaper/vsp_41_perf_memory_mgmt.pdf
http://www.vmware.com/files/pdf/software_hardware_tech_x86_virt.pdf
http://www.vmware.com/pdf/Perf_ESX_Intel-EPT-eval.pdf
http://www.van-lieshout.com/2009/04/esx-memory-management-part-1/
http://en.wikipedia.org/wiki/Memory_management_unit