Como acelerar o rsync para arquivos pequenos


15

Estou tentando transferir milhares de arquivos pequenos de um servidor para outro usando o seguinte comando:

rsync -zr --delete /home/user/ user@10.1.1.1::backup

Atualmente, a transferência demora muito tempo (ainda não cronometrei). Existe maneira de tornar isso mais rápido? Devo estar usando outra ferramenta? Devo usar o rsync sobre ssh em vez de usar o protocolo rsync?


São realmente apenas centenas? Como em menos de alguns milhares?
Zoredache

Um pouco mais do que isso ... 475576 totalizando 9,3 GB
Noodles

Isso vai ser péssimo, usando quase qualquer ferramenta que funcione no nível do sistema de arquivos. Eu suspeito que, se você fizesse alguns perfis, veria uma quantidade significativa de tempo sendo gasto chamando stat().
Zoredache

Por que não -amas -r?
Kamae

Respostas:


13

Você precisa determinar o gargalo. Não é rsync. Provavelmente não é a largura de banda da sua rede. Como o @Zoredache sugeriu, é provavelmente o grande número de Iops gerados por todas as stat()chamadas. Qualquer ferramenta de sincronização precisará declarar os arquivos. Durante a sincronização, execute iostatpara verificar.

Então a questão se torna; como otimizar stat? Duas respostas fáceis:

  1. obtenha um subsistema de disco mais rápido (nos dois hosts, se necessário) e
  2. ajuste seu sistema de arquivos (por exemplo, para montar ext3 com noatimee adicione a dir_index).

Se, por algum motivo, não for o seu IOP de disco que é o limite, experimente dividir a árvore de diretórios em várias árvores distintas e executar vários rsyncs.


1
Obrigado, vou dar uma olhada no dir_index e ver como eu entro (já usamos noatime). Parece que o disco io é o gargalo, mas já estamos executando unidades SAS de 15k no RAID 5. O próximo passo seria o SSD, mas nossa empresa de hospedagem ainda não nos oferece essa opção.
Noodles

5

A compactação não é muito útil para arquivos pequenos (digamos, menos de 100 bytes). Para arquivos pequenos, às vezes a versão compactada pode ser ainda maior que a original. Tente o rsynccomando sem a -zbandeira.

sshé bom para segurança, mas não agiliza a transferência. De fato, isso tornaria a transferência mais lenta devido à necessidade de criptografia / descriptografia.

rsyncpode não parecer rápido na primeira vez em que é executado, porque há muitos dados para transferir. No entanto, se você planeja executar esse comando periodicamente, as execuções subseqüentes podem ser muito mais rápidas, pois rsyncé inteligente não transferir arquivos que não foram alterados.


Se você apenas usar o rsynccliente, ele usará o SSH nos bastidores. Você precisa fazer o possível para desativar a criptografia ao usar o rsync. Veja: stackoverflow.com/a/1821574/64911
mlissner

1

Qual versão do rsync você está usando? Qualquer coisa mais antiga que a 3.0.0 (nas duas extremidades) não possui o recurso de lista de arquivos incremental, que acelera grandes transferências.


Usando o rsync 3.0.5 nos dois servidores.
Macarrão

1

Adicione -v --progressà sua linha de comando rsync

O rsync é feito em 2 etapas:

  1. procure profundamente todos os arquivos nas duas plataformas para comparar seu tamanho e mdate
  2. faça a transferência real

Se você estiver executando o rsync milhares de arquivos pequenos em diretórios aninhados, pode ser que o rsync passe a maior parte do tempo entrando em subdiretórios e localizando todos os arquivos

Se não houver tempo gasto na navegação, o tempo pode ser simplesmente devido à adição de todas as latências iniciando cada nova transferência de arquivo.


1

Caso estejam envolvidos sistemas de arquivos ext3 ou ext4, verifique se ambos têm o recurso dir_index ativado! Isso triplicou o rendimento do rsync no meu caso.

Veja os detalhes na minha resposta em: /server//a/759421/80414

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.