Buscar tiempos
El problema es que la amplificación de búsqueda de escritura se comporta de manera muy diferente a la amplificación de rendimiento de escritura . La amplificación mínima del rendimiento de escritura con paridad ocurre cuando se escribe una franja completa a la vez (llamemos a este adjetivo 'franja completa') pero la amplificación de búsqueda de escritura mínima ocurre, por el contrario, cuando la escritura completa después de una búsqueda en el dispositivo virtual encaja Un solo pedazo. Antes de entrar en detalles, las relaciones son mucho más fáciles de transmitir en forma tabulada:
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]
donde n es el número total de unidades, n₁ es el número de unidades en los grupos RAID 1, y n₅ y n₆ son el número de grupos en las matrices RAID 5 o RAID 6 respectivamente. Los ejemplos se relacionan con el ejemplo de 12 unidades en la pregunta (las filas relevantes son ' *bolded*
'); Ejemplos de niveles RAID 1 + 0, 1 + 5, 1 + 6 son 4 × 3, 6 × 2, 6 × 2 respectivamente.
Tenga en cuenta que solo el factor de amplificación de rendimiento de escritura de banda completa está directamente relacionado con la proporción de redundancia. Los casos de un solo fragmento son más complicados para aquellos con paridad. Surgen porque escribir un solo fragmento requiere leer el fragmento de paridad más fácil u otros fragmentos de datos, antes de escribir los fragmentos de paridad junto con el nuevo fragmento de datos. (No son directamente multiplicativos porque las lecturas inducidas deben multiplicarse por el respectivo rendimiento de lectura / factor de amplificación de búsqueda para RAID 1, siendo ambos 1; ver más abajo).
Desafortunadamente, elegir un tamaño de fragmento que minimice esta amplificación de rendimiento de escritura adicional tiene el efecto secundario de maximizarLa escritura busca amplificación. Para escrituras pequeñas con un tiempo de escritura insignificante en comparación con el tiempo de búsqueda, el rendimiento de escritura de la creación de bandas con un tamaño de fragmento muy pequeño (para ser una franja completa) es solo 1 ×, como la duplicación, ya que requiere que todas las unidades busquen los fragmentos para cada escritura y el rendimiento obtenido de la movilización de todas estas unidades es irrelevante. Ha dividido la proporción de tiempo de escritura para buscar el tiempo por el número de unidades en la matriz, pero para pequeñas escrituras esto ya era insignificante. No tendría sentido usar un tamaño de fragmento tan pequeño como para que incluso las escrituras pequeñas sean de banda completa. Para las escrituras lo suficientemente pequeñas como para sentir los efectos de la búsqueda, es mejor que encajen en un solo fragmento.
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: Las columnas de rendimiento medio 2 pueden ignorarse dado un tamaño de fragmento sensible que es mayor que las escrituras para las cuales el tiempo de búsqueda es significativo, pero lo suficientemente pequeño como para que las escrituras grandes sean de banda completa. El gran tamaño de la segunda columna de rendimiento es más parecido a las unidades distribuidas. Una escritura 'pequeña' es donde el efecto del rendimiento es insignificante.
Tener un tamaño de fragmento incorrectamente pequeño también aumenta el efecto de la amplificación de búsqueda para las lecturas, aunque no tanto y solo en el caso de la franja completa.
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: El 'a n' se debe a que cuando solo hay una lectura simultánea, es teóricamente posible movilizar todas las unidades para buscar lugares apropiados y leer colectivamente los datos para obtener el máximo rendimiento de lectura contigua.
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: Nuevamente, las 2 columnas de rendimiento medio pueden ignorarse dado un tamaño de fragmento sensible. La tercera columna de rendimiento vuelve a estar estrechamente relacionada con la proporción de redundancia.
Sin embargo, un tamaño de fragmento lo suficientemente grande significa que las lecturas pequeñas nunca tienen una franja completa. Entonces, dada una implementación eficiente y un tamaño de fragmento adecuado, el rendimiento de lectura debe ser proporcional al número de unidades idénticas cuando no se degrada.
Entonces, realmente, el 'factor de amplificación' es mucho más complicado que la fórmula en la pregunta, donde solo se había considerado la amplificación de rendimiento de banda completa. En particular, el rendimiento de escritura de 6 × 2 RAID 1 + 6 para escrituras concurrentes que son lo suficientemente pequeñas como para ser vinculadas a búsqueda será peor que el de 4 × 3 RAID 1 + 0. Y para pequeñas escrituras, que son todas buscadas, el rendimiento solo puede ser aproximadamente un tercio del de 4 × 3 RAID 1 + 0 en el mejor de los casos (es decir, dada una implementación perfecta).
Una vez aclarado ese problema, la comparación de 12 unidades no tiene un ganador absoluto:
| 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 de los datos almacenados es, respectivamente, un RAID 0 cuádruple o una matriz RAID 6 degradada 4/6. Nota 2: Existe la posibilidad de que la falla de la unidad desconecte uno de los 4 pares RAID 1 degradados o degrade uno de los 2 pares normales.
Sin embargo, tendría el doble de rendimiento de lectura de una matriz RAID 6 de 6 unidades y el rendimiento de escritura minúsculo debería ser un 25% mejor (1.5 / 1.2) debido a que las lecturas requeridas se dividen entre los pares RAID 1, y RAID 6 obviamente lo hace tiene aplicaciones adecuadas, por lo que en aplicaciones de alta disponibilidad que tienen las escrituras más grandes o que están más preocupados por el rendimiento de lectura de rendimiento de escritura, tal vez no es un nicho para RAID 1 + 6 después de todo. Pero eso no es todo…
Complejidad
Hasta ahora, esto es solo en teoría (principalmente combinatoria ), en la práctica la complejidad significará que las implementaciones de RAID 1 + 6 pueden tener deficiencias que pierden oportunidades y no logran los resultados teóricos. RAID 6 ya es más complejo, y anidar agrega un poco más de complejidad además de esto.
Por ejemplo, no es obvio de inmediato que 6 × 2 RAID 1 + 6 se pueda abstraer con 3 cabezales de lectura virtuales independientes capaces de leer simultáneamente 3 lecturas grandes contiguas con un rendimiento de 4 × cada una, al igual que 4 × 3 RAID 1 + 0. Simplemente anidar 6 pares RAID 1 en una matriz RAID 6 usando un software RAID puede no ser tan elegante; la implementación puede ser estúpida y trepidante (todavía no he probado esta hipótesis).
La complejidad también presenta un mayor costo de desarrollo de implementaciones y herramientas. Aunque puede haber aplicaciones que podrían beneficiarse de tal anidamiento, las mejoras pueden no valer los costos de desarrollo.