VHD fissi vs VHD dinamici

Uno dei dubbi che può venire durante la creazione di una macchina virtuale in Hyper-V è se utilizzare dischi virtuali a dimensione fissa o dischi virtuali dinamici.

La principale differenza tra i due è che i VHD fissi allocano lo spazio su disco alla loro creazione, mentre i VHD dinamici allocheranno lo spazio su disco quando sarà necessario, ma ciò comporta inevitabilmente delle ripercussioni in termini di performance e robustezza che dovranno essere tenute in conto al momento della scelta in base a quale sarà l’utilizzo del VHD.

Per meglio comprendere come le implicazioni dell’utilizzo di un VHD fisso rispetto ad un VHD dinamico occorre analizzare il loro formato che Microsoft ha acquisito da Connectix nel 2003 insieme alla tecnologia delle macchine virtuali. Nel 2006 Microsoft ha reso disponili le specifiche del formato immagine VHD come parte del Open Specification Promise, per ulteriori informazioni si veda la sezione di download Virtual Hard Disk Image Format Specification del Virtual Server TechCenter.

Formato dei VHD

Entrambi i tipi di dischi fissi includono un footer di 512 byte che risiede alla fine del file e ha la seguente struttura.

Campi Dimensione (bytes) Descrizione
Cookie 8 Identifica il creatore del VHD (per esempio Microsoft usa la stringa “conectix” per identificare che il file è stato creato da Microsoft Virtual Server o Virtual PC)
Features 4

Indica le features supportate:

  • 0x00000000=No features enabled
  • 0x00000001=Temporary (il VHD sarà eliminato al shutdown)
File Format Version 4

Versione del file VHD, la Major version viene incrementata se il formato del file viene modificato in modo da non essere più compatibile con le precedenti versioni

  • Major version=Most-significant two bytes
  • Minor version=Least-significant two bytes
Data Offset 8 Utilizzato nei dischi dinamici e differenziali contiene l’offset assoluto in byte dall’inizio del file dove risiede il Dynamic Disk Header (nei vhd fissi è impostato a 0xFFFFFFFF)
Time Stamp 4 Data di creazione espressa in secondi a partire dalla data del 1 Gennaio 2000 12:00:00 AM in UTC/GMT
Creator Application 4 Campo testuale giustificato a sinistra che indica l’applicazione che ha creato il VHD (per esempio “vpc”=Microsoft Virtual PC, “vs”=Microsoft Virtual Server)
Creator Version 4 Major/Minor version dell’applicazione che ha creato il VHD (Virtual Server 2005=0x00010000, Virtual PC 2004=0x00050000)
Creator Host OS 4

Tipo del sistema operativo su cui il VHD è stato creato:

  • 0x5769326B=Windows
  • 0x4D616320=Macintosh
Original Size 8 Dimensione del VHD in bytes dal punto di vista della VM alla creazione (questa campo ha solo scopi informativi)
Current Size 8 Dimensione attuale del VHD in bytes dal punto di vista della VM alla creazione. Questo valore corrisponde all’Original size a meno che il VHD non venga espanso
Disk Geometry 4 Cilindri, testine, and settori per traccia del VHD:

  • Cylinder (2 bytes)
  • Heads (1 byte)
  • Sectors per track/cylinder (1 byte)
Disk Type 4
  • 0=None
  • 1=Reserved (deprecated)
  • 2=Fixed hard disk
  • 3=Dynamic hard disk
  • 4=Differencing hard disk
  • 5=Reserved (deprecated)
  • 6=Reserved (deprecated)
Checksum 4 Checksum del footer del VHD
Unique Id 16 ID del VHD costituito da un 128-bit universally unique identifier (UUID), utilizzato per associante un VHD parent ad un VHD differenziale
Saved State 1 SE vale 1 indica che il sistema a cui appartiene il VHD è in saved state (alcune operazioni come compattazione ed espansione non possono essere eseguite se il sistema è in saved state)
Reserved 427  

Formato dei VHD Fissi

I VHD fissi sono il tipo più semplice con le performance migliori nella maggior parte dei casi in quanto sono, come detto prima, interamente allocati alla creazione. Un file VHD fisso da 500 MB avrà una dimensione in byte pari a 500 x 1024 x 1024 x 512. Inoltre dal momento che il footer è alla fine del file la memorizzazione del file su disco sarà allineata all’inizio del file consentendo un accesso casuale più semplice e veloce.

La dimensione massima teorica di un file VHD fisso è di 16 TB – 64 KB (che coincide col il limite della massima grandezza del file su un volume NTFS,a riguardo si veda Reviewing File Server Limits), la GUI della console di Hyper-V consente però di creare file di dimensione massima pari a 2040 GB.

Formato dei VHD dinamici

I VHD dinamici vengono creati della dimensione necessaria per memorizzare il VHD footer e alcuni metadati utilizzati per gestire la dinamicità del VHD (ad esempio per un VHD dinamico da 20GB sarà creato un file da 42 KB).

Copy of hard disk footer (512 bytes)
Dynamic Disk Header (1024 bytes)
BAT (Block Allocation table)
Data Block 1
Data Block 2
Data Block n
Hard Disk Footer (512 bytes)

Ogni volta che un Data Block viene aggiunto l’Hard Disk footer  viene spostato alla fine del file, e dal momento che il footer è una parte cruciale del VHD una sua copia viene mantenuta all’inizio del file per ridondanza.

Il Dynamic Disk Header contiene informazioni per localizzare e identificare un VHD parent (utilizzati dai VHD differenziali) e l’offset relativo alla posizione della BAT e ha la seguente struttura.

