Come velocizzare rsync?


44

Sto eseguendo rsync per sincronizzare una directory sul mio HDD USB esterno. Sono circa 150 concerti di dati. Più di 50000 file immagino.

Sta eseguendo la prima sincronizzazione al momento, ma i suoi file di copia a una velocità di soli 1-5 MB / s. Sembra incredibilmente lento per un contenitore USB 2.0. Non ci sono altri trasferimenti in corso sull'unità.

Ecco le opzioni che ho usato:

rsync -avz --progress /mysourcefolder /mytargetfolder

Sto eseguendo Ubuntu Server 9.10.


2
sei sicuro di ricevere una connessione USB2? una copia (non rsync) o altre operazioni di scrittura vengono eseguite a velocità normale? in caso contrario, hai provato una copia / altra operazione di scrittura con un'altra porta / cavo USB?
Quack Quixote,

Vedi anche serverfault.com/questions/43014/… - ci sono anche persone che propongono di usare due tarcomandi in pipe o cpio.
Blaisorblade,

Risposte:


38

Per la prima sincronizzazione basta usare

cp -a  /mysourcefolder /mytargetfolder

rsync aggiunge il sovraccarico solo quando la destinazione è vuota.

inoltre .. l'opzione -z sta probabilmente uccidendo le tue prestazioni, non dovresti usarle se non trasferisci dati su un collegamento lento.


3
rsync è così chiamato perché è per la sincronizzazione remota e non è proprio appropriato per un volume connesso localmente proprio per questo motivo.
msanford,

6
Dovrebbe essere utilizzabile anche per i trasferimenti locali ed è molto più flessibile. È forse solo eccessivo per la prima sincronizzazione.
Blaisorblade,

1
rsync è anche una sincronizzazione unidirezionale. Ottimo per il backup su un server o da un server. Tuttavia, se si desidera la sincronizzazione locale a DUE vie su un'unità rimovibile, è possibile verificare csync csync.org/get-it da non confondere con csync2, che è un progetto completamente diverso.
Jesse il Viandante del vento,

3
rsync -avz --progress /mysourcefolder/ /mytargetfoldero otterrai una copia di mysourcefolderinside mytargetfolderpiuttosto che il mirroring dei contenuti
editor

3
Questa risposta non risponde alla domanda. La domanda era su come ottimizzare rsync, non sostituirlo con il comando cp.
oemb1905,

38

Se stai utilizzando rsync con una rete veloce o da disco a disco nella stessa macchina,

non usando la compressione -z

e usando --inplace

accelera fino alle prestazioni dei dischi rigidi o della rete

la compressione utilizza molta CPU

non usare inplace rende il thrash del disco rigido molto (usa un file temporaneo prima di creare il finale)

la compressione e il non utilizzo inplace è meglio per farlo su Internet (rete lenta)

NOVITÀ: fai attenzione alla destinazione ... se è abilitata la "compressione" NTFS ... questo rallenta notevolmente i file di grandi dimensioni (direi 200 MB +) rsync sembra quasi bloccato, è causato da questo.


La compressione NTFS è lenta su file di grandi dimensioni
Scott Kramer

Non vedo nulla su "--inline" nella pagina man
Anthony,

1
È "--inplace"
Scott Kramer il

26

Usa l' -Wopzione Ciò disabilita i confronti delta / diff. Quando il tempo / le dimensioni del file differiscono, rsync copia l'intero file.

Rimuovi anche l' -zopzione. Questo è utile solo per comprimere il traffico di rete.

Ora rsyncdovrebbe essere veloce come cp.


6
Nota minore: -zè utile solo per il traffico di rete a bassa velocità . Se la tua rete è abbastanza veloce, rallenterà le cose, poiché sarai limitato dalla CPU.
WhyNotHugo

3
Questi suggerimenti hanno notevolmente accelerato il trasferimento dei miei file tra due dispositivi NAS, grazie!
djhworld,

2
ma nota che secondo la pagina man dice -W: "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".
GuoLiang Oon,

14

Primo: il numero di file in questo caso sarà un fattore importante. Ha una dimensione media di 3 MB ciascuno. Probabilmente c'è un collo di bottiglia di io che influenza la velocità nel caso del PO. Altro qui - è una lettura piuttosto secca, ma la copertina è valsa la pena.

