Desempenho lento de transferência de NFS de arquivos pequenos

12

Estou usando o Openfiler 2.3 em discos HP ML370 G5, Smart Array P400, SAS combinados usando RAID 1 + 0.

Configurei um compartilhamento NFS a partir da partição ext3 usando a configuração baseada na Web do Openfiler e consegui montar o compartilhamento a partir de outro host. Ambos os hosts são conectados usando um link de gigabit dedicado.

Referência simples usando dd:

 $ dd if=/dev/zero of=outfile bs=1000 count=2000000
 2000000+0 records in
 2000000+0 records out
 2000000000 bytes (2.0 GB) copied, 34.4737 s, 58.0 MB/s

Vejo que pode atingir velocidade de transferência moderada (58,0 MB / s).

Mas se eu copiar um diretório que contém muitos arquivos pequenos ( .phpe .jpg, em torno de 1 a 4 kB por arquivo) com tamanho total de ~ 300 MB, o cpprocesso termina em aproximadamente 10 minutos.

O NFS não é adequado para transferência de arquivos pequenos como no caso acima? Ou existem alguns parâmetros que devem ser ajustados?

Arie K
fonte
Isso responde sua pergunta? Desempenho de gravação ruim do NFS
Aleksandr Dubinsky

Respostas:

7

Há muitas razões pelas quais a transferência de muitos arquivos pequenos sempre será mais lenta do que a transferência de um único arquivo grande. Para uma leitura, é mais provável que os arquivos estejam espalhados pelo disco, exigindo buscas por todo o lado para obtê-los. Como Evan mencionou, também há metadados envolvidos no caso do NFS (ou qualquer outro sistema de arquivos) que também complica as coisas.

Você pode tentar aumentar seus parâmetros rsizee wsizepara a montagem NFS e ver se isso ajudará um pouco o desempenho. Verifique também esta pergunta sobre o ajuste do NFS para latência mínima, pois ele oferece muitos conselhos úteis que ajudarão no caso de muitas transferências de arquivos pequenos.

Kamil Kisiel
fonte
8

Não tenho muita experiência com NFS, mas minha experiência com outros protocolos de compartilhamento de arquivos de rede diz que o desempenho sofre no cenário de "muitos arquivos pequenos" quase universalmente. Você está incorrendo em latência de ida e volta e em um grande grupo de arquivos que a latência acrescenta.

Evan Anderson
fonte
4

Você já tentou com um sistema de arquivos diferente, como o XFS? Ele resolveu todos os meus problemas ao realizar grandes quantidades de pequenas transferências de blocos iSCSI. Não faço ideia do porquê.

Além disso, o iSCSI / NFS geralmente é configurado para quadros de dados muito grandes (jumbo-frames etc.), podendo ser prejudicial se você estiver copiando pequenos arquivos, um de cada vez. Talvez o tar'ing e a transferência o ajudem.

pauska
fonte
1
Sim, meu teste mostrou algumas melhorias usando o XFS do que o ext3 (~ 8 minutos vs ~ 14 minutos).
Arie K
1
Alguns? Eu diria que isso é um bem grande melhoria :)
pauska
1

Verifique se você está usando a conexão TCP ( mount -t nfs -o tcp host: / mount / target ). O desempenho em sistemas modernos não será afetado, mas pequenas E / S podem melhorar significativamente se a sua rede estiver carregada.

E você também deve tentar outro sistema de arquivos; ext3 é basicamente o mais lento de todos. É sólido, bem conhecido, mas é inadequado para um servidor de arquivos. O XFS é muito melhor e o reiserfs também é muito melhor em pequenas E / S.

wazoox
fonte
1

Se você deseja transferir uma grande árvore de diretórios de arquivos pequenos pelo NFS e pode efetuar login no servidor, a melhor maneira de fazer isso é criar um arquivo tar que é extraído automaticamente no cliente, da seguinte maneira:

mydirectory tar c | ssh usuário @ host tar -xf - -C destdir

Dessa forma, apenas um único "arquivo" é transferido pela rede e você imediatamente tem todos os seus arquivos no host.


fonte
0

Apenas para adicionar à resposta de Evan, você também tem toda a sobrecarga de criar os metadados (entradas de diretório, etc.) para cada arquivo que você está copiando.

TCampbell
fonte
0

Uma solução semelhante à resposta de Chris seria sincronizar seus arquivos periodicamente com os clientes. Se você quiser fazer alterações nos dois sentidos, também poderá usar o uníssono.

Ztyx
fonte
0

O problema é que seu compartilhamento é exportado com a syncopção (o padrão). Use asyncpara acelerar consideravelmente as gravações. Consulte nfs.sourceforge.net/nfs-howto/ar01s05.html

Aleksandr Dubinsky
fonte