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/ [email protected]::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?

Macarrão
fonte
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.

Mark Wagner
fonte
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.

unutbu
fonte
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.

devicenull
fonte
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.

Alex F
fonte
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

alfonx
fonte