Questo post è stato già pubblicato su HostingTalk, viene ripubblicato su Juku in quanto è la traduzione dell’articolo in Inglese già apparso qui.

Sabato stavo vagando nella blogosfera dello storage e mi sono soffermato sull’interessante post di Nigel sulle considerazioni da fare durante il design di uno storage con funzionalità di Sub-Lun tiering, Nigel si soffermava sul fatto che gli SSD non sono molto affidabili per le scritture (in uno scenario dove gli SSD sono trattati quasi come “cache”) a causa di un problema chiamato “write amplification”. Questo ha suscitato il mio interesse nel creare un post che spieghi in un modo “umanamente capibile”, come un drive SSD funziona e quali magie deve fare per andare così forte :-).

Subito una precisazione: ci sono diversi device sul mercato chiamati SSD, ma io mi soffermerò unicamente sugli SSD basati su memorie NAND che rappresentano un rimpiazzo di tipo “drop-in” ai dischi tradizionali comunemente impiegati negli storage array ed anche nei device consumer.

Cosa è una memoria NAND?

NAND è una memoria a stato solido non volatile. Le memorie non volatili hanno la capacità di registrare e mantenere i dati in esse contenuti anche quando viene tolta loro energia, registrano i dati in grandi batterie di transistor. I transistor SLC (Single Level Cells) possono registrare un solo bit di dati, mentre i transistor MLC (Multi Level Cells) possono immagazzinare due bit di dati in ciascuna cella.

Se comparate alle memorie flash NOR tradizionali, le memorie NAND possono immagazzinare un maggior numero di celle in una determinata area. Le memorie NAND ottengono questi vantaggi condividendo alcune delle aree comuni dei transistor creando stringe ti transistor connessi in modo seriale fra di loro (nei device NOR ciascun transistor è isolato). Questa architettura seriale spiega anche il nome del device: NAND (not AND) è la logica booleana con cui le informazioni vengono lette dalle celle.

SLC vs. MLC

Le memorie NAND di tipo SLC immagazzinano un singolo bit di informazione per ogni cella. Questa semplice tecnologia permette velocità di trasfermiento maggiori, minor consumo di energia e una maggior durabilità. Le celle a multi livello (MLC), al contrario, immagazzinano due bit di informazione per ciascuna cella, raddoppiando il numero di dati che può essere immagazzinato in un device delle stesse dimensioni, ma questo ha ovviamente un costo.

Come si può chiaramente vedere dalla tabella sotto, le celle MLC sono soggette ad un più breve ciclo vitale ed a peggiori performance quando le compariamo alle celle di tipo SLC:

Caratteristiche MLC SLC
Densità 32/64mbit 16mbit
Bit per Cella 2 1
Voltaggio 3.3V 3.3V, 1.8V
Grandezza Pagina 2 / 4 K 2 K
Cicli di Erase / Program < 10.000 < 100.000
Performance Lettura 50 µs 25 µs
Performance Scrittura 600 / 900 µs 200 / 300 µs
Performance Erase 3 ms 1.5 / 2 ms

Fino all’anno scorso, gli unici SSD di livello enterprise sul mercato erano quelli SLC (il più famoso è sicuramente lo ZeusIOPS di STEC), ma grazie agli avanzamenti tecnologici, i drives MLC hanno fatto recentemente la loro apparizione nel mercato enterprise con un nuovo standard chiamato E-MLC (enterprise-grade multilevel cell).

Come operano internamente gli SSD

Gli SSD sono soggetti a molte “particolarità” a causa delle loro celle NAND, per esempio, le celle NAND devono essere cancellate un intero blocco alla volta (che è una operazione che richiede circa 2.000µs) e una scrittura (o programmazione) deve essere fatta obbligatoriamente su un blocco cancellato.

