Tempos de busca
A questão é que, a amplificação de busca por gravação se comporta de maneira muito diferente da amplificação da taxa de transferência de gravação . A amplificação mínima da taxa de transferência de gravação com paridade ocorre quando uma faixa inteira é gravada de uma só vez (vamos chamar esse adjetivo de 'faixa completa'), mas a amplificação mínima da pesquisa de gravação ocorre, por outro lado, quando a gravação inteira após uma busca no dispositivo virtual se encaixa um único pedaço. Antes de entrar em detalhes, os relacionamentos são muito mais fáceis de transmitir em forma de tabela:
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]
onde n é o número total de unidades, n₁ é o número de unidades nos grupos RAID 1 e n₅ e n₆ são o número de grupos nas matrizes RAID 5 ou RAID 6, respectivamente. Os exemplos estão relacionados ao exemplo de 12 unidades na pergunta (as linhas relevantes são ' *bolded*
'); exemplos para os níveis de RAID 1 + 0, 1 + 5, 1 + 6 são 4 × 3, 6 × 2, 6 × 2, respectivamente.
Observe que apenas o fator de amplificação da taxa de transferência de gravação de faixa completa está diretamente relacionado à proporção de redundância. Os casos de bloco único são mais complicados para aqueles com paridade. Eles surgem porque a gravação de um único bloco exige a leitura do que for mais fácil entre os blocos de paridade ou os outros blocos de dados, antes de gravar os blocos de paridade junto com o novo bloco de dados. (Eles não são diretamente multiplicativos porque as leituras induzidas devem ser multiplicadas pelo respectivo fator de ampliação da taxa de transferência / busca de leitura para o RAID 1, sendo ambos 1; veja abaixo.)
Infelizmente, escolher um tamanho de bloco que minimize essa amplificação extra da taxa de gravação tem o efeito colateral de realmente maximizara gravação busca amplificação. Para gravações minúsculas com um tempo de gravação desprezível em comparação com o tempo de busca, o desempenho de gravação de faixas com um tamanho de bloco muito pequeno (para ser uma faixa completa) é de apenas 1 ×, como espelhamento, pois exige que todas as unidades procurem os blocos para cada gravação e a taxa de transferência obtida com a mobilização de todas essas unidades são irrelevantes. Ele dividiu a proporção entre o tempo de gravação e o tempo de busca pelo número de unidades na matriz, mas, para pequenas gravações, isso já era insignificante. Não faria sentido usar um tamanho de pedaço tão pequeno que faça gravações minúsculas serem de faixa completa. Para gravações pequenas o suficiente para sentir os efeitos da busca, é melhor que caibam em um único pedaço.
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: As duas colunas de taxa de transferência do meio podem ser ignoradas, devido a um tamanho de bloco sensível que é maior que as gravações para as quais o tempo de busca é significativo, mas pequeno o suficiente para que gravações grandes sejam de faixa completa. O tamanho grande da parte da segunda coluna de taxa de transferência é mais semelhante às unidades estendidas. Uma gravação 'minúscula' é onde o efeito da taxa de transferência é insignificante.
Ter um tamanho de pedaço inapropriadamente pequeno também aumenta o efeito da amplificação de busca para leituras, embora não tanto e apenas no caso de faixa 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: O 'to n' ocorre porque, quando apenas uma leitura ocorre simultaneamente, é teoricamente possível mobilizar todas as unidades para procurar locais apropriados e ler coletivamente os dados para obter uma taxa de transferência de leitura contígua máxima máxima.
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: Novamente, as duas colunas de taxa de transferência do meio podem ser ignoradas, considerando um tamanho de bloco sensato. A terceira coluna de taxa de transferência está novamente estreitamente conectada à proporção de redundância.
No entanto, um tamanho de bloco grande o suficiente significa que pequenas leituras nunca são de faixa completa. Portanto, dada uma implementação eficiente e um tamanho de bloco apropriado, o desempenho da leitura deve ser proporcional ao número de unidades idênticas quando não degradadas.
Realmente, 'fator de amplificação' é muito mais complicado do que a fórmula da pergunta, onde apenas a amplificação da taxa de transferência de faixa completa foi considerada. Em particular, o desempenho de gravação de 6 × 2 RAID 1 + 6 para gravações simultâneas pequenas o suficiente para serem vinculadas à procura será pior do que o de 4 × 3 RAID 1 + 0. E para gravações pequenas, todas procuradas, o desempenho pode ser apenas cerca de um terço do valor de 4 × 3 RAID 1 + 0 no melhor absoluto (ou seja, com uma implementação perfeita).
Depois de esclarecer essa questão, a comparação de 12 unidades não tem um vencedor definitivo:
| 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: Uma cópia completa dos dados armazenados é respectivamente um RAID 0 quádruplo ou um RAID 6 degradado 4/6. Nota 2: Há uma chance uniforme de saber se a falha da unidade desconectou um dos quatro pares de RAID 1 degradados ou degradou um dos dois pares normais.
No entanto, ele teria o dobro do desempenho de leitura de uma matriz de 6 unidades RAID 6 e a pequena taxa de transferência de gravações deveria ser 25% melhor (1,5 / 1,2), devido à divisão das leituras necessárias entre os pares RAID 1, e o RAID 6 obviamente têm aplicações adequadas, portanto, em aplicações de alta disponibilidade que têm gravações maiores ou que estão mais preocupados com o desempenho de leitura do que o desempenho de gravação, talvez lá é um nicho para RAID 1 + 6 afinal. Mas isso não é tudo…
Complexidade
Isso ainda é apenas na teoria até agora (principalmente combinatória ), na prática a complexidade significará que as implementações do RAID 1 + 6 podem ter deficiências que perdem oportunidades e não atingem os resultados teóricos. O RAID 6 já é mais complexo e o aninhamento acrescenta um pouco mais de complexidade.
Por exemplo, não é imediatamente óbvio que 6 × 2 RAID 1 + 6 podem ser abstraídos como tendo 3 cabeças de leitura virtuais independentes capazes de ler simultaneamente 3 leituras grandes contíguas com taxa de transferência 4 × cada, assim como 4 × 3 RAID 1 + 0. Simplesmente aninhar 6 pares RAID 1 em uma matriz RAID 6 usando um RAID de software pode não ser tão elegante; a implementação pode ser estúpida e complicada (ainda não testei essa hipótese).
A complexidade também apresenta um aumento no custo de desenvolvimento de implementações e ferramentas. Mesmo que haja aplicativos que possam se beneficiar desse aninhamento, as melhorias podem não valer os custos de desenvolvimento.