Gli utilizzatori di VirtualPc o VirtualBox incontrano spesso degradi di perfomance notevoli nell’esecuzione delle loro macchine virtuali dopo un prolungato utilizzo.

La causa principale di questa situazione è da ricercarsi nel modo in cui vengono istanziati i dischi virtuali associati alle macchine virtuali. Per impostazione predefinita, con l’ovvia e giustificata logica di voler risparmiare il massimo dello spazio possibile, i dischi vengono creati in modo dinamico. Ciò significa che il virtualizzatore (VirtualBox o VirtualPc) fa vedere al pc virtuale (guest) uno spazio massimo disco pari alla capacità assegnata in sede di configurazione iniziale ma nella macchina ospitante (il pc vero chiamato host) viene generato un file di dimensioni iniziali minime. A mano a mano che il sistema guest scrive dati sul disco virtuale, il sistema host “ingrandisce” il file che contiene l’immagine del disco secondo necessità.

In definitiva il disco virtuale è per la macchina host nè più nè meno che un normale file di dati: più dati di ci sono … più il file si ingradisce. Questa tecnica dinamica si chiama thin-provisioning: l’host occuperà sul disco fisico solo lo spazio necessario a contenere tutti i dati veri del disco virtuale guest escluso lo spazio vuoto. Ovvero: se la macchina guest ha a disposizione un disco di 10Gb ma occupa spazio complessivo per soli 4Gb, il file/disco virtuale nella macchina host sarà solo di 4Gb.

I vantaggi di una tale impostazione sono facilmente intuibili: posso creare diverse macchine virtuali assegnando ad ognuna 10Gb di disco ma in realtà il vero spazio occupato sul mio disco fisico sarà molto minore. Inoltre, dovendo passare un disco virtuale, da un host ad un altro dovrò copiare molti meno dati. I vantaggi, tuttavia, si esauriscono qui.

Gli svantaggi, per contro, sono facilmente identificabili e gli utilizzatori esperti di sistemi di virtualizzazione desktop (per sistemi professionali tipo VMWare i discorsi cambiano) ben sanno quali pesanti effetti abbiano sulle performance dei pc guest.

  1. L’estensione richiede tempo: un pc virtualizzato (guest) ogni volta che scrive un dato nuovo sul suo disco, di fatto, richiede all’interprete hardware (virtualizzato anche quello) di scrivere una determinata informazione. L’interprete hardware è il virtualizzatore stesso che riceve la richiesta dal pc guest e la gira al file-system del sistema host (il pc vero) il quale la scriverà nel file che assolve alla funzione di disco virtuale. Trattandosi di un nuovo dato il file-system host dovrà estendere la dimensione del file per inserirci la nuova informazione. E qui si apre il problema: c’è spazio alla fine del file per estenderlo di un incremento ? Se la risposta è si siamo fortunati ed i nuovi dati verranno inseriti in settori contigui ai precedenti, se la risposta è no allora il sistema operativo host dovrà andare a cercare su disco una posizione che abbia uno spazio libero sufficiente ad accogliere un incremento del file e, subito dopo, andare ad aggiornare la MFT per indicare che il file/disco virtuale è composto da un nuovo pezzo (frammento) aggiuntivo che si trova alla posizione tal-dei-tali. Questa operazione comporta tempo e, se il file/disco virtuale si trova su un disco fisico molto frammentato, riduce pesantissimamente le prestazioni della macchina guest.
  2. Le frammentazioni si sommano. La macchina guest (il pc virtuale) si comporta come un normale pc, non sa’ di essere virtuale. Per questo quando opera le sue scelte sul come e soprattutto sul dove scrivere i suoi dati all’interno del disco, si comporta come se si trattasse di un normale disco fisico, e come tale è soggetto al normale difetto frammentazione. Ma non basta: a questo si deve aggiungere la frammentazione del “vero disco fisico”, quello del pc vero, che contiene il file che funge da disco virtuale. Anche quello viene frammentato secondo la necessità, non del guest, ma dell’host. Si arriva quindi a situazioni paradossali in cui, giusto per fare un esempio, il pc guest crede di recuperare un file in una catena di 5 frammenti, mentre il sistema host, per assolvere a quella richiesta, deve andare a leggere 15 o 20 o più frammenti del file/disco virtuale. A lungo andare questa situazione fa crollare le prestazioni guest. E non serve nemmeno far girare un deframmentatore sul pc guest perchè il pc virtuale non sa di quanti frammenti è composto il suo disco nel sistema host.

La best practice per gestire il disco (o i dischi) di un pc virtuale all’interno del proprio pc vero è la seguente:

  1. Pianificare la dimensione da assegnare alle unità disco per il pc virtuale: una corretta pianificazione dovrebbe prevedere, per ogni pc virtuale, almeno due unità disco corrispondenti ad altrettanti file sull’host. Il primo da creare come unità a dimensione fissa sul quale installare il sistema operativo, le eventuali partizioni swap (se si tratta di os Linux) ed i programmi che si intende installare. Il secondo, che potrà essere ad allocazione dinamica, che utilizzeremo per memorizzare i dati.
  2. Assicurarsi che sull’unità fisica su cui andranno creati i file/disco disponga di sufficiente spazio per contenere il disco a dimensione fissa ed almeno il 30% della dimensione dell’unità ad allocazione dinamica.
  3. Eseguire, sull’unità fisica, una deframmentazione completa (con compattazione dello spazio libero)
  4. Istanziare il disco a grandezza fissa: il file verrà generato immediatamente pari alla dimensione massima associata all’unità virtuale e riempito con zeri (thik-provisioning). In questo modo saremo sicuri che il file/disco una volta generato, sarà verosimilmente in un blocco unico e non verrà esteso automaticamente (aumentando il numero dei frammenti). Tutte le operazioni di lettura/scrittura che il sistema guest invocherà, verranno eseguite dal sistema host all’interno del file già istanziato
  5. Istanziare il disco a grandezza dinamica
  6. Avviare la macchina virtuale e procedere all’installazione del sistema operativo.

In questo modo apprezzerete che le performance del vostro pc virtualizzato (a meno che non carichiate di altre incombenze il pc host) non degraderanno più così drasticamente.