A solução é definir o recurso stripe_cache_size
para md raids.
Por padrão, é definido como 256, mas pode ser aumentado para 32768.
Isso é feito escrevendo o tamanho desejado em /sys/block/md0/md/stripe_cache_size
(se o raid for md0
). No Ask Ubuntu há uma solução para definir o valor permanentemente .
Testei exatamente o mesmo RAID da pergunta e obtive os seguintes números:
size 256: 50 MB/s
size 4096: 123 MB/s
size 8192: 142 MB/s
size 16384: 140 MB/s
size 32768: 142 MB/s
Estes testes foram conduzidos com o Ubuntu 12.04 (Linux 3.2) escrevendo 10 GB em um arquivo com blocos de 1 MB.
Background: O cache de stripe armazena blocos gravados recentemente. Se os dados forem gravados continuamente, pode acontecer que, durante uma primeira gravação, apenas uma parte de uma faixa seja gravada. Isso significa que o código RAID deve ler a faixa completa do disco, atualizá-lo e gravá-lo completamente de novo. Se uma segunda gravação chegar em outra parte da mesma faixa, tudo isso teria que ser feito novamente. Agora, se o cache for usado e ainda contiver os dados gravados pela primeira gravação, a leitura necessária antes da segunda gravação poderá ser omitida.
Normalmente, um tamanho de bloco grande ao escrever evitaria o problema (porque as faixas completas são escritas de uma só vez e, portanto, nenhuma leitura é necessária). No entanto, parece que a criptografia usa apenas pequenos blocos ao gravar no dispositivo subjacente e, assim, aumentar o cache tem um efeito positivo.