Questo porta ad un fenomeno chiamato Write Amplification (Amplificazione delle scritture), in quanto la memoria flash deve essere cancellata prima di essere riscritta, il processo per realizzare queste operazioni risulta in una movimentazione (o riscrittura) dei dati dell’utente e dei metadati per più di una volta. Questo effetto moltiplicatore accresce il numero di scritture richieste durante la vita dell’SSD il che si traduce in un minor tempo di vita delle celle. Queste scritture aggiuntive consumano anche banda verso la memoria flash che riducono di conseguenza le performance di scrittura randomica dell’SSD. Molti fattori vanno a modificare la write amplification di un SSD, alcune possono essere controllate direttamente dall’utente mentre altre sono il diretto risultato di come i dati vengono scritti e dall’utilizzao dell’ SSD.

Quando i dati vengono scritti per la prima volta su di un SSD, le celle sono tutte nello stato erased per cui i dati possono essere scritti direttamente utilizzando le pagine (spesso di dimensioni dai 4 agli 8 KB). Il controller SSD, che gestisce la memoria flash e le interfacce con il sistema host, utilizza un mapping logico-fisico chiamato LBA (logical block addressing) che è parte del Flash Abstraction Layer (su cui torneremo fra poco). Quando entrano nuovi dati per rimpiazzarne altri già scritti, il controller SSD scriverà i nuovi dati in una nuova locazione ed aggiornerà la mappatura logica verso la nuova locazione fisica. La vecchia locazione fisica non conterrà più quindi dati validi, ma dovrà essere cancellata prima che possa essere riscritta di nuovo.

La FAL che viene in aiuto

La Flash Abstraction Layer (FAL) fornisce una astrazione di alto livello dell’organizzazione fisica del device NAND. Emula la riscrittura dei settori in un hard-disk rimappando i nuovi dati verso un’ altra locazione dell’array di memoria e marcando il settore precedente come invalido.

Per meglio comprendere questo concetto, pensate ad un qualcosa che assomiglia ad un log di un database oppure al WAFL di NetApp (Write Anywhere File Layout).

Tipicamente l’SSD arriva già overprovisioned dal produttore, significa che c’e’ una differenza tra la capacità fisica della memoria flash e quella invece logica disponibile per l’utente, questa capacità addizionale viene usata dai moduli della FAL che normalmente sono inclusi in ogni controller SSD:

Translation Module

Il Translation Module, che è l’interfaccia primaria nella FAL, fornisce la traslazione tra gli indirizzi fisici e virtuali, e converte le operazioni logiche in operazioni fisiche sulla memoria flash. Inoltre gestisce l’esportazione di tutte le operazioni disponibili sul disco (per esempio: scrivi settore, leggi settore e formatta partizione).

Wear Leveling Module

Il modulo di Wear Leveling si assicura che tutto l’array di memoria sia usato uniformemente, monitorando e distribuendo uniformemente il numero di cicli di cancellazione per blocco. Ogni volta che un blocco viene richiesto dal Translation Module, il modulo di Wear Leveling alloca il blocco meno utilizzato. I cicli di “Program/Erase” sono il numero massimo possibile di operazioni di scrittura e cancellazione di un blocco the per un device SLC è uguale a 100.000 cicli.

Garbage Collection module

Man mano che la FAL emula le riscritture rimappando dati nuovi in un altra locazione dell’array e marca i vecchi settori invalidi, eventualmente sarà poi necessario liberare un po’ di memoria invalidata in modo da permettere ai nuovi dati di essere scritti. Per fare questo, la FAL implementa il modulo di Garbage Collection, dove i settori validi sono copiati in nuove aree libere e le vecchie aree vengono cancellate.

Bad Block management

il modulo di Bad Block Management determina come settare un blocco come bad (cattivo).
I Bad Blocks sono blocchi che contengono uno o più bit invalidati, la cui affidabilità non è più garantita. I Bad Block potrebbero essere presenti quando il device esce dalla fabbrica, oppure potrebbero apparire durante la vita del device. Il modulo di Bad Block Management nasconde i Bad Block dalla FAL impedendone a quest’ultima l’accesso.

Conclusioni

Come potete vedere, la tecnologia SSD è roba parecchio complicata. Io ho solo grattato la superficie con questa piccola analisi ma spero che vi dia la possibilità di farvi una vostra opinione sull’oggetto in questione.