Acelere / evite o cálculo de listas de arquivos rsync

12

Uso o rsync 3.1.1 para sincronizar dois discos, um dos quais está na rede e montado como um compartilhamento de samba /mnt/ROUTER_WD_2TB/. Esta é a fonte, com uma velocidade máxima de 30-40MB / s devido a limitações de rede. O outro, o destino, é montado localmente (pico de 110 MB / s) e é /mnt/BACKUP_HITACHI_2TB/.

Eu uso o seguinte comando rsync:

rsync  -haAXi --quiet --append-verify --delete /mnt/ROUTER_WD_2TB/* /mnt/BACKUP_HITACHI_2TB/.

Os discos contêm muitos arquivos, a maioria pequenos.

O problema é que o rsync leva bastante tempo (10-20m) antes de começar a mover os arquivos, eu acho, porque ele precisa calcular as listas de arquivos para um número muito grande de arquivos pequenos. Durante esse período, a utilização do newtwork fica entre 200 e 500 KB / s, enquanto na transferência de arquivos a velocidade é de aproximadamente 40 MB / s.

Geralmente, o rsync leva cerca de 15m para finalmente encontrar algo que precisa copiar, leva 5 segundos para copiá-lo e continua a procurar outros arquivos para copiar por mais 5 minutos. Em suma, uma cópia de arquivo de 5 segundos acaba durando 20 minutos!

Existe alguma medida que eu possa tomar para evitar esse longo período antes de copiar os arquivos, além de excluir pastas? Qualquer tipo de "cache" que eu possa implementar para que o rsync não precise reconstruir toda a lista de arquivos do zero?

AF7
fonte
1
Você já tentou uma solução desse segmento? unix.stackexchange.com/questions/189878/…
UVV
@ UVV Eu não fiz isso. eu posso fazer isso, no entanto 1) o rsync parece não usar um núcleo completo no meu caso, por algum motivo (= não tenho certeza se tenho CPU limitada ou se a limitação está em outro lugar) e 2) Isso é apenas em uma CPU de núcleo duplo, mesmo que a melhoria fosse 2X, ainda haveria uma grande margem de melhoria.
AF7
Sim, isso parece loucura para mim, por que o rsync é tão lento nisso? Mesmo com o "--size-only", o rsync parece levar uma eternidade para criar sua lista de arquivos incremental. Por quê? Posso verificar manualmente os tamanhos dos arquivos e determinar quais foram alterados muito mais rapidamente! O que está perdendo tanto tempo fazendo e como desativo esses recursos sofisticados? EDIT: Ah, não importa, eu tive o sinalizador 'c' definido por acidente. Sem as somas de verificação, é muito rápido.
Ben Farmer

Respostas:

5

No que diz rsyncrespeito a você, você está copiando entre duas árvores de arquivos locais, por isso desativa a maioria de suas otimizações (incluindo o algoritmo delta pelo qual é famoso). Se você pode executar um rsyncservidor remoto (para obter um verdadeiro cenário cliente-servidor em sua rede), obterá uma quantidade significativa de tração.

No entanto, aqui estão outras opções a considerar

  1. Copiando sem se preocupar em excluir arquivos antigos. Isso pode permitir que você faça uma transferência mais rápida com mais frequência e relegue a limpeza mais lenta para dizer apenas uma vez por dia:

    cp -au /mnt/ROUTER_WD_2TB/. /mnt/BACKUP_HITACHI_2TB/
    
  2. Use uma variação do rsyncalgoritmo de exclusão padrão para evitar a criação de uma lista completa de arquivos antes da transferência:

    rsync -haAXi --quiet --delete --delete-during /mnt/ROUTER_WD_2TB/ /mnt/BACKUP_HITACHI_2TB/
    
  3. Divida os diretórios de nível superior em tarefas separadas e execute-os em paralelo. Você pode achar que, se estiver ligado a um disco de E / S, isso realmente não ajudará, e para pratos giratórios quase certamente piorará as coisas.

    for d in /mnt/ROUTER_WD_2TB/*
    do
        rsync -haAXi --quiet --delete --delete-during "$d" /mnt/BACKUP_HITACHI_2TB/ >"/tmp/rsync.${d/*\/}.log" 2>&1 &
    done
    wait
    cat /tmp/rsync.*.log
    rm -f /tmp/rsync.*.log
    

Se nenhuma dessas sugestões ajuda, então seria pena acrescentar outro --verbosepara rsyncver o que está fazendo. Eu suspeito que esteja mexendo em todos os arquivos inalterados, e se você tiver arquivos suficientes, isso simplesmente leva muito tempo.

roaima
fonte
--delete --delete-duringnão fiz isso por mim - que ainda enviou uma lista de arquivos incremental - mas --delete --delete-beforefoi direto para:, building file listque parece um grande progresso. Eu acho que.
mlissner
Não, isso é ao contrário, receio. Se você usar --delete-before, rsyncexecute duas passagens pela árvore de arquivos: uma para exclusões e a outra para copiar.
roaima
Obrigado. Nesse caso ... alguma maneira de evitar a construção da lista de arquivos incrementais?
amigos estão dizendo sobre mlissner
@mlissner depende de vários fatores diferentes. A maior delas, de longe, é se você está fazendo cópia local para local ou local para remota.
precisa saber é
É tudo local para local para mim, embora um dos locais seja um disco USB?
mlissner
-2

você pode usar -vvpara ver o log inteiro de rsync.

namaiiee
fonte
2
Como isso responderia à pergunta, ou seja, como isso aceleraria as coisas?
Kusalananda
Você pode ver os logs, o que mostra por que demorou tanto tempo para iniciar o rsync; talvez existam arquivos que você poderia pular do rsync para reduzir o tempo.
Namaiiee 12/10/19