Acelerar / evitar cálculo de listas de arquivos rsync

10

Eu uso o rsync 3.1.1 para manter sincronizado dois discos, um dos quais está na rede e montado como um compartilhamento de samba em /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 110MB / 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 deles pequenos.

O problema é que o rsync leva muito tempo (10-20m) antes para começar a mover qualquer arquivo, eu acho que ele tem que calcular listas de arquivos para um grande número de arquivos pequenos. Durante este período, a utilização do novo trabalho situa-se a 200-500KB / s, enquanto que ao transferir ficheiros, a velocidade é de cerca de 40MB / s.

Geralmente acontece que o rsync leva cerca de 15m para finalmente encontrar algo que precisa ser copiado, depois leva 5 segundos para copiá-lo e continua a procurar por outros arquivos para copiar por mais 5 minutos. Tudo somado, uma cópia de arquivo de 5 segundos termina com 20 minutos de duração!

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?

    
por AF7 04.04.2016 / 18:50

1 resposta

2

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

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

  1. Copiando sem se preocupar com a exclusão de arquivos antigos. Isso pode permitir que você realize uma transferência mais rápida com mais frequência e relegar 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 algoritmo de exclusão padrão de rsync 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-as em paralelo. Você pode achar que, se você for ligado a IO em disco, isso não ajudará muito, e, para girar pratos, isso 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 ajudar, valeria a pena adicionar outro --verbose a rsync para ver o que está fazendo. Eu suspeito que ele esteja passando por todos os arquivos inalterados, e se você tiver arquivos suficientes, isso leva muito tempo.

    
por 20.03.2018 / 21:15

Tags