Virtualizzazione: Ottimizzazione dell'utilizzo della memoria di Hyper-V

La memoria dinamica può rivelarsi una funzionalità utile, ma è necessario configurare le macchine virtuali e il server host con attenzione.

Brien M. Posey

Quando si tratta di ospitare carichi di lavoro virtuali, non esiste forse altra risorse hardware più importante per le prestazioni complessive della memoria fisica. È essenziale allocare la memoria in modo che garantisca che ciascuna macchina virtuale disponga della memoria necessaria, ma senza sprecare la memoria nei singoli processi. In questo articolo sono incluse diverse considerazioni fondamentali per l'allocazione della memoria da utilizzare con Microsoft Hyper-V.

Considerazioni su NUMA

La gestione della memoria per Hyper-V è una sorta di forma d'arte. È necessario garantire a ciascuna macchina virtuale il provisioning di una quantità di memoria adeguata. Allo stesso tempo, è necessario evitare l'assegnazione di più memoria a una macchina virtuale di quanto non sia effettivamente necessario.

I motivi di ciò sembrano ovvi. L'allocazione di una quantità eccessiva di memoria a una macchina virtuale limita la quantità di memoria che è possibile allocare ad altre macchine virtuali nello stesso server. Tuttavia, talvolta l'allocazione di troppa memoria a una macchina virtuale può in realtà comprometterne le prestazioni.

Nella maggior parte dei nuovi server viene utilizzata la memoria di tipo NUMA (Non-Uniform Memory Access). La memoria NUMA è progettata per migliorare le prestazioni mediante l'assegnazione della memoria per singolo processore. Ciascun blocco di memoria dedicata è noto come nodo NUMA. Una CPU può accedere al proprio nodo NUMA locale (la memoria direttamente assegnata alla CPU) più rapidamente di quanto possa accedere a un nodo NUMA non locale.

Le versioni di Hyper-V per Windows Server 2008 e 2008 R2 non supportano direttamente l'affinità di memoria per singolo nodo NUMA. In altre parole, non è possibile configurare direttamente una macchina virtuale per l'utilizzo di un nodo NUMA specifico. Questa funzionalità verrà a quanto pare integrata nella versione Windows Server 8 di Hyper-V. Ciononostante, è possibile comunque fare in modo di ridurre le possibilità che una macchina virtuale utilizzi nodi NUMA non locali.

Il trucco consiste nel calcolare la dimensione di ciascun nodo NUMA. Ad esempio, supponiamo che il server sia dotato di due processori octa-core e 128 GB di RAM. La dimensione del nodo NUMA si calcola dividendo la dimensione della memoria (128 GB) per il numero di core CPU (16). In questo caso particolare, la dimensione di un nodo NUMA sarebbe 8 GB.

Hyper-V non consente ancora di assegnare un nodo NUMA specifico a una macchina virtuale specifica. Tuttavia, poiché sappiamo che questo particolare server dispone di una dimensione del nodo NUMA pari a 8 GB, possiamo supporre che a ciascuna macchina virtuale a cui sono assegnati più di 8 GB sarà garantito l'utilizzo della memoria di più nodi NUMA. Limitando la memoria assegnata a una macchina virtuale a 8 GB o meno (in questo caso) aumenteranno le possibilità che la macchina virtuale utilizzerà la memoria di un singolo nodo NUMA, con conseguente miglioramento delle prestazioni.

Overhead di Hyper-V

I nodi NUMA non sono l'unico aspetto da prendere in considerazione quando si parla di gestione della memoria. Quando si pianificano i modi per utilizzare la memoria del server host, è di fondamentale importanza tenere conto dell'overhead associato alla virtualizzazione. Esistono due aspetti fondamentali relativi all'overhead di virtualizzazione. In primo luogo, è necessario riservare parte della memoria alla partizione principale.

Sarà necessario riservare almeno 300 MB per l'hypervisor e 512 MB per il sistema operativo host in esecuzione nella partizione radice. Tuttavia, è buona norma riservare 2 GB alla partizione principale.

