Wie kann ich rsync beschleunigen?

44

Ich führe rsync aus, um ein Verzeichnis auf meine externe USB-Festplatte zu synchronisieren. Es sind ungefähr 150 Datenmengen. Über 50000 Dateien, würde ich raten.

Derzeit wird die erste Synchronisierung ausgeführt, das Kopieren von Dateien erfolgt jedoch nur mit einer Geschwindigkeit von 1 bis 5 MB / s. Das scheint für ein USB 2.0-Gehäuse unglaublich langsam zu sein. Es finden auch keine anderen Übertragungen auf dem Laufwerk statt.

Hier sind die Optionen, die ich verwendet habe:

rsync -avz --progress /mysourcefolder /mytargetfolder

Ich verwende Ubuntu Server 9.10.

Jake Wilson
quelle
2
Sind Sie sicher, dass Sie eine USB2-Verbindung haben? wird eine (nicht-rsync) Kopie oder ein anderer Schreibvorgang mit normaler Geschwindigkeit ausgeführt? Wenn nicht, haben Sie versucht, eine Kopie oder einen anderen Schreibvorgang mit einem anderen USB-Anschluss / Kabel durchzuführen?
Quack Quijote
Siehe auch serverfault.com/questions/43014/… - dort wird auch die Verwendung von zwei weitergeleiteten tarBefehlen oder vorgeschlagen cpio.
Blaisorblade

Antworten:

38

Für die erste Synchronisierung verwenden Sie einfach

cp -a  /mysourcefolder /mytargetfolder

rsync fügt nur Overhead hinzu, wenn das Ziel leer ist.

auch .. die Option -z kann Ihre Leistung beeinträchtigen. Sie sollten sie nicht verwenden, wenn Sie keine Daten über eine langsame Verbindung übertragen.

user23307
quelle
3
rsync wird so genannt, weil es für die Remote- Synchronisation vorgesehen ist und aus diesem Grund für ein lokal verbundenes Volume nicht geeignet ist.
msanford
6
Es soll auch für lokale Transfers verwendet werden können und ist viel flexibler. Es ist möglicherweise nur bei der ersten Synchronisierung ein Overkill.
Blaisorblade
1
rsync ist auch eine Einweg-Synchronisation. Sehr gut zum Sichern auf einem Server oder von einem Server. Wenn Sie jedoch eine lokale TWO-Way-Synchronisierung auf einem Wechseldatenträger wünschen, sollten Sie csync csync.org/get-it auschecken , um nicht mit csync2 zu verwechseln, das ein völlig anderes Projekt ist.
Jesse the Wind Wanderer
3
rsync -avz --progress /mysourcefolder/ /mytargetfolderoder Sie erhalten eine Kopie von mysourcefolderinside of mytargetfolderanstatt den Inhalt zu spiegeln
Editor
2
Diese Antwort beantwortet die Frage nicht. Die Frage war, wie man rsync optimiert - nicht durch den Befehl cp ersetzen.
25.
38

Wenn Sie rsync mit einem schnellen Netzwerk oder einer Festplatte auf derselben Maschine verwenden,

ohne Komprimierung -z

und mit --inplace

beschleunigt es auf die Leistung der Festplatten oder des Netzwerks

Komprimierung verbraucht viel CPU

Wenn Sie Inplace nicht verwenden, wird der Festplatten-Thrash sehr häufig (es wird eine temporäre Datei verwendet, bevor das Finale erstellt wird).

Komprimierung und Nichtverwendung von Inplace ist besser für die Ausführung über das Internet (langsames Netzwerk).

NEU: Achten Sie auf das Ziel ... wenn NTFS "Komprimierung" aktiviert ist ... verlangsamt dies stark große Dateien (ich würde sagen 200MB +).

Scott Kramer
quelle
Die NTFS-Komprimierung ist bei großen Dateien langsam
Scott Kramer
Ich sehe nichts über "--inline" auf der Manpage
Anthony
1
Es ist '--inplace'
Scott Kramer
26

