Por que o rsync é mais rápido que o NFS?

34

Há alguns dias, notei algo bastante estranho (pelo menos para mim). Executei o rsync copiando os mesmos dados e excluindo-os depois para a montagem do NFS, chamada /nfs_mount/TEST . Esse /nfs_mount/TEST é hospedado / exportado de nfs_server-eth1 . O MTU em ambas as interfaces de rede é 9000, o switch entre suporta jumbo frames também. Se eu fizer rsync -av dir /nfs_mount/TEST/ , obtenho velocidade de transferência de rede X MBps. Se eu fizer rsync -av dir nfs_server-eth1:/nfs_mount/TEST/ , obtenho velocidade de transferência de rede pelo menos 2X MBps. Minhas opções de montagem do NFS são nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp .

Linha inferior: ambas as transferências passam pela mesma sub-rede, mesmos fios, mesmas interfaces, lêem os mesmos dados, escrevem no mesmo diretório, etc. A única diferença é via NFSv3, a outra via rsync.

O cliente é o Ubuntu 10.04, o servidor Ubuntu 9.10.

Como o rsync é muito mais rápido? Como fazer com que o NFS corresponda a essa velocidade?

Obrigado

Editar: por favor, note que eu uso o rsync para gravar no compartilhamento NFS ou para o SSH no servidor NFS e gravar localmente lá. Ambas as vezes eu faço rsync -av , começando com o diretório de destino claro. Amanhã vou tentar com uma cópia simples.

Editar2 (informações adicionais): o tamanho do arquivo varia de 1 KB a 15 MB. Os arquivos já estão comprimidos, tentei compactá-los ainda mais sem sucesso. Fiz o arquivo tar.gz desse dir . Aqui está o padrão:

  • rsync -av dir /nfs_mount/TEST/ = transferência mais lenta;
  • rsync -av dir nfs_server-eth1:/nfs_mount/TEST/ = rsync mais rápido com quadros jumbo habilitados; sem jumbo frames é um pouco mais lento, mas ainda significativamente mais rápido que o diretamente para o NFS;
  • rsync -av dir.tar.gz nfs_server-eth1:/nfs_mount/TEST/ = aproximadamente o mesmo que o seu equivalente não-tar.gz;

Testes com cp e scp :

  • cp -r dir /nfs_mount/TEST/ = ligeiramente mais rápido que rsync -av dir /nfs_mount/TEST/ , mas ainda significativamente mais lento que rsync -av dir nfs_server-eth1:/nfs_mount/TEST/ .
  • scp -r dir /nfs_mount/TEST/ = mais rápido no geral, supera um pouco o rsync -av dir nfs_server-eth1:/nfs_mount/TEST/ ;
  • scp -r dir.tar.gz /nfs_mount/TEST/ = aproximadamente o mesmo que o seu equivalente não-tar.gz;

Conclusão, com base nos resultados: Para este teste não há diferença significativa se estiver usando arquivo grande tar.gz ou muitos pequenos. Quadros jumbo ligados ou desligados também não fazem diferença. cp e scp são mais rápidos que seus respectivos rsync -av equivalentes. Escrever diretamente no compartilhamento exportado do NFS é significativamente mais lento (pelo menos duas vezes) do que gravar no mesmo diretório por meio do SSH, independentemente do método usado.

As diferenças entre cp e rsync não são relevantes neste caso. Eu decidi tentar cp e scp apenas para ver se eles mostram o mesmo padrão e eles fazem - 2X diferença.

Como eu uso rsync ou cp em ambos os casos, não consigo entender o que impede que o NFS atinja a velocidade de transferência dos mesmos comandos pelo SSH.

Por que escrever no compartilhamento NFS é 2 vezes mais lento do que gravar no mesmo lugar no SSH?

Edit3 (opções do servidor NFS / etc / exports): rw,no_root_squash,no_subtree_check,sync . O / proc / mounts do cliente mostra: nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp .

Obrigado a todos!

    
por grs 10.05.2011 / 23:09

8 respostas

17

Talvez não seja a velocidade de transferência mais lenta, mas a latência de gravação aumentada. Tente montar o compartilhamento NFS assíncrono em vez de sincronizar e veja se isso fecha a lacuna de velocidade. Quando você rsync sobre ssh, o processo de rsync remoto grava de forma assíncrona (rapidamente). Mas ao gravar no compartilhamento nfs montado de maneira síncrona, as gravações não são confirmadas imediatamente: o servidor NFS aguarda até atingir o disco (ou mais provavelmente o cache do controlador) antes de enviar uma confirmação ao cliente NFS de que a gravação foi bem-sucedida. / p>

Se 'async' corrigir seu problema, esteja ciente de que, se algo acontecer ao servidor NFS no meio da gravação, muito bem você pode acabar com dados inconsistentes no disco. Contanto que essa montagem NFS não seja o armazenamento primário para esse (ou qualquer outro) dado, você provavelmente ficará bem. É claro que você estaria no mesmo barco se ligasse o servidor nfs durante / depois do rsync-over-ssh ran (por exemplo, rsync retorna 'concluído', falhas do servidor nfs, dados não confirmados no cache de gravação são perdidos agora deixando dados inconsistentes no disco).