Quindi, usando rsync per copiare in una directory vuota? Ecco alcuni modi per accelerarlo:

  1. No -z - sicuramente non usare -z come nel PO.
  2. --no-compress potrebbe accelerare. Questo potrebbe avere il maggiore impatto ... il mio test è stato di 13.000 file, dimensione totale 200 MB e utilizzo di rsync 3.1.3. Ho sincronizzato con una partizione diversa sulla stessa unità SSD interna. Con --no-compress, ottengo 18 MBps e senza di esso ottengo 15 MBps. cp, a proposito, ottiene 16 MBps. Questa è una dimensione media del file molto più piccola però. Inoltre, non riesco a trovare alcuna documentazione per --no-compress. L'ho imparato da questo post su stackexchange.com.
  3. -W per copiare i file interi - usa sempre questo se non vuoi che confronta le differenze; non importa che il punto di rsync sia confrontare le differenze e aggiornare solo le modifiche.
  4. -S per gestire bene i file sparsi - non può far male se non si hanno file sparsi.
  5. --exclude-from o qualcosa di simile per escludere file di cui potresti non aver bisogno ridurrà il tempo, ma non aumenterà la velocità di trasferimento.
  6. È possibile se invii l'output a un file come questo rsync -a /source /destination >/somewhere/rsync.out 2>/somewhere/rsync.err: il primo> fondamentalmente stampa un file con tutte le cose che normalmente vedresti e il 2> fa riferimento a messaggi di errore.
  7. Infine, l' esecuzione di più istanze di rsync per diverse parti del trasferimento potrebbe essere di grande aiuto.

Il mio comando sarebbe:

rsync -avAXEWSlHh /source /destination --no-compress --info=progress2 --dry-run

Se tutto sembrava a posto, eliminerei "--dry-run" e lo lascio andare. A, X ed E coprono gli attributi estesi e le autorizzazioni non coperte da -a, l è per i soft link, H è per i hard link e h è per la lettura umana.

L'aggiornamento di una directory già sincronizzata su un'unità USB o sulla stessa unità o su una rete richiederà tutti diversi comandi rsync per massimizzare la velocità di trasferimento.

Bonus : ecco la pagina man di rsync e se vuoi testare la velocità del tuo disco rigido, bonnie ++ è una buona opzione e, per la tua velocità di rete, prova iperf .


* Il post ha quasi dieci anni, ma sicuramente piace ai motori di ricerca, e continuo a vederlo. È una buona domanda, e non credo che la risposta migliore a "come velocizzare rsync" dovrebbe essere "usa cp invece".


1
Rispetto al punto 7) potrei migliorare molto di più le prestazioni usando un HDD tradizionale come sorgente, estendendo il buffer read-ahead usando "blockdev --setra 8192 / dev / sdX". Quindi intendo ridurre le ricerche per la testa.
user2480144

Ho scoperto che S (gestione dei file sparsi) è in realtà lento. Rimuoverlo lo ha reso molto più veloce
Sammy Guergachi

2

Non dici quale distribuzione delle dimensioni hanno i tuoi file. Se ci sono molti piccoli file, questo ridurrà la velocità di trasferimento complessiva aumentando la latenza del movimento della testa sia nelle unità di origine che di destinazione quando lo strumento apre nuovi file e il sistema operativo mantiene le voci della directory e altri metadati (come il diario del filesystem se si sta utilizzando il journaling dei metadati come ext3 / ext4 e NTFS lo fanno di default) aggiornati durante il trasferimento. Il processo di copia di un file "farà il suo passo" solo per oggetti più grandi, quando si verifica un semplice trasferimento di massa.


0

Sicuramente vuoi provare rclone . Questa cosa è follemente veloce:

$ tree / usr [...] 26105 directory, 293208 file

$ sudo rclone sync / usr / home / fred / temp -P -L - trasferimenti 64

Trasferito: 17.929G / 17.929 GBytes, 100%, 165.692 MBytes / s, ETA 0s Errori: 75 (potrebbe essere utile riprovare) Controlli: 691078/691078, 100% trasferito: 345539/345539, 100% Tempo trascorso: 1m50.8s

Questa è una copia locale da e verso un SSD LITEONIT LCS-256 (256 GB).

Puoi aggiungere --ignore-checksum alla prima esecuzione per renderlo ancora più veloce.


0

Evitare

  • -z/ --compress: la compressione caricherà la CPU solo perché il trasferimento non è su una rete ma su RAM.
  • --append-verify: riprende un trasferimento interrotto. Sembra una buona idea, ma presenta il pericoloso caso di errore: qualsiasi file di destinazione della stessa dimensione (o maggiore) rispetto alla fonte verrà IGNORATO. Inoltre, esegue il checksum dell'intero file alla fine, il che significa che non si accelera significativamente --no-whole-filedurante l'aggiunta di un caso di errore pericoloso.

Uso

  • -S/ --sparse: trasforma sequenze di null in blocchi sparsi
  • --partialo -Pche è --partial --progress: salva tutti i file parzialmente trasferiti per il futuro ripristino. Nota: i file non avranno un nome temporaneo, quindi assicurati che nient'altro si aspetti di utilizzare la destinazione fino al completamento dell'intera copia.
  • --no-whole-filein modo che tutto ciò che deve essere reinviato utilizzi il delta transfer. La lettura della metà di un file parzialmente trasferito è spesso molto più rapida della scrittura di nuovo.
  • --inplace per evitare la copia del file (ma solo se nulla sta leggendo la destinazione fino al completamento dell'intero trasferimento)
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.