SQL Server e il Disk Partition Alignment

Il Disk Partion Alignement  (ovvero l’allineamento della della geometrie del disco e della partizione) è una best practies che può portare ad un significativo aumento delle performance in determinati contesti anche se spesso rischia di essere poco considerata.

Innanzitutto va detto che l’”allineamento” consiste nel far sì che le operazioni di IO sui dischi  da parete di SQL Server avvengano in maniera ottimizzata, dal momento che la file allocation unit size (cluster size) raccomandata per SQL Server è di 64 KB (che coincide con un singolo SQL Server extent)  il concetto è quello di allineare i dati ai vari livelli (stripe, partizione e volume) per fare in modo che i dati siano gestiti a blocchi o multipli di 64 KB in modo da ridurre il numero di I/O richiesti.

image

Come già detto precedentemente l’allineamento si ottiene lavorando a tutti i livelli:

  • Stripe (ovvero il RAID)
  • Partizione
  • Volume (ovvero file allocation)

La dimensione del settore, che rappresenta la più piccola unità fisica di archiviazione sul disco, è invece fissata dal costruttore del disco. Storicamente la dimensione era fissata a 512 byte, ma ora i nuovi drive ha dimensioni del settore che posso variare da 1KB, 2KB o 4KB.

Impostazione dello Stripe size

Lo strip size è l’unità di dati che scritta e letta quando i dischi sono in RAID. L’indicazione che viene data per SQL Server è quella di impostare lo strip size tra 64 KB e 256 KB e in particolare se occorre operare su tabelle con dimensioni superiori a 100 MB uno stripe size di 256 KB risulterà più efficiente.

A riguardo di veda Physical Database Storage Design:

“A smaller stripe size allows data to be distributed to more disks and increase I/O parallelism. Note that the stripe size of a single SQL Server extent (64 KB) is the lower limit. For the same data, a larger stripe size means the data can be stored on fewer disks and decrease the I/O distribution and the degree of parallelism. We recommend a 64 KB or 256 KB stripe size for most workloads. When the workload includes table and index range scans on tables that are larger than 100 MB, a stripe size of 256 KB allows for more efficient read-ahead.”

Allineamento a livello di Partizione (o Partition Alignment)

L’allineamento a livello di partizione consiste nell’impostare il Partition Offset in quanto il disk array riserva 63 o 32 settori nascosti e Windows di conseguenza riserva questi settori all’inizio della prima partizione di un disco in cui fa risiedere il Master Boot Record (MBR). Questi 32 o 63 settori iniziali sono la causa del disallineamento tra la partizione lo stripe in quanto l’accesso al singolo cluster di dati avverrà accedendo a attraverso più stripe unit del RAID.

Per essere precisi in WS2003\XP e precedenti l’allineamento di default per la partizione è di 32.256 bytes ovvero 31.5 KB, mentre in WS2008\Vista e successivi il Partition Offset è per default di 1.048.576 byte ovvero 1024 KB per dischi di dimensione superiore a 4 GB (il valore è configurabile tramite la chiave di registro HKLM\SYSTEM\CurrentCpntrolSet\Services\VDS\Alignment).

Quindi in WS2008\Vista il Partition Alignment non  è necessario, mentre lo è sul sistemi WS2003\XP e precedenti.

Per avere informazioni sulla partizione è possibile usare il comando wmic partition get BlockSize, StartingOffset, Name, Index

image

Per i dischi dinamici è possibile utilizzare il comando dmdiag –v.

Il drive di sistema su versioni di Windows precedenti a WS2008/Vista non possono essere allineati, ma si noti che le best practies sconsigliano di lasciare i file di dati e i logs sulla partizione di sistema per evitare problemi di performance dovuti alle operazioni di IO svolte dall’OS e dalla gestione del file di paginazione.

Nei sistemi in cui è necessario intervenire per impostare il Partition Offset è possibile utilizzare il comando diskpart.exe in WS2003 e successivi (con l’SP1 di WS2003 è stata introdotta l’opzione /align), per WS2000 è disponibile tramite il Windows 2000 Resource Kit il tool diskpar.exe.

Allineamento a livello di Volume (o File Allocation Unit Size)

L’allineamento a livello di volume consiste nell’impostare il File Allocation Unit Size, ovvero i bytes per cluster, ottimale per ottimizzare le operazioni di IO tenendo conto che, come detto precedentemente, il singolo SQL Server extent è di 64 KB.

Per visualizzare le informazioni sull’allineamento a livello di volume è possibile usare il comando fsutil fsinfo ntfsinfo drive:.

