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 ( .php
e .jpg
, em torno de 1 a 4 kB por arquivo) com tamanho total de ~ 300 MB, o cp
processo 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?
fonte
Respostas:
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
rsize
ewsize
para 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.fonte
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.
fonte
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.
fonte
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.
fonte
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
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.
fonte
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.
fonte
O problema é que seu compartilhamento é exportado com a
sync
opção (o padrão). Useasync
para acelerar consideravelmente as gravações. Consulte nfs.sourceforge.net/nfs-howto/ar01s05.htmlfonte