Home > virtualization, vmware, vsphere > La gestione della memoria in VMware ESX 4.1 – parte 1

La gestione della memoria in VMware ESX 4.1 – parte 1

Note to english speaking readers: in this post I explain some memory management concepts of ESX 4.1. I think that there are a lot of good post and white paper about this topic in english, but I think that for non english speaking people it’s not simple follow these sources. This is the main reason about this post and the reason because of it is only in italian.

Con l’uscita di ESX 4.1 sono state introdotte varie novità (di cui ormai tutti sono a conoscenza) a livello di gestione delle risorse fondamentali: CPU, memoria, disco e networking.

Insieme a queste novità, VMware ha pubblicato una serie di white paper che non solo illustrano le nuove funzionalità, ma anche spiegano come il vmkernel gestisce le risorse.

Dato che questi white paper non sono sempre di agevole lettura, ho deciso di iniziare una serie di post in italiano in cui illustrare i punti fondamentali toccati nei documenti originali, a cui rimando per approfondimenti: in particolare, nei documenti originali vengono riportati nel dettaglio i test relativi alle performance, mentre in questa serie di post verranno solo citati.

Nota: in questo post toccherò inevitabilmente concetti di sistemi operativi, senza aver la pretesa di essere esaustivo. In coda al post indicherò alcune risorse e alcuni testi su cui approfondire i vari argomenti.

Parto quindi con la prima risorsa: la memoria.

Nei casi reali, la memoria è la prima risorsa che diventa scarsa: chiunque abbia un ambiente virtualizzato, anche piccolo, avrà notato come, a parte applicazioni particolari, la cpu non è mai un collo di bottiglia, mentre la memoria viene consumata molto più in fretta e si arriva velocemente a saturare l’host.

Bisogna inoltre ricordarsi che, data la presenza dell’hypervisor, i normali meccanismi di gestione della memoria dei sistemi operativi guest si sommano ai meccanismi di gestione della memoria dell’hypervisor, per cui diventa più complesso avere una visione globale di quello che succede.

E’ quindi importante conoscere come ESX gestisce la memoria così da poter prendere decisioni corrette nel momento in cui si presentano problemi di performance.

ESX calcola un target di allocazione di memoria per ogni vm basandosi sul carico corrente del sistema e sui setting di share, reservation e limit impostati. Questo target viene poi utilizzato come guida per l’allocazione dinamica della memoria di ogni vm, eventualmente invocando vari meccanismi di basso livello per reclamare memoria da altre vm in caso di overallocazione della memoria dell’host.

E’ possibile monitorare facilmente l’uso della memoria dell’host e della vm tramite due statistiche: Consumed Memory e Active Memory che monitorano rispettivamente quanta memoria dell’host è allocata alla vm e quanta memoria della vm è attualmente in uso da parte del sistema operativo e delle applicazioni.

Un po’ di terminologia

Ritengo utile elencare e spiegare la terminologia utilizzata in questo ambito, terminologia che si ritrova anche nei vari documenti ufficiali di VMware. Nel seguito utilizzerò ovunque possibile la terminologia inglese per uniformità con il resto della documentazione reperibile in rete.

  • Host physical memory (memoria fisica dell’host): con questo termine ci si riferisce alla memoria presente nell’host fisico e che l’hypervisor vede come disponibile per il sistema.
  • Guest physical memory (memoria fisica del guest): con questo termine ci si riferisce alla memoria visibile al sistema operativo guest in esecuzione nella vm. Generalmente corrisponde alla memoria configurata sulla vm.
  • Guest virtual memory (memoria virtuale del guest): con questo termine ci si riferisce allo spazio di indirizzamento presentato dal sistema operativo guest alle sue applicazioni. E’ esattamente il concetto di memoria virtuale dei sistemi operativi.

L’hypervisor fornisce un meccanismo per mappare la guest physical memory sulla host physical memory.

Esistono poi due livelli di paginazione, uno a livello di sistema operativo guest e uno a livello di hypervisor:

  • guest level paging (paginazione a livello di sistema operativo guest): è il trasferimento di memoria (per essere precisi, di pagine di memoria) tra la guest physical memory e lo swap del sistema operativo guest. E’ esattamente il normale meccanismo di paging dei sistemi operativi ed è pilotato dal sistema operativo guest.
  • hypervisor swapping: è il trasferimento di memoria tra la guest physical memory e lo swap dell’host. E’ pilotato dall’hypervisor.

I concetti base della memoria virtuale

La tecnica della memoria virtuale è comunemente utilizzata nei sistemi operativi ed è supportata in hardware dalla quasi totalità delle moderne cpu. Tale tecnica crea uno spazio di indirizzamento virtuale per le applicazioni e demanda al sistema operativo e all’hardware la traduzione degli indirizzi dallo spazio di indirizzamento virtuale allo spazio di indirizzamento fisico. In questo modo le applicazioni non si devono occupare della memoria fisica effettivamente presente sul sistema e il sistema operativo può supportare funzionalità di protezione dei processi, file mapping e così via in modo trasparente per le applicazioni.

