Eu tenho usado um rsync
script para sincronizar dados em um host com os dados em outro host. Os dados possuem vários arquivos de tamanho pequeno que contribuem para quase 1,2 TB.
Para sincronizar esses arquivos, eu tenho usado o rsync
comando da seguinte maneira:
rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/
O conteúdo de proj.lst é o seguinte:
+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *
Como teste, peguei dois desses projetos (8,5 GB de dados) e executei o comando acima. Por ser um processo seqüencial, utiliza 14 minutos e 58 segundos para concluir. Portanto, para 1,2 TB de dados, levaria várias horas.
Se eu pudesse vários rsync
processos em paralelo (usando &
, xargs
ou parallel
), ele iria salvar o meu tempo.
Eu tentei com o comando abaixo com parallel
(após cd
ing para o diretório de origem) e levou 12 minutos e 37 segundos para executar:
parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .
Isso deveria levar cinco vezes menos tempo, mas não levou. Eu acho que estou errado em algum lugar.
Como posso executar vários rsync
processos para reduzir o tempo de execução?
fonte
rsync
s é nossa primeira prioridade.rsync
S múltiplos em paralelo é o foco principal agora.Respostas:
As etapas a seguir fizeram o trabalho para mim:
rsync --dry-run
primeiro para obter a lista de arquivos que seriam afetados.cat transfer.log
paraparallel
para executar 5rsync
s em paralelo, da seguinte maneira:Aqui, a
--relative
opção ( link ) assegura que a estrutura de diretórios dos arquivos afetados, na origem e no destino, permaneça a mesma (/data/
diretório interno ), portanto, o comando deve ser executado na pasta de origem (por exemplo/data/projects
).fonte
split
e alimentando esses nomes de arquivos para paralelo. Em seguida, use rsync's--files-from
para obter os nomes de arquivos de cada arquivo e sincronizá-los. backups rm. * backups split -l 3000 backup.list. ls backups. * | paralela --line-tampão --verbose -j 5 rsync --progress -av --files-de {} / local / PAI / PATH / REMOTE_HOST: REMOTE_PATH /receiving file list ... done
created directory /data/
.--info=name
no lugar de-v
e obterá apenas os nomes dos arquivos e diretórios. Você pode usar --protect-args para o rsync de transferência 'interno' também se algum arquivo tiver espaços ou metacaracteres de shell.Eu pessoalmente uso este simples:
O que só é útil quando você tem mais do que alguns diretórios não-quase vazios; caso contrário, você terá quase todas as
rsync
terminações e o último fará todo o trabalho sozinho.fonte
Eu desencorajaria alguém a usar a resposta aceita, uma solução melhor é rastrear o diretório de nível superior e lançar um número proporcional de operações de rync.
Eu tenho um grande volume zfs e minha fonte era uma montagem cifs. Ambos estão vinculados ao 10G e, em alguns benchmarks, podem saturar o link. O desempenho foi avaliado usando
zpool iostat 1
.A unidade de origem foi montada como:
Usando um único
rsync
processo:o medidor io lê:
Nos benchmarks sintéticos (disco de cristal), o desempenho para gravação sequencial se aproxima de 900 MB / s, o que significa que o link está saturado. 130MB / s não é muito bom, e a diferença entre esperar um fim de semana e duas semanas.
Então, criei a lista de arquivos e tentei executar a sincronização novamente (eu tenho uma máquina com 64 núcleos):
e teve o mesmo desempenho!
Como alternativa, simplesmente executei o rsync nas pastas raiz:
Isso realmente aumentou o desempenho:
Concluindo, como o @Sandip Bhattacharya levantou, escreva um pequeno script para obter os diretórios e paralelo a ele. Como alternativa, passe uma lista de arquivos para o rsync. Mas não crie novas instâncias para cada arquivo.
fonte
Uma maneira testada de executar o rsync paralelo é: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync
fonte
find
?--dry-run
opçãorsync
, eu teria uma lista de arquivos que seriam transferidos. Posso fornecer essa lista de arquivosparallel
para paralelizar o processo?mkdir -p /dest-dir/{//}\;
parte? Especialmente o{//}
coisa é um pouco confusa.Para sincronizações de vários destinos, estou usando
Dica: Todas as conexões ssh são estabelecidas com chaves públicas em
~/.ssh/authorized_keys
fonte
Eu sempre busco o rsync paralelo no google, pois sempre esqueço o comando completo, mas nenhuma solução funcionou para mim como eu queria - ou inclui várias etapas ou precisa instalar
parallel
. Acabei usando este one-liner para sincronizar várias pastas:-P 5
é a quantidade de processos que você deseja gerar - use 0 para ilimitado (obviamente não recomendado).--bwlimit
para evitar usar toda a largura de banda.-I %
argumento fornecido por find (diretório encontrado emdir/
)$(echo dir/%/ host:/dir/%/)
- imprime diretórios de origem e destino que são lidos pelo rsync como argumentos. % é substituído porxargs
com o nome do diretório encontrado porfind
.Vamos supor que eu tenha dois diretórios em
/home
:dir1
edir2
. Eu corrofind /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'
. Portanto, o comando rsync será executado como dois processos (dois processos porque/home
possui dois diretórios) com os seguintes argumentos:fonte