O baixo desempenho medido é resultado de vários fatores:
- após a criação, o array é totalmente sincronizado, causando a alocação da maioria das páginas de dados em flash (se não todas) em metade dos SSDs. Isso colocará os SSDs em um estado de baixo desempenho até que um apagamento / ajuste seguro "libere" todas / a maioria / algumas páginas. Isso explica o aumento no desempenho após um
fstrim
; - o tamanho do bloco de 512 KB (padrão) é muito para o desempenho sequencial / de streaming máximo (como comparado com
dd
). Com uma matriz all-SSDs eu selecionaria um tamanho de bloco de 64 KB e, provavelmente (mas isso deveria ser confirmado com um teste do mundo real), com layout "distante". Observe que diminuir o tamanho do fragmento, embora seja benéfico para acessos de streaming, pode penalizar leituras / gravações aleatórias. Isto é principalmente uma preocupação com os HDDs, mas mesmo os SSDs podem ser um pouco afetados; - por padrão, o kernel do linux emite no máximo I / O de 512 KB. Isso significa que, mesmo ao solicitar que
dd
use blocos de 1 GB (conforme o primeiro comando), eles serão divididos em uma infinidade de solicitações de 512 KB. Juntamente com o seu pedaço de 512 KB, isso envolverá um SSD único por solicitação de gravação , basicamente limitando o desempenho de gravação em fluxo no nível SSD único e negando qualquer aumento de velocidade potencial devido ao RAID. Embora você possa usar omax_sectors_kb
sintonizável (encontrado em/sys/block/sdX/queue/max_sectors_kb
), valores maiores que 512 podem (em algumas versões de configuração / kernel) ser ignorados; - finalmente, embora interessante e obrigatória em primeira parada, o
dd
em si é um benchmark fraco: ele testa somente o desempenho do fluxo em baixa (1) profundidade da fila. Mesmo com sua configuração atual de array, um teste mais abrangente comofio
mostraria um aumento de desempenho significativo em relação a um cenário de disco único, pelo menos em E / S aleatória.
O que você pode fazer para corrigir a situação atual? Primeiro de tudo, você deve aceitar limpar os discos / array; Obviamente, você precisa para fazer backups como primeiro passo. Então:
- pare e exclua a matriz (
mdadm -S /dev/md2
) - trim todos blocos de dados em qualquer disco (
blkdiscard /dev/sdX3
) - recrie a matriz com blocos de 64 KB e com o sinalizador clean (
mdadm --create /dev/md2 --level=10 --raid-devices=8 --chunk=64 --assume-clean /dev/sdX3
) - re-bench com
dd
efio
; - se tudo estiver bem, restaure seu backup.
Uma última nota sobre sua configuração SATA: a divisão do disco dessa maneira deve ser claramente evitada para obter a máxima performance. Dito isto, sua velocidade de gravação é tão baixa que eu não culparia seu controlador SATA. Eu realmente recriaria a matriz por instrução acima antes de comprar qualquer coisa nova.