Quando l’hypervisor esegue una vm, crea uno spazio di indirizzamento contiguo per la vm che ha le stesse caratteristiche dello spazio di indirizzamento contiguo presentato dal sistema operativo guest alle sue applicazioni. Quindi, dal punto di vista delle applicazioni in esecuzione nella vm, l’hypervisor aggiunge un livello in più di traduzione degli indirizzi, creando di fatto i tre livelli di memoria citati in precedenza: guest virtual memory, guest physical memory e host physical memory.

image

La traduzione degli indirizzi tra guest physical memory e host physical memory è gestita dall’hypervisor: l’hypervisor intercetta tutte le istruzioni della vm che manipolano il translation lookaside buffer (TLB) hardware e il mapping tra indirizzo virtuale (guest)  e indirizzo fisico (guest). Nel TLB viene inserito l’effettivo mapping tra guest virtual memory e host physical memory, mentre le altre mappature sono mantenute dall’hypervisor tramite due strutture dati chiamate pmap e Shadow Tables : questo approccio elimina l’overhead della virtualizzazione durante il normale accesso alla memoria della vm, in quanto trova nel TLB direttamente l’indirizzo della host physical memory.

Mantenere allineate le mappature tra guest virtual memory e guest physical memory e tra guest physical memory e host physical memory introduce però dell’overhead. Per eliminare questo overhead, nelle nuove generazioni di cpu Intel e AMD è stato introdotto un supporto hardware dedicato, tramite l’uso di due layer di tabelle di pagine direttamente in hardware, una per la traduzione di indirizzi tra guest virtual e guest physical e l’altra per la traduzione tra guest physical e host physical.

I concetti base della gestione della memoria in ESX

Per capire come ESX gestisce la memoria è necessario sapere come i vari componenti (applicazione, sistema operativo guest, virtual machine e hypervisor) gestiscono la memoria ai loro livelli.

  • Le applicazioni usano le interfacce fornite dal sistema operativo per allocare e deallocare esplicitamente la memoria virtuale quando partono.
  • Il sistema operativo presuppone di possedere tutta la memoria del sistema:  l’hardware non espone interfacce verso il sistema operativo per permettergli di allocare o liberare esplicitamente la memoria fisica. Il sistema operativo quindi definisce i concetti di memoria fisica allocata o libera e ogni sistema operativo può avere una sua differente implementazione di questa astrazione. Una implementazione comune e’ mantenere una lista di pagine di memoria libere e una di pagine di memoria allocate.
  • Una virtual machine combina i metodi di gestione della memoria delle applicazioni e dei sistemi operativi: come un’applicazione non ha memoria preallocata quando parte, come un sistema operativo non puo’ allocare in modo esplicito della memoria fisica.
  • L’hypervisor definisce i concetti di memoria fisica allocata o libera, intercetta gli accessi alla memoria della virtual machine e alloca la memoria fisica per la vm al suo primo accesso alla memoria.
  • La vm dealloca la memoria come un sistema operativo, per cui solo il sistema operativo guest sa che la memoria liberata è libera, ma la pagina di memoria dell’host fisico non viene toccata.

L’hypervisor può quindi allocare facilmente memoria fisica per una vm catturando i page fault che vengono generati al primo accesso a della memoria mai usata prima da parte della vm. Ci sono invece molte difficoltà nel sapere quando liberare la memoria in quanto è il sistema operativo guest che sa quale memoria è libera e la lista delle pagine libere non è facilmente rintracciabile e monitorabile dall’hypervisor.

Anche se l’hypervisor non può recuperare della host memory quando il sistema operativo libera della guest memory, questo non implica che l’host memory venga usata completamente da una vm che allochi e liberi della memoria. L’hypervisor alloca memoria alla vm solo quando questa tocca della memoria fisica che non ha mai usato in precedenza: per il principio di localita’ la vm molto probabilmente allocherà e libererà sempre le stesse locazioni di guest physical memory e quindi, una volta allocata della host memory al primo utilizzo verrà riutilizzata la stessa. Quindi, anche in caso la vm usi tutta la guest physical memory, questa sarà allocata in altrettanta host physical memory.

Tenendo conto dell’overhead di memoria necessario all’hypervisor per mantenere le sue strutture dati legate alla vm, vale sempre per ogni vm la relazione:

uso dell’host memory <= dimensione della guest physical memory + overhead

Con questo concludo la prima parte di questo articolo, nella prossima parte indagherò le tecniche usate da ESX, e in particolare da ESX 4.1, per recuperare memoria dalle vm.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: