Accelerare / evitare il calcolo degli elenchi di file rsync


12

Uso rsync 3.1.1 per mantenere sincronizzati due dischi, uno dei quali è in rete e montato come condivisione samba /mnt/ROUTER_WD_2TB/. Questa è l'origine, con una velocità massima di 30-40 MB / s a ​​causa delle limitazioni della rete. L'altra, la destinazione, è montata localmente (picco 110 MB / s) ed è /mnt/BACKUP_HITACHI_2TB/.

Uso il seguente comando rsync:

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

I dischi contengono molti file, molti dei quali piccoli.

Il problema è che rsync impiega molto tempo (10-20 m) prima di iniziare a spostare qualsiasi file, immagino perché deve calcolare elenchi di file per un numero molto grande di piccoli file. Durante questo periodo, l'utilizzo di newtwork si trova a un livello basso di 200-500 KB / s, mentre durante il trasferimento di file la velocità è di circa 40 MB / s.

Di solito succede che rsync impieghi circa 15m per trovare finalmente qualcosa che deve copiare, quindi impiega 5 secondi per copiarlo, quindi continua a cercare altri file da copiare per altri 5 minuti. Tutto sommato, una copia del file di 5 secondi finisce per durare 20 minuti!

C'è qualche misura che potrei prendere per evitare questo lungo periodo prima di copiare i file, oltre all'esclusione delle cartelle? Qualsiasi tipo di "cache" posso implementare in modo che rsync non debba ricostruire da zero tutto l'elenco dei file?


1
Hai provato una soluzione da questo thread? unix.stackexchange.com/questions/189878/…
UVV

@UVV Non l'ho fatto. posso farlo, tuttavia 1) rsync già non sembra utilizzare un core completo nel mio caso, per qualche motivo (= non sono sicuro se ho una CPU limitata o se la limitazione si trova altrove) e 2) Questo è solo su una CPU dual-core, quindi anche se il miglioramento fosse 2X, ci sarebbe comunque un ampio margine di miglioramento.
AF7,

Sì, questo mi sembra folle, perché rsync è così lento in questo? Anche con "--size-only" rsync sembra impiegare un'eternità a costruire il suo elenco di file incrementale. Perché? Posso controllare manualmente le dimensioni del file e determinare quali sono cambiate molto più velocemente! Cosa sta sprecando così tanto tempo e come posso disattivare queste fantasiose funzionalità? EDIT: Ah, non importa, ho avuto la bandiera 'c' impostata per caso. Senza i checksum è molto veloce.
Ben Farmer,

Risposte:


5

Per quanto rsyncti riguarda, stai copiando tra due alberi di file locali, quindi disabilita la maggior parte delle sue ottimizzazioni (incluso l'algoritmo delta per il quale è famoso). Se riesci a eseguirne uno rsyncsul tuo server remoto (in modo da ottenere un vero scenario client-server attraverso la tua rete) otterrai una notevole quantità di trazione.

Tuttavia qui ci sono altre opzioni da considerare

  1. Copia senza preoccuparsi di eliminare vecchi file. Ciò può consentire di eseguire un trasferimento più veloce più spesso e di ripetere la pulizia più lenta per dirlo, solo una volta al giorno:

    cp -au /mnt/ROUTER_WD_2TB/. /mnt/BACKUP_HITACHI_2TB/
    
  2. Utilizzare una variante rsyncdell'algoritmo di eliminazione predefinito per evitare di creare un elenco completo di file prima del trasferimento:

    rsync -haAXi --quiet --delete --delete-during /mnt/ROUTER_WD_2TB/ /mnt/BACKUP_HITACHI_2TB/
    
  3. Dividi le directory di livello superiore in attività separate ed eseguile in parallelo. Potresti scoprire che se sei legato all'IO del disco, questo non sarà davvero d'aiuto, e per i piatti rotanti quasi sicuramente peggiorerà le cose.

    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 nessuno di questi suggerimenti aiuta allora sarebbe la pena di aggiungere un altro --verboseper rsyncvedere quello che sta facendo. Ho il sospetto che stia frugando tra tutti i file invariati, e se hai abbastanza file questo richiede semplicemente molto tempo.


--delete --delete-duringnon lo ha fatto per me - che ha comunque inviato un elenco di file incrementale - ma è --delete --delete-beforeandato direttamente a:, building file listche sembra un grande progresso. Credo.
mlissner,

No, è al contrario, temo. Se lo usi --delete-before, rsyncesegui due passaggi attraverso l'albero dei file: uno per le eliminazioni e l'altro per la copia.
roaima,

Grazie. In tal caso ... un modo per evitare di creare l'elenco di file incrementale?
mlissner,

@mlissner dipende da diversi fattori. Il più grande di gran lunga è se si sta eseguendo la copia da locale a locale o da locale a remoto.
roaima,

Per me è tutto da locale a locale, anche se uno dei locali è un disco USB?
mlissner,

-2

puoi usare -vvper vedere l'intero registro di rsync.


2
Come risponderebbe alla domanda, cioè come accelererebbe le cose?
Kusalananda

Potresti semplicemente vedere i log, il che mostra perché ci è voluto così tanto tempo per avviare rsync, forse ci sono file che potresti saltare da rsync per ridurre il tempo.
namaiiee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.