01 dicembre 2009

Ottimizzare ext3 su RAID

Una domanda che mi sono sempre fatto, quando mi trovo a lavorare con un filesystem ext2/3 nuovo su volumi sempre più grandi, è come possa un filesystem praticamente invariato da decenni a supportare unità logiche di centinaia di GB senza in qualche modo "accusare il colpo". Per questo preferisco filesystem più moderni ma, ahimè, non supportati o non mainstream sotto Linux.

ext3 per altro verso presenta caratteristiche molto interessanti per Oracle: supporta il direct I/O e l'I/O asincrono, due feature molto importanti per massimizzare le prestazioni di un database sotto Linux. Ma i 4 KB di dimensione massima del blocco e la struttura abbastanza tradizionale del filesystem mi lasciano perplesso di fronte a unità logiche di qualche terabyte.
Pensiamo ad esempio ai nuovi filesystem come btrfs o ZFS (due a caso :-)). Praticamente non c'è paragone tra ext3 e i filesystem di nuova generazione.

Mentre aspettiamo che Linux si decida ad adottare un filesystem di livello enterprise e con caratteristiche moderne, possiamo massimizzare almeno le prestazioni di ext3 adattandolo all'astrazione dell'hardware sottostante con cui ci troviamo ad operare, tipicamente un'unità RAID.

Dobbiamo considerare che alcuni livelli RAID, come il RAID5, soffrono di lentezze strutturali in scrittura a causa del calcolo di parità, arrivando al massimo delle performance solo quando viene effettuata una scrittura di una stripe completa. Durante la creazione di un volume RAID è solitamente possibile specificare la stripe size, da pochi KB fino a circa 256 KB e oltre.

ext3 ha un paio di parametri che aiutano a ottimizzare il filesystem in scrittura: stride e stripe-width.

stride è il numero di blocchi di filesystem che servono per scrivere una stripe (nel caso ext3 un blocco è di 4 KB praticamente sempre).
stripe-width è la quantità di blocchi che servono a coprire una scrittura completa su tutti i dischi che "portano" dati, multiplo intero della stride.
Mi spiego meglio con un esempio: RAID5 usa una parità distribuita che risulta in uno spazio disponibile di n-1 dischi, quindi con una certa stripe size verranno scritte n-1 stripe che "portano dati" sui dischi, e 1 stripe di parità; questa è la stripe width, e per ext3 si misura in blocchi e corrisponde a stride*(n-1)*blocksize nel caso di RAID5.

C'è un documento di Centos sull'ottimizzazione di ext3 con l'ottimizzazione per il RAID nell'ultimo paragrafo, anche se c'è qualche errore di notazione. Il fatto che stripe-width sia stato rimosso da Centos 5.3 corrisponde a verità purtroppo anche per RHEL. Non riesco a spiegarmi questo fatto, quando sulla mia Ubuntu desktop è ben presente.

Qualcuno si è creato anche la calcolatrice apposita, che potete trovare qui: http://busybox.net/~aldot/mkfs_stride.html