Desempenho lento de transferência de NFS de arquivos pequenos

8

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

Eu 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 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

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

Mas se eu copiar um diretório contendo muitos arquivos pequenos ( .php e .jpg , em torno de 1-4 kB por arquivo) de tamanho total ~ 300 MB, o processo cp terminará 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?

    
por Arie K 25.06.2009 / 16:57

7 respostas

5

Existem muitos motivos pelos 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 em todo o lugar para obtê-los. Como Evan mencionou, também há metadados envolvidos no caso do NFS (ou qualquer outro sistema de arquivos para esse assunto!) Que também complica as coisas.

Você pode tentar aumentar seus parâmetros rsize e wsize para a montagem do NFS e ver se isso ajudará o desempenho um pouco. Também confira esta questão sobre como ajustar o NFS para latência mínima, pois ele tem muita ajuda conselhos que ajudarão no caso de muitas pequenas transferências de arquivos.

    
por 25.06.2009 / 17:20
5

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

    
por 25.06.2009 / 17:02
3

Já tentou com um sistema de arquivos diferente, como o XFS? Ele resolveu todos os meus problemas ao fazer quantidades extremas de pequenas transferências de bloco 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), pode prejudicar você se estiver copiando arquivos minúsculos, um de cada vez. Talvez tar e depois transferir ajudaria você.

    
por 25.06.2009 / 17:19
1

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

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

    
por 25.06.2009 / 17:48
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 sobre o qual você está copiando.

    
por 25.06.2009 / 17:09
0

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

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

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

    
por 13.08.2009 / 03:41
0

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

    
por 30.03.2010 / 10:46