Embora não seja um problema com seu teste, esteja ciente de que o rsync sobre ssh pode fazer demandas significativas de CPU e E / S no servidor remoto antes que um único byte seja transferido enquanto calcula checksums e gera a lista de arquivos que precisa ser atualizado.

    
por 12.05.2011 / 06:02
18

O NFS é um protocolo de compartilhamento, enquanto o Rsync é otimizado para transferências de arquivos; Há muitas otimizações que podem ser feitas quando você sabe a priori que seu objetivo é copiar os arquivos o mais rápido possível, em vez de fornecer acesso compartilhado a eles.

Isso deve ajudar: link

    
por 10.05.2011 / 23:13
4

O rsync é um protocolo de arquivos que transfere apenas os bits alterados entre os arquivos. O NFS é um protocolo de arquivos de diretórios remotos que lida com tudo o tempo todo ... de certa forma, como uma SMB. Os dois são diferentes e para finalidades diferentes. Você poderia usar o Rsync para transferir entre dois compartilhamentos NFS.

    
por 11.05.2011 / 00:08
3

Isso é interessante. Uma possibilidade que você pode não ter considerado é o conteúdo / tipo de arquivo que você está transmitindo.

Se você tiver poucos arquivos pequenos (por exemplo, e-mails em arquivos individuais), a eficiência do NFS pode estar diminuindo devido ao não uso da MTU completa (talvez isso seja menos provável com TCP sobre UDP).

Como alternativa, se você tiver arquivos / dados altamente compactáveis, CPUs rápidas e uma rede que não tenha a velocidade da CPU (*), você poderá obter a aceleração apenas pela compactação implícita no link ssh.

Uma terceira possibilidade é que os arquivos (ou uma versão deles) já existam no destino. Neste caso, a aceleração seria porque o protocolo rsync economiza a transferência dos arquivos.

(*) Nesse caso, por "velocidade", estou me referindo à taxa na qual a CPU pode compactar dados em comparação com a taxa que a rede pode transmitir dados, por exemplo, leva 5 segundos para enviar 5MB através do fio, mas a CPU pode comprimir esse 5MB em 1MB em 1 segundo. Nesse caso, seu tempo de transmissão de dados compactados seria ligeiramente superior a 1 segundo, enquanto os dados não compactados são de 5 segundos.

    
por 11.05.2011 / 05:46
1

Eu também uso -e "ssh Ciphers = arcfour" para aumentar o throughput.

    
por 11.05.2011 / 08:50
1

Se seu objetivo é apenas copiar todos os arquivos de um lugar para outro, então o tar / netcat será a opção mais rápida. Se você souber que tem muitos espaços em branco em seus arquivos (zeros), use a opção -i.

FONTE: tar cvif - / caminho / para / source | nc PORTAN DO DESTINO DESTINO: cd / caminho / para / fonte & & nc -l PORTNUM | tar xvif -

se você souber que seus dados são compactáveis, use a compactação em seus comandos tar -z -j -pixz

Sou fã de pixz .. paralela xz, oferece ótima compressão e posso sintonizar o número de cpu's que tenho com a largura de banda da rede. se eu tiver uma largura de banda mais lenta, usarei uma compactação mais alta, então estou esperando mais cpu que a rede. Se eu tiver uma rede rápida, usarei uma compactação muito baixa:

FONTE: tar cvif - / caminho / para / source | pixz -2 -p12 | nc DESTINATION PORTNUM # tar, ignorar zeros, compactação pixz de nível 2 usando 12 núcleos cpu DESTINO: nc -l PORTNUM | tar -Ipixz -xvif

se você ajustar o nível de compactação e os núcleos corretamente, dependendo do seu conjunto de dados, será possível manter a rede perto de saturada e fazer a compactação suficiente se tornar um gargalo no disco (geralmente o lado de gravação se ler e gravar sistemas de disco são os mesmos).

como para o rsync, eu acredito que ele pula zeros de maneira similar à maneira que o tar faz com essa opção, então está transmitindo menos dados que o NFS. O NFS não pode fazer suposições sobre os dados, portanto, tem que transmitir cada byte juntamente com a sobrecarga do protocolo NFS. O rsync tem alguma sobrecarga ...

O netcat tem basicamente nenhum. Ele envia pacotes TCP completos que não contêm nada além dos dados que você gosta.

com o netcat, assim como com o scp, você precisa enviar todos os dados de origem o tempo todo, não pode ser seletivo como no rsync, portanto não é adequado para backups incrementais ou esse tipo de coisa, mas é bom para copiar dados ou arquivamento.

    
por 12.01.2014 / 07:59
0

Você tem configuração de bloqueio de arquivo no nfsshare? Você pode ter muito mais desempenho se estiver desativado.

    
por 11.05.2011 / 06:42
-1

Eu assumo que a velocidade aumentada é, pelo menos em parte, devida ao "rsync src host: / path" gerando um processo local na máquina remota para envio / recepção, efetivamente cortando sua E / S pela metade.

    
por 07.10.2014 / 18:53