Cerca tempi
Il problema è che l' amplificazione della ricerca in scrittura si comporta in modo molto diverso dall'amplificazione della velocità di scrittura . L'amplificazione minima del throughput di scrittura con parità si verifica quando un'intera riga viene scritta contemporaneamente (chiamiamo questo aggettivo "full-stripe"), tuttavia l'amplificazione minima della ricerca in scrittura si verifica, al contrario, quando l'intera scrittura che segue una ricerca nel dispositivo virtuale si adatta un singolo pezzo. Prima di entrare nei dettagli, le relazioni sono molto più facili da comunicare in forma tabellare:
RAID | write throughput amplification factor | write seek amplification factor
| full-stripe (e.g.) | single-chunk | full-stripe | single-chunk
0 | 1 ; 1 | 1 ; 1 | n ; 12 | 1 ; 1
1 | n ; 12 | n ; 12 | n ; 12 | n ; 12
5 | n/(n - 1) ; ~1.1 | min [3, n] ; 3 | n ; 12 | min [3, n] ; 3
6 | n/(n - 2) ; 1.2 | min [5, n] ; 5 | n ; 12 | min [5, n] ; 5
*1+0 | n₁ ; 3 | n₁ ; 3 | n ; 12 | n₁ ; 3*
1+5 | n/(n₅ - 1) ; 2.4 | expr₁ ; 5 | n ; 12 | expr₁ ; 5
*1+6 | n/(n₆ - 2) ; 3 | expr₂ ; 8 | n ; 12 | expr₂ ; 8*
expr₁ = 2n₁ + min [1, n₅ - 2]
expr₂ = 3n₁ + min [2, n₆ - 3]
dove n è il numero totale di unità, n₁ è il numero di unità nei gruppi RAID 1 e n₅ e n₆ sono il numero di gruppi rispettivamente negli array RAID 5 o RAID 6. Gli esempi si riferiscono all'esempio di 12 unità nella domanda (le righe pertinenti sono ' *bolded*
'); esempi per i livelli RAID 1 + 0, 1 + 5, 1 + 6 sono rispettivamente 4 × 3, 6 × 2, 6 × 2.
Si noti che solo il fattore di amplificazione del throughput di scrittura a banda intera è direttamente correlato alla percentuale di ridondanza. I casi a pezzo singolo sono più complicati per quelli con parità. Si presentano perché la scrittura di un singolo blocco richiede la lettura di qualsiasi blocco di parità più semplice o degli altri blocchi di dati, prima di scrivere i blocchi di parità insieme al nuovo blocco di dati. (Non sono direttamente moltiplicativi perché le letture indotte devono invece essere moltiplicate per il rispettivo throughput di lettura / fattore di amplificazione di ricerca per RAID 1, essendo entrambi 1; vedere di seguito.)
Sfortunatamente, la scelta di una dimensione del blocco che minimizza questa ulteriore amplificazione del throughput di scrittura ha l'effetto collaterale di massimizzare effettivamentela scrittura cerca l'amplificazione. Per le scritture minuscole con un tempo di scrittura trascurabile rispetto al tempo di ricerca, le prestazioni di scrittura dello striping con una dimensione del blocco molto piccola (per essere full-stripe) sono solo 1 ×, come il mirroring, in quanto richiedono tutte le unità i blocchi per ogni scrittura e il rendimento ottenuto dalla mobilitazione di tutte queste unità sono irrilevanti. Ha diviso il rapporto tra tempo di scrittura e tempo di ricerca per il numero di unità nell'array, ma per le scritture minuscole questo era già trascurabile. Non avrebbe senso usare una pezzatura così piccola da rendere a strisce piene anche le piccole scritture. Per le scritture abbastanza piccole da sentire gli effetti della ricerca, è meglio che si inseriscano in un singolo blocco.
RAID | large contiguous write throughput | concurrent tiny writes throughput
| full-stripe | single-chunk | full-stripe | single-chunk
0 | n× ; 12× | n× ; 12× | 1× ; 1× | n× ; 12×
1 | 1× ; 1× | 1× ; 1× | 1× ; 1× | 1× ; 1×
5 | (n - 1)× ; 11× | max[n/3, 1]×; 4× | 1× ; 1× | max[n/3, 1]×; 4×
6 | (n - 2)× ; 10× | max[n/5, 1]×; 2.4× | 1× ; 1× | max[n/5, 1]×; 2.4×
*1+0 | n₀× ; 4× | n₀× ; 4× | 1× ; 1× | n₀× ; 4× *
1+5 | (n₅ - 1)×; 5× | expr₃× ; 2.4× | 1× ; 1× | expr₃× ; 2.4×
*1+6 | (n₆ - 2)×; 4× | expr₄× ; 1.5× | 1× ; 1× | expr₄× ; 1.5×*
expr₃ = n/(2n₁ + min [1, n₅ - 2]) = max [n/(2n₁ + 1), n/(2n₁ + n₅ - 2)]
expr₄ = n/(3n₁ + min [2, n₆ - 3]) = max [n/(3n₁ + 2), n/(3n₁ + n₆ - 3)]
Nota: le 2 colonne di throughput intermedie possono essere ignorate, data una dimensione sensibile del blocco che è maggiore delle scritture per le quali il tempo di ricerca è significativo, ma abbastanza piccolo da consentire che le scritture di grandi dimensioni siano a strisce complete. Le grandi dimensioni del blocco della seconda colonna di throughput sono più simili alle unità con spanning. Una scrittura "minuscola" è dove l'effetto del throughput è trascurabile.
Avere una dimensione del blocco in modo inappropriato aumenta anche l'effetto dell'amplificazione della ricerca per le letture, anche se non tanto e solo nel caso della banda intera.
RAID | read throughput amplification factor | read seek amplification factor
| full-stripe | single-chunk | full-stripe (e.g.) | single-chunk
0 | 1 | 1 | n to n; 12 | 1
1 | 1 | 1 | 1 to n; 1–12 | 1
5 | 1 | 1 | n - 1 to n; 11–12 | 1
6 | 1 | 1 | n - 2 to n; 10–12 | 1
*1+0 | 1 | 1 | n₀ to n; 4–12 | 1 *
1+5 | 1 | 1 | n₅ - 1 to n; 5–12 | 1
*1+6 | 1 | 1 | n₆ - 2 to n; 4–12 | 1 *
Nota: "to n" è perché quando si verifica contemporaneamente una sola lettura, è teoricamente possibile mobilitare tutte le unità per cercare luoghi appropriati e leggere collettivamente i dati per ottenere una velocità di lettura contigua massima.
RAID | large contiguous read throughput | concurrent tiny reads throughput
| full-stripe (e.g.)| single-chunk | full-stripe | single-chunk
0 | n× ; 12× | n× ; 12× | 1× ; 1× | n× ; 12×
1 | n× ; 12× | n× ; 12× | n× ; 12× | n× ; 12×
5 | n× ; 12× | n× ; 12× | n/(n - 1)× ; ~1.1× | n× ; 12×
6 | n× ; 12× | n× ; 12× | n/(n - 2)× ; 1.2× | n× ; 12×
*1+0 | n× ; 12× | n× ; 12× | n₁× ; 3× | n× ; 12×*
1+5 | n× ; 12× | n× ; 12× | n/(n₅ - 1)× ; 2.4× | n× ; 12×
*1+6 | n× ; 12× | n× ; 12× | n/(n₆ - 2)× ; 3× | n× ; 12×*
Nota: anche in questo caso, è possibile ignorare le 2 colonne di throughput intermedie, data una dimensione sensibile del blocco. La terza colonna di throughput è di nuovo strettamente collegata alla percentuale di ridondanza.
Tuttavia, una dimensione del blocco abbastanza grande significa che le letture minuscole non sono mai a banda intera. Pertanto, data un'implementazione efficiente e le dimensioni appropriate del blocco, le prestazioni di lettura dovrebbero essere proporzionali al numero di unità identiche quando non vengono degradate.
Quindi, in realtà, il "fattore di amplificazione" è molto più complicato della formula nella domanda, in cui era stata presa in considerazione solo l'amplificazione del throughput a banda intera. In particolare, le prestazioni di scrittura di 6 × 2 RAID 1 + 6 per le scritture simultanee che sono abbastanza piccole da essere associate alla ricerca saranno peggiori di quelle di RAID 1 + 0 4 × 3. E per le scritture minuscole, che sono tutte ricercate, le prestazioni possono essere solo circa un terzo di quelle di 4 × 3 RAID 1 + 0 nella migliore delle ipotesi (cioè date un'implementazione perfetta).
Dopo aver risolto il problema, il confronto di 12 unità non ha un vincitore assoluto:
| 4×3 RAID 1+0 | 6×2 RAID 1+6
number of identical 1TB drives | 12 | 12
storage capacity | 4TB | 4TB
redundancy proportion | 2/3 | 2/3
large contiguous write throughput | 4× | 4×
large contiguous read throughput | 12× | 12×
concurrent tiny writes throughput |*4× | 1.5×
concurrent tiny reads throughput | 12× | 12×
safe number of random drive loses | 2 |*5
12 - 1 large write throughput | 4× | 4×
12 - 1 large read throughput | 8× |*11×
12 - 1 tiny writes throughput |*4× | ~1.42×
12 - 1 tiny reads throughput | 8× |*~9.33×
can split-off a copy for backup | yes[1] | yes[1]
2-site failover | yes | yes
2-copy large write throughput | 4× | 4×
2-copy large read throughput |*8× | 6×
2-copy tiny writes throughput |*4× | ~1.28×
2-copy tiny reads throughput |*8× | 6×
2-copy safe random drive loses | 1 |*2
2-copy - 1 large write throughput | 4× | 4×
2-copy - 1 large read throughput | 4× |*5× or 6×[2]
2-copy - 1 tiny writes throughput |*4× | ~1.46× or 1.2×[2]
2-copy - 1 tiny reads throughput | 4× |*3.6x or 6×[2]
can be divided into 3 full copies | yes | yes
3-site failover | yes | yes
1-copy large write throughput | 4× | 4×
1-copy large read throughput | 4× | 4×
1-copy tiny writes throughput |*4× | ~0.85×
1-copy tiny reads throughput |*4× | 2×
1-copy safe random drive loses | 0 | 0
complexity |*simple | more complex
Nota 1: una copia completa dei dati memorizzati è rispettivamente un quadruplo RAID 0 o un array RAID 6 degradato 4/6. Nota 2: esiste anche la possibilità che il guasto dell'unità disattivi una delle 4 coppie RAID 1 degradate o degrada una delle 2 coppie normali.
Tuttavia, avrebbe il doppio delle prestazioni di lettura di un array RAID 6 di 6 unità e il throughput di piccole scritture dovrebbe essere migliore del 25% (1,5 / 1,2) a causa della suddivisione delle letture richieste tra le coppie RAID 1, e RAID 6 ovviamente lo fa hanno applicazioni adatte, quindi in applicazioni ad alta disponibilità che hanno le scritture più grandi o che sono più preoccupato per le prestazioni in lettura di prestazioni in scrittura, forse c'è è una nicchia per RAID 1 + 6 dopotutto. Ma non è tutto ...
Complessità
Questo è ancora solo in teoria fino ad ora (principalmente combinatoria ), in pratica la complessità significherà che le implementazioni di RAID 1 + 6 possono avere carenze che mancano opportunità e non raggiungono i risultati teorici. RAID 6 è già più complesso e la nidificazione aggiunge un po 'più di complessità a questo.
Ad esempio, non è immediatamente ovvio che 6 × 2 RAID 1 + 6 può essere estratto in modo da avere 3 testine di lettura virtuali indipendenti in grado di leggere simultaneamente 3 letture contigue di grandi dimensioni a 4 × throughput ciascuna, proprio come 4 × 3 RAID 1 + 0. La semplice nidificazione di 6 coppie RAID 1 in un array RAID 6 utilizzando un software RAID potrebbe non essere così elegante; l'implementazione può essere stupida e thrash (non ho ancora verificato questa ipotesi).
La complessità presenta anche un aumento dei costi di sviluppo di implementazioni e strumenti. Anche se potrebbero esserci applicazioni che potrebbero beneficiare di tale annidamento, i miglioramenti potrebbero non valere i costi di sviluppo.