Allineamento dei dischi nel mondo virtuale

L’allineamento delle partizioni all’infrastruttura di storage sottostante è un tema che ritorna molto spesso nell’analisi e implementazione di un’architettura virtuale. In realtà il problema esiste anche nel mondo fisico praticamente ovunque sia presente un controller RAID, ma è mitigato dal fatto che l’accesso ai dischi è limitato al singolo server (quindi esiste solo in caso di I/O molto intenso). Nel mondo virtuale, dove più host accedono ad una stessa LUN per gestire più macchine virtuali, il problema dell’allineamento può diventare un collo di bottiglia nelle prestazioni complessive della nostra infrastruttura virtuale.

E’ bene capire esattamente in cosa consiste il problema dell’allineamento della partizione del disco di un sistema Windows. In questo ci aiuta un vecchio documento VMware intitolato Recommendations for Aligning VMFS Partitions: un disco  NTFS è formattato in blocchi di dimensione variabile. Il sistema operativo ottimizza le operazioni di I/O raggruppando più settori nei così detti cluster (allocation unit).

A livello più basso le SAN lavorano aggregando più dischi in un unico array, la cui unità più piccola è chiamata chunk o stripe. Per ottimizzare l’I/O i chunk sono solitamente molto più grandi di un singolo settore e quindi le operazioni di lettura di un settore implicano la lettura di un intero chunk.

In mezzo a questi due layer c’è il filesystem usato dall’hypervisor, che nel caso di VMware è il vmfs.

Tom Hirt ha pubblicato un semplice disegno che spiega molto bene quale può essere l’impatto di un disco non correttamente allineato.

Da questo disegno si capisce bene come la lettura di un singolo cluster da parte di una macchina Windows possa richiedere la lettura di due blocchi a livello di VMFS che a loro volta posso essere spalmati su addirittura tre chunk sulla SAN.

Il disallineamento nasce automaticamente durante l’installazione di un sistema operativo Microsoft, in quando Windows “firma” di dischi occupando i primi 63 blocchi (solitamente da 512 byte l’uno). Lato SAN, i chunk sono solitamente da 32, 64, 128KB o multipli, ma con 63 blocchi da 512B siamo comunque sempre disallineati.

Su un server Windows 2003 è possibile verificare l’allineamento di una partizione con il seguente comando:

wmic partition get BlockSize, StartingOffset, Name, Index

L’output di questo comando solitamente restituisce qualcosa di simile:

BlockSize Index Name StartingOffset
512 0 Disk #0, Partition #0 32256

32256/512=63 blocchi, che è esattamente lo spazio occupato dalla firma dei dischi di Windows! Se non avete mai prestato attenzione a questo problema è probabile che tutte le vostre macchine Windows restituiscano lo stesso valore. Cosa fare?

Nella maggior parte dei casi la risposta è: assolutamente niente. Le richieste di I/O di un normale server non sono tali da creare problemi e la riduzione di I/O dell’host fisico non porta bebefici direttamente proporzionali sulle VM. In generale su tutti i server dotati di un secondo disco è possibile aggiungere un nuovo disco virtuale, creare a mano la partizione allineata (con diskpart) e copiare/clonare i dati per poi rimpiazzare il disco originale. Questa procedura è altamente raccomandata per file server, database, Exchange Server e in generale per tutti quei casi in cui l’I/O è molto elevato.

Il discorso si complica quando si ragiona sul disco di boot. In questo caso, come anticipavo, è opportuno valutare i reali benefici: se il disco di boot contiene solo il sistema operativo potrebbe non essere così determinante allineare la partizione. Per allineare la partizione è comunque “sufficiente” spostarla, ma questa operazione va effettuata con appositi strumenti, la maggior parte dei quali commerciali. Esiste anche una procedura basata su Gparted.

Inoltre, alcuni produttori di SAN/NAS (come NetApp, tramite il suo portale Now) forniscono procedure e/o strumenti per allineare le partizioni specifici per i diversi hypervisor.

Per ulteriori informazioni:

2 thoughts on “Allineamento dei dischi nel mondo virtuale

  1. Il problema maggiore secondo me è capire se le performance del mio sottosistema sono corrette (quali range e quali test devo prendere come riferimento)?
    E soprattutto come migliorarle…

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *