Como obter um bom desempenho simultâneo de leitura do disco

Gostaria de fazer uma pergunta e segui-la com minha própria resposta, mas também ver as respostas de outras pessoas.

Temos dois arquivos grandes que gostaríamos de ler simultaneamente de dois threads separados. Um encadeamento lerá seqüencialmente o arquivo A, enquanto o outro encadeamento lerá seqüencialmente o arquivoB. Não há bloqueio ou comunicação entre os encadeamentos, os dois estão lendo sequencialmente o mais rápido possível e ambos descartam imediatamente os dados que lêe

Nossa experiência com essa configuração no Windows é muito ruim. A taxa de transferência combinada dos dois threads é da ordem de 2-3 MiB / s. A unidade parece estar gastando a maior parte do tempo procurando entre os dois arquivos para frente e para trás, presumivelmente lendo muito pouco após cada busc

Se desativarmos um dos threads e temporariamente examinarmos o desempenho de um único thread, obteremos uma largura de banda muito melhor (~ 45 MiB / s para esta máquina). Claramente, o desempenho ruim de dois threads é um artefato do agendador de disco do S

Existe algo que possamos fazer para melhorar o desempenho simultâneo de leitura de threadalvez usando APIs diferentes ou aprimorando os parâmetros do agendador de disco do SO de alguma form

Alguns detalhes

Os arquivos estão na ordem de 2 GiB cada, em uma máquina com 2GiB de RAM. Para os fins desta questão, consideramos que eles não são armazenados em cache e desfragmentados perfeitamente. Usamos ferramentas de desfragmentação e reinicializamos para garantir que esse seja o cas

Não estamos usando APIs especiais para ler esses arquivos. O comportamento é repetitivo em várias APIs de padrão básico, como o CreateFile do Win32, o fopen de C, o std :: ifstream do C ++, o FileInputStream do Java et

Cada thread gira em um loop fazendo chamadas para a função de leitura. Variamos o número de bytes solicitados da API a cada iteração, de valores entre 1KiB e 128MiB. Variando isso não teve efeito, então, claramente, a quantidade que o sistema operacional está lendo fisicamente após cada busca no disco não é ditada por esse número. É exatamente isso que se deve espera

A diferença dramática entre o desempenho de um e dois segmentos é repetível no Windows 2000, Windows XP (32 e 64 bits), Windows Server 2003 e também com e sem hardware RAID

questionAnswers(12)

yourAnswerToTheQuestion