Desempenho de IO simultâneo ruim, como negociar latência para taxa de transferência?

1

Eu tenho um processo limitado limitado por GPU e que requer leitura de arquivos aleatórios de uma pasta em um disco rígido local. Quando o processo está sendo executado por si só, obtenho uma taxa de transferência consistente de cerca de 30 MB / s, mas quando há dois processos concorrentes, o throughput total cai para apenas 7 MB / s.

Como posso maximizar o rendimento ao ter dois programas? A latência não é um problema.

Cada arquivo é da ordem de 1 a 20 MB. Os processos estão sendo executados em GPUs independentes e usam muito pouca CPU. O mesmo efeito é observado se eu lançar uma GPU e um processo IO puro ao mesmo tempo.

Não há diferenças entre os agendadores disponíveis: prazo, cfq e noop. Eu também tentei aumentar o tempo de leitura para 5 s, sem alterações.

Detalhes da máquina:

  • Fedora Linux com kernel 4.16.7-200.fc27.x86_64
  • CPU i7-4770 @ 3.40GHz
  • 32 GB de RAM, dos quais 20 são obtidos por processos em execução.
  • A troca está ativada, mas vazia.
  • A unidade é uma WDC WD2003FYYS-0, 2TB, mas vejo o mesmo se eu mover tudo para outras unidades.
  • cat big_file > / dev / null fornece uma taxa de transferência de quase 100 MB / s, portanto, há largura de banda para ambos.
  • Os dados completos são de cerca de 500 GB.

Mais informações:

  • Eu movi os arquivos para uma unidade diferente e mais rápida que não está sendo usada para mais nada e usei a compactação. O rendimento geral é ligeiramente melhorado.
  • Dar a máxima prioridade io a um dos processos melhorou o desempenho em 10%.
  • A execução de iostat -x 1 mostra que a utilização está em torno de 87% ao executar um processo e 100% ao executar dois.
  • Os processos estão lendo arquivos aleatórios. Se eu tivesse apenas um processo, ele poderia fornecer mais do que o dobro do rendimento que cada um pode consumir.
por Davidmh 17.07.2018 / 18:34

1 resposta

2

Use cfq shceduler para esses discos de dados e defina slice_async e slice_sync para valores muito altos (por exemplo, 500) e slice_idle para cerca de 20. Talvez você também precise aumentar fifo_expire_async e fifo_expire_sync para cerca de 4000 cada. (Veja link para detalhes).

A idéia é permitir que cada processo tenha controle total do dispositivo por 0,5 s de cada vez, para que a busca entre diferentes áreas do disco não ocorra o tempo todo.

Se você puder pagar, a melhor opção seria obter uma boa unidade SSD que possa conter seus dados. Para o desempenho de leitura aleatória eu sugiro Samsung 860 EVO série porque o ano de 2018 parece ser o melhor equilíbrio entre custos e desempenho. Se o preço não for um problema, escolha o maior SSD Intel Optane disponível no mercado.

    
por 21.10.2018 / 10:00