Campi Dimensione (bytes) Descrizione
Cookie 8 Identifica l’header e contiene la stringa “cxsparse”
Data Offset 8

Utilizzato nei dischi dinamici e differenziali contiene l’offset assoluto in byte dall’inizio del file dove risiede il Dynamic Disk Header (nei vhd fissi è impostato a 0xFFFFFFFF)

Table Offset 8 Offset assoluto in bytes in cui è memorizzata la BAT nel VHD
Header Version 4

Versione del Dynamic disk header,  la Major version viene incrementata se il formato dell’header viene modificato in modo da non essere più compatibile con le precedenti versioni

  • Major version=Most-significant two bytes
  • Minor version=Least-significant two bytes
Max Table Entries 4 Numero max di entries nella BAT, che corrisponde al numero di Data Blocks del VHD
Block Size 4 Dimensione della data section del block (il Data Block è l’unità di espansione di un VHD dinamico o di un VHD differenziale)
Checksum 4 Checksum dell’header
Parent Unique ID 16

128-bit UUID del VHD padre (utilizzato dal VHD differenziali)

Parent Time Stamp 4 Data di modifica del VHD padre espressa in secondi a partire dalla data del 1 Gennaio 2000 12:00:00 AM in UTC/GMT
Reserved 4  
Parent Unicode Name 512 Stringa Unicode UTF-16 contente il nome del file del VHD padre
Parent Locator Entry 1 24

Offset assoluto in bytes relativo al VHD padre (utilizzato solo dai VHD differenziali, 0 per i VHD dinamici)

Parent Locator Entry 2 24  
Parent Locator Entry 3 24  
Parent Locator Entry 4 24  
Parent Locator Entry 4 24  
Parent Locator Entry 6 24  
Parent Locator Entry 7 24  
Parent Locator Entry 8 24  
Reserved 256  

La BAT (Block Allocation table) indica quanti Data Block sono stati allocati e la loro posizione assoluta nel VHD. La dimensione della BAT viene calcolata durante la creazione del VHD in base al numero di Data Blocks che dovrà contenere quando il VHD sarà completamente espanso (Max Table Entries). Ogni entry della BAT ha una dimensione di 4 bytes e le entries inutilizzate sono inizializzate al valore 0xFFFFFFFF, ciò significa che vi possono essere al massimo 0xFFFFFFFE entries.

La dimensione massima di un VHD dinamico è di 2040GB che si ottiene moltiplicando il numero massimo di entries della BAT (0xFFFFFe) per 512 Byte e sottraendo lo spazio occupato dai metadati.

Performance

Come si può capire dalla precedente analisi dei formati dei due tipi di VHD quelli fissi avranno performance migliori sia in lettura che in scrittura in quanto le operazioni di I/O non comportano l’overhead della gestione dei metadati.

In ogni caso per aumentare le performance dei VHD dinamici sono adottate alcune ottimizzazioni come ad esempio la selezione del dimensione del Data Block che può variare da 512 KB a 2 MB (in Windows Server 2008 R2 il Data Block size di default è stato portato a 2 MB) e lo skip dell’allocazione dei Data Blocks di soli zero.

Inoltre in Windows Server 2008 R2 è stato aggiunto il supporto nativo ai file VHD è ciò ha comportato un aumento delle performance nell’utilizzo di ogni tipo di VHD.

Il seguente grafico mostra un confronto delle prestazioni tra i vari tipi di dischi (per i dettagli su come sono stati ottenuti i risultati mostrati si veda il documento Virtual Hard Disk Performance White Paper):

image

Come si può notare le differenze di performance tra VHD fissi e dinamici sono più evidenti nella gestione dello streaming video, dei log di SQL Server, del file di paging e dei log del server web. Vi sono però workload in cui le performance sono decisamente simili come ad esempio file server, Exchange server e gestione di database.

Robustezza

Dal momento che nei VHD dinamici occorre anche gestire i metadati, questa tipologia di VHD risulta più vulnerabile agli errori nel caso di un arresto improvviso del sistema rispetto ai VHD fissi. Per aumentare la robustezza dei VHD dinamici, come visto precedentemente una copia del footer viene mantenuta all’inizio del file per ridondanza.

Sempre a causa del re-directional layer la deframmentazione non è consigliata nei VHD dinamici, per un approfondimento sulla deframmentazione dei VHD si veda Hyper-V: Defragmentation.

Conclusioni

I vhd dinamici sono quindi da utilizzare solo in determinati scenari e se vi è un’esigenza di risparmio in termini di spazio occupato, proprio per questa ragione occorrerà periodicamente eseguirne la compattazione.

Nel caso i VHD fissi non siano sufficienti per soddisfare i requisiti di performance e dimensioni massime necessari è possibile utilizzare i dischi Pass-Through che richiedendo però un HD o una LUN dedicata.

I dischi differenziali sono invece da utilizzare solo in scenari di test per creare laboratori, infatti la loro caratteristica di memorizzare solo i dati differenziali rispetto ad un VHD permette di risparmiare spazio spazio occupato a fronte di performance minori e di un rischio di incoerenza maggiore rispetto ai VHD dinamici. La modifica di un disco padre rende infatti inutilizzabili i dischi differenziali figli, a tal riguardo si noti che nella versione 2.0 del VHD Tool è stata inserita la funzione di repair che permette l’undo di un’operazione di espansione eseguita accidentalmente sul VHD base.

Di seguito un specchietto riassuntivo che mette a confronto VHD dinamici, differenziali, fissi e dischi Pass-Through.

image