Windows Server e Disk Partion Alignement 

Ho già trattato il tema del Disk Partion Alignement nei post SQL Server e il Disk Partition Alignment, Best practices per l’installazione di un Milestone XProtect Recording Server fisico su server DELL PowerEdge R7425 e Configurazione del block storage di Veeam, ma in questo post mi concentrerò sul Disk Partion Alignement dello storage su cui viene installato il sistema operativo.

In questo post prenderò ad esempio lo scenario in Windows Server 2022 viene installato su un server fisico su array dedicato in RAID 1 costituito da 2 dischi SSD. Questo è uno scenario abbastanza comune quando si installa un server Hyper-V, un Domain Controller fisico o un server di video sorveglianza (si pensi ad esempio a un Milestone XProtect Recording Server). In ogni caso le considerazioni che farò in questo post valgono anche per il volume formattato con dimensioni unità di allocazione di 4k in cui vengono memorizzati i dischi virtuali contenti il sistema operativo di macchine virtuali Windows.

Sebbene non sia riuscito a reperire nella documentazione ufficiale Microsoft indicazioni specifiche sul Disk Partion Alignement per il Sistema Operativo, si possono comunque fare alcune considerazioni osservando innanzitutto che tramite il comando fsutil fsinfo ntfsingo c: si può notare che quanto il sistema operativo viene installato il volume di sistema è formattato con dimensioni unità di allocazione di 4k come si evince da valore “Byte per cluster” pari a 4096 (4 KB).

Ciò significa che per avere un Disk Partion Alignement ovvero performance ottimali sulle I/O del disco devono essere rispettate due correlazioni fondamentali:

  • 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)
  • 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)

Come avevo descritto in SQL Server e il Disk Partition Alignment 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\CurrentControlSet\Services\VDS\Alignment).

Quindi se ad esempio si considerano i seguenti valori di Stripe Size si avranno i valori riportati considerando i valori di Partition Offset pari a 1.024 KB e File Allocation Unit Size pari a 4 KB:

Come si può notare tutti i valori di Stripe Size considerati garantiscono il Disk Partion Alignement, ma per selezionare il valore della Stripe Unit Size più opportuno per l’array RAID 1 dedicato al sistema operativo occorre tenere conto anche delle seguenti:

  • una strip size più piccola potrebbe essere più vantaggiosa per massimizzare le prestazioni in scenari in cui vengono eseguite molte operazioni di I/O di piccole dimensioni, ciò è particolarmente vero per le operazioni di lettura e scrittura casuali su file di dimensioni ridotte, come quelle che si verificano frequentemente durante l’accesso ai file di sistema.
  • una strip size più grande potrebbe essere più appropriata per ottenere prestazioni ottimali in scenari in cui il carico di lavoro è più orientato verso operazioni di I/O di grandi dimensioni, come il trasferimento di file di grandi dimensioni o l’elaborazione di dati di grandi dimensioni, in quanto una strip size più grande consente una maggiore trasmissione di dati per ogni operazione di I/O, riducendo così il carico sul controller RAID.
  • Stripe size troppo grandi rispetto alla dimensione delle operazioni di I/O tipiche possono comportare un maggiore overhead di gestione per il controller RAID e il sistema operativo con un conseguente spreco di risorse e una riduzione delle prestazioni effettive.
  • per gli array RAID con dischi SSD, è preferibile utilizzare stripe size più piccoli rispetto agli array RAID con HDD.
  • Gli SSD utilizzano il “livellamento dell’usura” (Wear Leveling) per distribuire uniformemente le operazioni di scrittura su tutte le celle di memoria prolungando la vita utile dell’SSD, quindi una stripe size più grande potrebbe influenzare il livellamento dell’usura, poiché le operazioni di scrittura sarebbero distribuite su un maggior numero di celle, in ogni caso va considerato che la maggior parte dei controller SSD incorpora algoritmi intelligenti per gestire efficacemente il livellamento dell’usura, riducendo l’impatto della stripe size.

Partendo da queste considerazioni il valore dello Stripe size non deve essere eccessivo dal momento che l’array in RAID 1 con dischi SSD è destinato al solo sistema operativo che nella nomale operatività esegue principalmente operazioni di I/O in lettura su file in genere di piccole dimensioni.

Quindi la scelta dello Strip size in linea di massima potrebbe essere eseguita seguendo una di queste due regole:

  • Accettare il valore di default dello Stripe Size proposto dal software di configurazione del RAID messo a disposizione dal produttore hardware del controller o del server.
  • Impostare un valore di Stripe Size compreso tra 64kb e 256kb tenendo conto che in linea generale  sono validi i segueneti:
    • Priorità di lettura sequenziale: Stripe size tra 128KB – 256KB
      Questo range è adatto per carichi di lavoro con una forte priorità di lettura sequenziale, come il trasferimento di file di grandi dimensioni o il recupero di dati da sequenze di dati continue. Stripe size più grandi possono ottimizzare il trasferimento di blocchi di dati di dimensioni maggiori, migliorando l’efficienza complessiva del sistema.
    • Priorità di scrittura sequenziale e casuale: Stripe size tra 64KB – 128KB
      Questo range è adatto per carichi di lavoro con una forte priorità sia di scrittura sequenziale che casuale. Stripe size più piccole possono essere vantaggiose per gestire operazioni di I/O di piccole dimensioni e miste, migliorando la reattività del sistema e riducendo la latenza.
    • Bilanciamento tra lettura e scrittura: Stripe size tra 96KB – 192KB
      Questo range fornisce un bilanciamento tra le priorità di lettura e scrittura, offrendo una dimensione di stripe che può gestire efficacemente una varietà di operazioni di I/O. Questo può essere utile per carichi di lavoro misti che coinvolgono sia operazioni di lettura che di scrittura in proporzioni significative.

In conclusione conviene accettare il valore di default dello Stripe Size proposto dal software di configurazione del RAID se è compreso tra 64KB e 256KB in caso contrario 128 KB o 256KB potrebbero essere un buon compromesso, mentre 64 KB potrebbe essere più appropriato se si fanno principalmente operazioni di I/O di piccole dimensioni  e per ottimizzare l’uso dello spazio.