Verwenden Sie die -WOption. Dies deaktiviert Delta / Diff-Vergleiche. Wenn sich die Dateizeiten / -größen unterscheiden, kopiert rsync die gesamte Datei.

Entfernen Sie auch die -zOption. Dies ist nur zum Komprimieren des Netzwerkverkehrs nützlich.

Jetzt rsyncsollte so schnell wie möglich sein cp.

vdboor
quelle
6
Kleiner Hinweis: -zIst nur für langsamen Netzwerkverkehr nützlich . Wenn Ihr Netzwerk schnell genug ist, wird es langsamer, da Sie durch die CPU begrenzt sind.
WhyNotHugo
3
Diese Tipps haben die Übertragung meiner Dateien zwischen zwei NAS-Geräten erheblich beschleunigt, danke!
Djhworld
2
Beachten Sie jedoch, dass laut Manpage für -W: "Dies ist die Standardeinstellung, wenn sowohl die Quelle als auch das Ziel als lokale Pfade angegeben sind, aber nur, wenn keine Batch-Schreiboption aktiviert ist."
GuoLiang Oon
13

Erstens wird die Anzahl der Dateien in diesem Fall ein wichtiger Faktor sein. Die durchschnittliche Größe beträgt jeweils 3 MB. Es gibt wahrscheinlich einen Engpass, der die Geschwindigkeit im OP-Fall beeinflusst. Mehr hier - das ist eine ziemlich trockene Lektüre, aber das Titelbild ist es wert.

Verwenden Sie also rsync, um in ein leeres Verzeichnis zu kopieren? Hier sind einige Möglichkeiten, um es zu beschleunigen:

  1. Nein -z - benutze definitiv nicht -z wie im OP.
  2. --no-compress beschleunigt Sie möglicherweise. Dies könnte den größten Einfluss haben ... Mein Test bestand aus 13.000 Dateien, einer Gesamtgröße von 200 MB und der Verwendung von rsync 3.1.3. Ich habe mit einer anderen Partition auf demselben internen SSD-Laufwerk synchronisiert. Mit --no-compress bekomme ich 18 MBit / s und ohne 15 MBit / s. cp erreicht übrigens 16 MBit / s. Das ist jedoch eine viel kleinere durchschnittliche Dateigröße. Außerdem - Ich kann keine Dokumentation für --no-compress finden. Ich habe davon in diesem Beitrag auf stackexchange.com erfahren.
  3. - Zum Kopieren ganzer Dateien - Verwenden Sie diese Option immer, wenn Sie nicht möchten, dass Unterschiede verglichen werden. Es macht nichts, dass der Sinn von rsync darin besteht, Unterschiede zu vergleichen und nur die Änderungen zu aktualisieren.
  4. -S um mit spärlichen Dateien gut umzugehen - kann nicht schaden, wenn Sie keine spärlichen Dateien haben.
  5. --exclude-from oder ähnliches zum Ausschließen von Dateien, die Sie möglicherweise nicht benötigen, verkürzt die Zeit, erhöht jedoch nicht Ihre Übertragungsgeschwindigkeit.
  6. Es ist möglich, dass Sie die Ausgabe an eine Datei wie diese senden rsync -a /source /destination >/somewhere/rsync.out 2>/somewhere/rsync.err- die erste> druckt im Grunde genommen eine Datei mit allem, was Sie normalerweise sehen würden, und die zweite> verweist auf Fehlermeldungen.
  7. Schließlich kann es eine große Hilfe sein , mehrere Instanzen von rsync für verschiedene Teile Ihrer Übertragung auszuführen.

Mein Befehl wäre:

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

Wenn alles gut aussähe, würde ich "--dry-run" löschen und loslassen. A, X und E decken erweiterte Attribute und Berechtigungen ab, die nicht von -a abgedeckt werden. L steht für weiche Links, H steht für harte Links und h steht für vom Menschen lesbare.

Das Aktualisieren eines bereits synchronisierten Verzeichnisses auf einem USB-Laufwerk oder demselben Laufwerk oder über ein Netzwerk erfordert unterschiedliche rsync-Befehle, um die Übertragungsgeschwindigkeit zu maximieren.

