A leitura do RAID de software em paralelo é mais lenta do que "deveria", dados outros benchmarks

A leitura do RAID de software em paralelo é mais lenta do que "deveria", dados outros benchmarks

Observação: Eu vi algumas perguntas semelhantes aqui, mas:

  1. nenhum deles diz respeito à leitura de muitos arquivos em paralelo, e
  2. a maioria tem mais de 10 anos e diz respeito a hardware e versões de kernel que não são mais relevantes.

Fundo:

Eu tenho uma máquina Linux (Ubuntu, kernel 5.15.0-82-genérico) com duas CPUs de 128 núcleos e 128 GB de RAM. Ele possui um array RAID 5 de 10 SSDs conectados via SATA, cada um classificado para ser lido em até 530 MB/s. Eles são efetivamente somente leitura quando em uso (são usados ​​principalmente durante o dia e novos dados são adicionados a cada noite). Meu problema geral é fornecer dezenas de núcleos com dados dos discos em paralelo.

Procedimento de benchmarking

Estou comparando leituras executando instâncias de

dd if=/path/to/large/file of=/dev/null bs=1024 count=1048576

em paralelo com iostate iotop. Entre as execuções, limpo o cache executando

sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

Estou confiante de que isso funciona corretamente porque, se eu não fizer isso, uma leitura subsequente de um arquivo quente será concluída quase imediatamente e, quando eu fizer isso, a leitura desse arquivo voltará ao mesmo desempenho de antes.

Resultados de referência

Se eu ler um único arquivo por meio de RAID de software, obtenho uma taxa de leitura entre 500 e 700 MB/s e, olhando para a saída, iostatvejo que a maneira como isso é feito é lendo cada uma das dez unidades em basicamente exatamente a mesma velocidade em paralelo.

Se eu ler diretamente das unidades (ou seja, se eu fornecer /dev/sda, /dev/sdb, etc. como if=argumentos para dd), então poderei ler cada uma delas em paralelo a 530 MB/s cada (ou seja, ler 1 GB de todas as dez leva exatamente o mesmo quantidade de tempo como ler 1 GB de um único deles.)

No entanto, se eu tentar ler vários arquivos em paralelo por meio de RAID de software, obtenho uma degradação de desempenho muito substancial. Se eu ler dez arquivos em paralelo por meio de software RAID, os arquivos individuais atingirão velocidades de leitura entre 150 e 350 MB/s, e todo o processo levará cerca de 4x mais do que copiar a mesma quantidade de dados diretamente das unidades.

Além disso, a leitura do software parece atingir um limite absoluto com uma velocidade total de leitura de cerca de 2,7 GB/s, conforme relatado pelo iotop.

Acho que para alimentar todos os núcleos com dados de disco suficientes para que não sejam desperdiçados, provavelmente precisarei migrar para NVMe em vez de SATA, mas quero resolver esse problema primeiro porque parece que o software RAID ou algo assim a montante dele está limitando a velocidade com que posso ler esses discos.

Questões:

  1. Como posso diagnosticar onde está o gargalo?
  2. Como posso ver as opções de configuração aqui e quais são minhas outras opções?
  3. Existem limitações fundamentais da minha configuração que tornam impossível o que estou tentando fazer? Em caso afirmativo, existem configurações alternativas que eu poderia usar?

Coisas que eu já tentei

  • Brincar com o tamanho do bloco dd, tornando-o maior ou menor, não tem efeito.
  • Definir o tamanho do cache de leitura antecipada e/ou de distribuição do RAID não tem efeito
  • Atualizar o kernel para uma versão um pouco mais recente que provavelmente queria prejudicar drasticamente os resultados do benchmark, basicamente limitando o rendimento total a 500 MB/s IIRC.

Termo aditivo:

Exemplo de saída iostat -k 1durante uma execução de benchmark:https://pastebin.com/yuWwWbRU

Conteúdo de /proc/mdstat:

Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
md127 : active raid5 sdj1[10] sdh1[7] sdi1[8] sdf1[5] sdd1[3] sdc1[2] sdg1[6] sde1[4] sdb1[1] sda1[0]
      70325038080 blocks super 1.2 level 5, 4k chunk, algorithm 2 [10/10] [UUUUUUUUUU]
      bitmap: 0/59 pages [0KB], 65536KB chunk

unused devices: <none>

informação relacionada