image  image

Il default cluster size per NTFS è di 4096 bytes ovvero 4 KB per dimensioni di volume fino a 16 TB come indicato nel seguente Default cluster size for NTFS, FAT, and exFAT, ma è modificabile quando si esegue la formattazione del volume è in base alle best practies  di SQL Server va impostato a 64 KB.

Correlazioni tra Stripe Unit, Partition Offset e File Allocation Unit Size

Per avere performance ottimali sulle I/O del disco devono essere rispettate due correlazioni fondamentali:

  1. Il rapporto Partition Offset / Stripe Unit Size deve essere un numero intero (il risultato intero di questo rapporto garantisce l’allineamento tra Partizione e Stripe)
  2. Il rapporto Stripe Unit Size / File Allocation Unit Size deve essere un numero intero (il risultato intero di questo rapporto garantisce l’allineamento tra Volume e Stripe)

Esempio

Consideriamo ad esempio di volere gestire l’allineamento per la partizione dedicata al file dati e/o file log di SQL Server in ambiente WS2008 R2 utilizzando un controller Smart Array HP per un Database OLTP di tipo gestionale (quindi con possibilità di dover gestire tabelle di dimensione uguale o superiore ai 100 MB).

Gli Smart Array HP impostano 32 settori per traccia per drive logici con dimensione fino a 502 GB e 63 settori per traccia per drive logici con dimensioni superiori a 502 GB (è possibile forzare l’uso di 63 settori per traccia impostando l’opzione MaxBoot di drive logico). Lo Stripe Size può assumere i valori di 8 KB, 16 KB, 32 KB, 64 KB, 128 KB, 256 KB, 512 KB e 1024 KB e il valore di default dipende dall’impostazione del RAID level (per ulteriori informazioni si vedano i Manuali HP).

In base alle considerazioni fatte precedentemente occorre impostare lo Stripe Size a 256 KB.

Dal momento che si è ipotizzato un ambiente WS2008 R2 per impostazione predefinita il Partition Offset sarà di 1024 KB.

Quindi il primo rapporto Partition Offset / Stripe Unit Size sarà di 4 ovvero un valore intero garantendo quindi l’allineamento tra Stripe e Partizione.

In base alle best practies viste precedentemente occorre formattare il volume con Dimensione Unità di Allocazione (File Allocation Unit Size) di 64 KB.

Quindi il primo rapporto Stripe Unit Size / File Allocation Unit Size sarà di 4 ovvero un valore intero garantendo quindi l’allineamento tra Stripe e Volume.

Considerazioni per ambienti virtuali

Per quanto riguarda i drive virtuali questi devono essere allineati al drive dell’Host quindi occorre seguire le regole viste per i volumi, partizioni e stripe che conterranno i VHD inoltre la partizione all’interno del VHD dovrà essere allineata con il corretto Partition Offset e il volume formatto con una Dimensione Unità di Allocazione (File Allocation Unit Size) di 64 KB.

image

Per ulteriori informazioni e considerazioni si veda Hyper-V VM Partition Alignment.

Conclusioni

Per un’approfondimento sull’argomento si veda l’articolo Disk Partition Alignment Best Practices for SQL Server in cui viene analizzata in dettaglio la tematica e vengono anche proposti alcune rilevazioni in scenari reali per capire l’impatto sulle performance su sistemi allineati e non allineati. Ad esempio su un scenario OLTP con workload che coinvolgono table scans, update e selezioni le performance su un sistema “allineato” si aggira sul 30% in più rispetto ad un sistema in cui non è stato eseguito l’allineamento. Ovviamente le performance riportate dagli autori (JimmyMay e Denny Lee) vanno poi verificate nei propri scenari con l’hardware che si ha a disposizione e, tempo permettendo, occorrerebbe anche  provare quale valore di Stripe Size conferisce nella propria realtà performance migliori (ovviamente nell’ambito dei valori che garantiscono l’allineamento).

I concetti che abbiamo visto si applicano in realtà anche a tutti questi servizi che hanno a che fare con trattamento intensivo di dati, ovviamente occorre gestire correttamente l’allineamento sulla base della File Allocation Unite Size suggerita.

Ad esempio per quanto riguarda i file di dati e log di Analisys Services è suggerita una File Allocation Unite Size di 32 KB, mentre per i file .edb e i logs file di Exchange una File Allocation Unite Size di 64 KB.

Per ulteriori informazioni si veda anche SQL Server Unplugged Follow Up.