Bonus - hier ist die rsync-Manpage , und wenn Sie die Geschwindigkeit Ihrer Festplatte testen möchten, ist Bonnie ++ eine gute Option, und für Ihre Netzwerkgeschwindigkeit versuchen Sie es mit iperf .


* Der Beitrag ist fast zehn Jahre alt, aber Suchmaschinen mögen ihn auf jeden Fall, und ich sehe ihn immer wieder. Es ist eine gute Frage, und ich denke nicht, dass die beste Antwort auf die Frage, wie Sie rsync beschleunigen können, "Verwenden Sie stattdessen cp" sein sollte.

Fin Hirschoff
quelle
1
Zu Punkt 7) Ich könnte die Leistung bei Verwendung einer herkömmlichen Festplatte als Quelle wesentlich verbessern, indem ich den Vorauslesepuffer mit "blockdev --setra 8192 / dev / sdX" erweitere. Also habe ich vor, Kopfsuchen zu reduzieren.
user2480144
2

Sie sagen nicht, welche Größenverteilung Ihre Dateien haben. Wenn es viele kleine Dateien gibt, verringert dies die Gesamtübertragungsrate, indem die Latenz der Kopfbewegung sowohl auf dem Quell- als auch auf dem Ziellaufwerk erhöht wird, wenn das Tool neue Dateien öffnet und das Betriebssystem Verzeichniseinträge und andere Metadaten (z. B. das Journal des Dateisystems, wenn Sie verwenden) aufbewahrt Metadatenjournale wie ext3 / ext4 und NTFS sind während der Übertragung standardmäßig auf dem neuesten Stand. Ein Dateikopiervorgang wird für größere Objekte nur dann "in den Griff bekommen", wenn eine einfache Massenübertragung stattfindet.

David Spillett
quelle
0

Sie möchten rclone auf jeden Fall ausprobieren. Dieses Ding ist schnell verrückt:

$ tree / usr [...] 26105 Verzeichnisse, 293208 Dateien

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

Übertragen: 17.929G / 17.929 GByte, 100%, 165.692 MByte / s, ETA 0s Fehler: 75 (Wiederholung kann helfen) Überprüfungen: 691078/691078, 100% Übertragen: 345539/345539, 100% Verstrichene Zeit: 1m50.8s

Dies ist eine lokale Kopie von und zu einer LITEONIT LCS-256 (256 GB) SSD.

Sie können --ignore-checksum beim ersten Durchlauf hinzufügen, um es noch schneller zu machen.

Frédéric N.
quelle
0

Vermeiden

  • -z/ --compress: Komprimierung lädt nur die CPU, da die Übertragung nicht über ein Netzwerk, sondern über RAM erfolgt.
  • --append-verify: Eine unterbrochene Übertragung fortsetzen. Das klingt nach einer guten Idee, hat aber den gefährlichen Fehlerfall: Jede Zieldatei, deren Größe (oder größer) der der Quelle entspricht, wird ignoriert. Außerdem wird die gesamte Datei am Ende mit einer Prüfsumme versehen, was bedeutet, dass --no-whole-filebeim Hinzufügen eines gefährlichen Fehlerfalls keine signifikante Beschleunigung erfolgt .

Verwenden

  • -S/ --sparse: Folgen von Nullen in spärliche Blöcke verwandeln
  • --partialoder -Pwelche ist --partial --progress: Speichern Sie alle teilweise übertragenen Dateien für die zukünftige Wiederaufnahme. Hinweis: Dateien haben keinen temporären Namen. Vergewissern Sie sich daher, dass das Ziel von niemand anderem verwendet wird, bis die gesamte Kopie abgeschlossen ist.
  • --no-whole-fileDamit alles, was erneut gesendet werden muss, Delta-Transfer verwendet. Das Lesen der Hälfte einer teilweise übertragenen Datei ist oft viel schneller als das erneute Schreiben.
  • --inplace Vermeiden des Kopierens von Dateien (aber nur, wenn das Ziel erst nach Abschluss der gesamten Übertragung gelesen wird)
Tom Hale
quelle