La partizione host deve essere utilizzata solo per Hyper-V (benché sia possibile eseguire software di sicurezza e di gestione dell'infrastruttura quali agenti di gestione, agenti di backup e firewall). Pertanto, tale indicazione di 2 GB presuppone che non si eseguiranno altre applicazioni o ruoli server nella partizione principale.

Hyper-V non consente di allocare memoria direttamente alla partizione host e utilizza essenzialmente la memoria rimasta. Pertanto, è necessario ricordare di lasciare almeno 3 GB di memoria del server host non allocata in modo che rimanga disponibile per la partizione principale.

Allocazione della memoria della macchina guest

L'altro aspetto da considerare in merito all'overhead di virtualizzazione è il fatto che le macchine virtuali utilizzano una piccola quantità di memoria per i servizi di integrazione e altri processi relativi alla virtualizzazione. Tale quantità di memoria è in qualche modo minima, pertanto non è necessario preoccuparsi di assegnare memoria aggiuntiva, a meno che non si preveda di fornire a ciascuna macchina virtuale solo una quantità minima di memoria.

Le macchine con 1 GB di memoria RAM o meno utilizzeranno solo circa 32 MB di memoria per l'overhead associato alla virtualizzazione. È necessario aggiungere 8 MB per ciascun gigabyte di memoria RAM aggiuntiva. Ad esempio, una macchina virtuale con 2 GB di RAM utilizzerebbe 40 MB (32 MB più 8 MB) di memoria per l'overhead di virtualizzazione. In modo analogo, una macchina virtuale con 4 GB di memoria sprecherebbe 64 MB per l'overhead.

Memoria dinamica

Windows Server 2008 R2 SP1 ha introdotto una nuova funzionalità di memoria dinamica che consente alle macchine virtuali di consumare memoria dinamicamente in base al carico di lavoro corrente. Ciò consente inoltre di sovrassegnare la memoria fisica del server per l'esecuzione di un numero di macchine virtuali superiore a quanto effettivamente possibile. Malgrado i vantaggi della memoria dinamica, è importante attenersi ad alcune procedure consigliate per evitare che le macchine virtuali soffrano per insufficienza di memoria disponibile.

In primo luogo, l'utilizzo di memoria dinamica non rappresenta sempre la scelta giusta. È possibile attivare o disattivare la memoria dinamica per singola macchina virtuale. È importante attivare la memoria dinamica solo nelle macchine virtuali che possono effettivamente trarne vantaggio.

Uno degli aspetti più importanti è il carico di lavoro delle macchine virtuali. Se un'applicazione in una macchina virtuale è progettata per utilizzare una quantità di memoria fissa, è meglio assegnare a tale macchina virtuale esattamente la quantità di memoria necessaria invece di utilizzare la memoria dinamica.

Lo stesso vale per applicazioni dispendiose in termini di memoria. Alcune applicazioni sono progettate per utilizzare tutta la memoria disponibile e possono rapidamente esaurire la memoria fisica di un server se hanno la possibilità di utilizzare la memoria dinamica. In questo caso, alle macchine virtuali su cui sono in esecuzione questi tipi di applicazioni è meglio assegnare una quantità fissa di memoria.

Infine, le prestazioni di un server possono risentirne se le macchine virtuali tentano di utilizzare memoria di più nodi NUMA. Quindi, se il server utilizza la memoria NUMA e le prestazioni sono un aspetto di primaria importanza, è meglio evitare la memoria dinamica.

Memoria RAM di avvio

Uno dei concetti più importanti da comprendere relativi alla memoria dinamica è la memoria RAM di avvio. Quando si utilizza la memoria dinamica, a ciascuna macchina virtuale è necessario assegnare un valore per la memoria RAM di avvio. Questo valore rappresenta la quantità di memoria fisica utilizzata inizialmente dalla macchina virtuale durante l'avvio. Aspetto ancora più importante è il fatto che la memoria RAM di avvio rappresenta inoltre la quantità minima di memoria fisica utilizzata dalla macchina virtuale. Una macchina virtuale non può ridurre l'utilizzo di memoria al di sotto del valore della memoria RAM di avvio.

Nel qual caso, Microsoft consiglia di evitare di assegnare a una macchina virtuale una quantità eccessiva di memoria RAM di avvio. È meglio stabilire la quantità di memoria RAM di avvio in base al sistema operativo in esecuzione nella macchina virtuale. Microsoft consiglia 512 MB di memoria RAM di avvio per macchine virtuali su cui è in esecuzione Windows 7, Windows Vista, Windows Server 2008 e Windows Server 2008 R2. Se sulle macchine virtuali verrà eseguito Windows Server 2003 o Windows Server 2003 R2, Microsoft consiglia di impostare 128 MB di memoria RAM di avvio.

Per poter utilizzare la memoria dinamica in una macchina virtuale, è necessario che sia supportata dal sistema operativo. Windows XP non prevede il supporto della memoria dinamica. Se si tenta di eseguire Windows XP in una macchina virtuale configurata per l'utilizzo di memoria dinamica, il sistema operativo riuscirà ad accedere solo alla memoria RAM di avvio.

Prima di passare ad altre attività di configurazione, è importante assicurarsi che la memoria RAM di avvio complessiva per tutte le macchine virtuali non superi la memoria RAM fisica installata nel server. In caso contrario, sarà necessario rimuovere alcune macchine virtuali o aggiungere memoria.

È possibile inoltre modificare il valore massimo di memoria RAM. Il valore rappresenta la memoria fisica massima utilizzabile da una macchina virtuale. Per impostazione predefinita, Hyper-V imposta la memoria RAM massima di ciascuna macchina virtuale su 64 GB. È possibile impostare la memoria RAM massima su un valore inferiore se non è necessaria una quantità eccessiva di memoria fisica per alcune delle macchine virtuali.

Peso di memoria

Il concetto alla base dell'utilizzo della memoria dinamica consiste nel fatto che quest'ultima consente di sovrassegnare memoria. Ciò permette alle macchine virtuali di accedere alla memoria necessaria secondo necessità. Il grosso svantaggio della sovrassegnazione di una risorsa hardware consiste nel fatto che potrebbe esaurirsi. Nel caso della memoria dinamica, è senz'altro possibile che le macchine virtuali utilizzino tutta la memoria fisica disponibile e ne richiedano altra.

La soluzione a lungo termine per questo problema è garantire che il server sia dotato di memoria sufficiente a soddisfare le esigenze delle macchine virtuali. Tuttavia, una soluzione a breve termine consiste nell'assegnare delle priorità nell'utilizzo della memoria.

Quasi tutti i server host dispone di alcune macchine virtuali più importanti di altre. Hyper-V consente di assegnare delle priorità in modo tale che, nel caso di insufficienza di memoria fisica, la memoria venga allocata prima alle macchine virtuali a priorità più elevata. È possibile assegnare una priorità alle esigenze di memoria dinamica di una macchina virtuale modificandone il peso di memoria. Le macchine virtuali con un peso di memoria superiore hanno la precedenza sulle macchine virtuali con pesi di memoria inferiori.

L'altra impostazione da configurare per ciascuna macchina virtuale che utilizza la memoria dinamica è il buffer di memoria. L'impostazione del buffer di memoria controlla la quantità di memoria che dovrà essere riservata da ciascuna macchina virtuale come buffer. Il valore è espresso in percentuale. Ad esempio, se una macchina virtuale utilizza 4 GB di memoria assegnata e il buffer di memoria è impostato al 50%, la macchina virtuale può utilizzare fino a un massimo di 6 GB di memoria.

Il buffer di memoria non garantisce la disponibilità di memoria per una macchina virtuale. Controlla semplicemente la quantità di memoria che la macchina di memoria può provare a richiedere. È opportuno notare che, poiché il buffer di memoria è espresso in percentuale, la quantità di memoria contenuta nel buffer cambia in rapporto alla quantità di memoria utilizzata al momento dalla macchina virtuale. Tutte le macchine virtuali che utilizzano la memoria dinamica iniziano utilizzando una quantità minima di memoria. Modificano dinamicamente l'utilizzo della memoria in base alla pressione esercitata dal carico di lavoro sulla memoria.

Configurazione della memoria

La procedura di configurazione effettiva dell'utilizzo della memoria in una macchina virtuale è semplice. Aprire la console di gestione di Hyper-V, fare clic con il pulsante destro del mouse su una macchina virtuale (poiché la memoria di ciascuna macchina virtuale è gestita in modo indipendente). Scegliere il comando Impostazioni dal menu di scelta rapida. Quando viene visualizzata la finestra di dialogo Impostazioni, fare clic su Memoria.

Hyper-V offre la possibilità di allocare una quantità statica di memoria alla macchina virtuale o di utilizzare la memoria dinamica (vedere la Figura 1). Se si sceglie l'opzione dinamica, sarà possibile modificare la memoria RAM di avvio, la memoria RAM massima, il buffer di memoria e il peso di memoria direttamente dalla finestra di dialogo Impostazioni.

You can adjust the memory allocation for a virtual machine through the Settings dialog box

Figura 1 È possibile modificare l'allocazione di memoria per una macchina virtuale tramite la finestra di dialogo Impostazioni.

Se un server host dispone di risorse di memoria fisica limitate, esiste solitamente un compromesso tra l'utilizzo di memoria statica e l'utilizzo di memoria dinamica. La memoria statica solitamente offre prestazioni complessive migliori (presupponendo sia disponibile una quantità di memoria adeguata). La memoria dinamica può rivelarsi insidiosa, ma solitamente una maggiore densità di macchine virtuali.

Brien Posey

Brien Posey, MVP, è autore freelance di migliaia di articoli e decine di testi tecnici. È possibile visitare il suo sito Web all'indirizzo brienposey.com.

Contenuto correlato