Perché rsync non utilizza delta-transfer per i file locali?


25

Ho una grande immagine ISO che viene attualmente scaricata da un client torrent con la prenotazione dello spazio attivata: ciò significa che la dimensione del file non cambia mentre alcuni blocchi in (4 Mib) cambiano costantemente a causa di un download.

Al 90% di download eseguo rsync iniziale per risparmiare tempo in seguito:

$ rsync -Ph DVD.iso / media / another-hdd /
invio elenco file incrementale

DVD.iso
       2.60G 100% 40.23MB / s 0:01:01 (xfer # 1, da controllare = 0/1)

inviato 2,60 G byte ricevuto 73 byte 34,59 M byte / sec
la dimensione totale è 2.60G la velocità è di 1.00

Quindi, quando il file è completamente scaricato, risincronizzo di nuovo:

total size is 2.60G   speedup is 1.00

Speedup = 1 dice che il delta-transfer non è stato usato, sebbene il 90% del file non sia cambiato, la directory di destinazione è su un altro FS e la copia richiede diversi minuti. Perché non prova ad accelerare il trasferimento ?! Come posso forzare rsyncl'uso del delta-transfer?


6
Quello che stai facendo non ha alcun senso. Lo scopo di rsync è velocizzare il trasferimento di file sulla rete, non localmente. Per trovare le differenze, deve leggere sia l'origine che la destinazione. Nel tempo necessario per leggere la destinazione localmente per trovare le differenze, puoi anche fare una copia normale. Basta scaricare il file nella destinazione in primo luogo invece di copiarlo.
psusi,

1
Quindi semplicemente non usa delta-xfer perché, lavorando localmente, è più veloce da copiare che per calcolare gli hash? Se sì, pubblica la risposta per favore :)
kolypto

9
La lettura può essere più veloce della scrittura su un disco locale in determinate circostanze. Può anche ridurre l'usura di un SSD. Questa è certamente una domanda valida e la risposta è abbastanza preziosa per me.
HRJ

2
@psusi a parte il commento di HRJ sopra, considera anche il caso in cui il file di destinazione è stato riflesso (ad esempio su btrfs o ocfs2). Ridurre al minimo le scritture durante la sincronizzazione può fare un'enorme differenza nell'uso complessivo dello spazio.
Jack Douglas,

Risposte:


20

Secondo la manpage , psusi ha ragione:

-W, --whole-file : il trasferimento potrebbe essere più veloce se questa opzione viene utilizzata quando la larghezza di banda tra i computer di origine e di destinazione è superiore alla larghezza di banda su disco (specialmente quando il "disco" è in realtà un filesystem in rete). Questo è il valore predefinito quando sia l'origine che la destinazione sono specificate come percorsi locali, ma solo se non è attiva alcuna opzione di scrittura batch.


10
Oh grazie! Ho modificato questa riga :) Per attivare il delta-trasfer, usa-no-W
kolypto il

1
Sul mio sistema -no-Wnon funziona solo l'opzione lunga -no-whole-file. Il motivo per cui ho bisogno di questo interruttore è quando sto configurando un backup e ho file di grandi dimensioni (ad esempio immagini) che non hanno lo stesso tempo di modifica. È MOLTO più veloce, la velocità è di 163.26, sincronizzare questi file usando il delta-transfer sul mio filesystem locale.
Jesse the Wind Wanderer,

6
@JessetheWindWanderer, l'opzione lunga è --no-whole-file(per favore, nota il doppio --all'inizio).
Eddie C.,

Grazie Eddie C. Modificherei il mio commento se potessi capire come :-(
Jesse the Wind Wanderer

18

La risposta diretta a questa domanda è:

Usa il --no-Wflag per forzare la compressione delta, indipendentemente dal locale o dal remoto.

Aggiornamento: sembra che ci sia dell'altro nella storia. L' delta compressionsembra essere abilitato solo tra ricevere e trasmettere processo di rsync. Quando si esegue l'output del file nel file system, è rsynccomunque possibile scrivere l'intero / i file, anche con la compressione delta attivata.

Vedi l'indagine "Wakan Tanka" qui .


2
--no-Wtrasferisco sempre l'intero file nel mio caso. Si prega di controllare unix.stackexchange.com/questions/291156/…
Wakan Tanka,

@WakanTanka È interessante! Ho aggiornato la mia risposta.
HRJ,

3

Per impostazione predefinita, rsync crea prima una nuova copia del file di destinazione e poi lo sostituisce, per vari motivi di sicurezza. Puoi ignorarlo specificando --inplaceinsieme a --no-whole-file. Questo dice a rsync di effettuare una modifica sul posto del file di destinazione, accettando i vari rischi (in genere minori per questa situazione) come documentato nella pagina man.


0

Per impostazione predefinita rsynccrea una copia del file nella destinazione e quindi sostituisce atomicamente l'originale con la nuova copia. Questo viene fatto per motivi di sicurezza. Quello che stai cercando è l' --inplaceopzione, che causerà la rsyncmodifica solo delle porzioni del file di destinazione che sono cambiate rispetto alla fonte.

Per il caso d'uso del PO, raccomando di disattivare anche la pre-allocazione, in modo da poter sincronizzare una copia sparsa, che sarà molto più veloce. Per i download, non preoccuparti della frammentazione a meno che tu non stia utilizzando un file system molto antico come VFAT. I file multimediali, in particolare, non vengono letti al massimo delle prestazioni dei supporti di archiviazione, quindi la deframmentazione degli stessi è uno sforzo sprecato.

Per copiare la directory dei download scarsamente nel volume di destinazione, consiglio questi flag e operazioni, in questo ordine:

rsync --ignore-existing -vxaHAXS /source /destination
rsync --inplace -vxaHAX /source /destination

Il primo passaggio copia i nuovi file scarsamente nella destinazione Il secondo passaggio aggiorna i file esistenti sul posto, copiando solo le modifiche

Dal momento che sta eseguendo copie delta sparse e sul posto, è possibile eseguirlo ripetutamente senza incorrere in molti IO aggiuntivi. Anche se hai 20 torrent in esecuzione contemporaneamente, non amplifica le scritture a destinazione, né schiaccia i volumi di origine / destinazione.

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.