Carga de disco desigual com o sistema de arquivos mdadm RAID5 e ext4 com diário

2

Recentemente criei um RAID5 com o mdadm:

mdadm --create /dev/md0 -l 5 -n 4 -c 512 /dev/sdb /dev/sdc /dev/sdd /dev/sde

O ajuste usual para acelerar a sincronização inicial:

echo 32768 > /sys/block/md0/md/stripe_cache_size

Depois deixei-a sozinha para terminar a sincronização.

Em seguida, criei e ajustei um sistema de arquivos no dispositivo, otimizado para alguns arquivos grandes:

mke2fs -t ext4 -e remount-ro -Elazy_journal_init=0,lazy_itable_init=0,stride=128,stripe_width=384 -i 524288 /dev/md0
tune2fs -r0 -c0 -i12m -o ^acl,journal_data_writeback,nobarrier /dev/md0

Forcei o writeout da estrutura de dados ext4 no mkfs-time para evitar benchmarks falsos por meio da inicialização em segundo plano. As opções do /etc/mke2fs.conf são do Debian 9 e não foram tocadas por mim.

Depois montei este sistema de arquivos:

mount -o mand,nodev,stripe=1536,delalloc,auto_da_alloc,noatime,nodiratime /dev/md0 /mnt

Tudo está bem, até agora.

Quando escrevo arquivos (grandes) para este sistema de arquivos, iostat -x 2 mostra que um disco é carregado em 100% e o restante está ocioso.

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdb               0.00     0.00   73.50  539.00   294.00  2155.25     8.00   146.37  238.01  188.30  244.79   1.63 100.00
sdc               0.00     0.00    4.50  545.00    18.00  2179.25     8.00     2.92    5.31    3.56    5.32   0.08   4.40
sdd               0.00     0.00    2.50  545.50    10.00  2181.25     8.00     2.90    5.30    4.00    5.31   0.09   4.80
sde               0.00     0.00   33.50  514.50   134.00  2057.25     8.00     2.96    5.39    0.12    5.74   0.07   4.00
md0               0.00     0.00    0.00   67.50     0.00 56740.00  1681.19     0.00    0.00    0.00    0.00   0.00   0.00

Quando eu faço todas essas etapas novamente, mas omito a criação de um diário ( mke2fs -O^has_journal como parâmetro adicional), a carga de disco é distribuída uniformemente em todos os discos. Então parece que a revista não se espalha por todos os discos.

Como posso me beneficiar de um periódico, mantendo a capacidade de obter mais velocidade carregando todos os discos (mais ou menos) uniformemente? Isso é possível, enquanto forçar todos os dados no diário com journal_data_writeback ?

Pensei em externalizar o periódico, mas onde devo colocá-lo? Um disco RAM é volátil, não é bom. Anos atrás, havia verdadeiros discos de estado sólido baseados em DRAM com backup de bateria disponível, mas parece que todos eles foram substituídos por mídia SSD baseada em flash. A DRAM não tem desvantagens com uma carga predominantemente orientada para gravação.

Adendo: o diário no disco é 1024M, de acordo com este artigo . Então, claramente, não deveria ser um problema de localidade considerando apenas o tamanho.

    
por PoC 13.10.2018 / 15:23

1 resposta

2

A partir do parâmetro stripe que você deu para mke2fs e mdadm, parece que o tamanho do seu pedaço que você especificou é 512k. O problema que você está vendo é que enquanto o diário está espalhado por todos os discos (vai estar em algum lugar entre 128MB a 1024MB dependendo do tamanho do sistema de arquivos), a quantidade de dados que precisam ser gravados no diário em cada commit não será muito grande. Normalmente é apenas um punhado de blocos; talvez algumas dezenas, no máximo, para uma carga de trabalho de gravação sequencial. O problema é que essas gravações têm que ser gravadas de forma síncrona no disco em cada confirmação, que por padrão acontece a cada cinco segundos (o que significa que, após uma falha, você perderá no máximo 5 segundos de atualizações do mdatadata). Vamos supor que o tamanho médio da transação seja de 8 blocos. Isso significa que serão necessários 16 commits, ou 80 segundos, antes que os commits de diário síncrono passem para o próximo disco, e então, o disco será o de obter todas as atualizações síncronas.

Há algo mais acontecendo, no entanto. O tamanho médio de solicitação para todos dos seus discos (sdb..sde) é de 8 setores ou 4k. O tamanho médio do pedido indo para o dispositivo md0 é 840k, o que é respeitável, mas não grande. Por alguma razão, essas gravações estão sendo divididas em ~ 500 tiny-weeny 4k gravações antes de serem enviadas para seus discos. Esse é o maior problema, e usar um grande pedaço provavelmente está doendo, não ajudando.

Que tipo de discos você está usando e como eles estão conectados ao seu sistema? Consertar isso vai ser a maior coisa que você pode fazer para ajudar.

No que diz respeito a onde colocar seu diário externo, a sugestão geral é usar um pequeno SSD conectado ao seu sistema.

    
por 16.10.2018 / 17:15