Kopieren von Dateien mit schnellem Multithreading parsyncfp | INTROSERV
EUR
european

EUR

usa

USD

German De
Ex. VAT Ex. VAT 0%

Kopieren von Dateien mit schnellem Multithreading parsyncfp

Einführung

parsyncfp ist ein paralleler Wrapper um rsync, der die Übertragung großer Dateisammlungen beschleunigt, indem mehrere rsync-Prozesse gleichzeitig ausgeführt werden. Jeder Prozess synchronisiert seinen eigenen Teil der Dateien, sodass verfügbare Bandbreite und CPU effizienter genutzt werden als bei einem einzelnen rsync-Stream.

Diese Anleitung beschreibt, wann parsyncfp hilfreich ist, wie man es installiert und wie man eine einfache Übertragung zwischen zwei Servern durchführt.

Warning

Paralleles Kopieren beschleunigt Übertragungen nur bei schnellen Festplatten und einem stabilen Netzwerk. Bei langsamen Festplatten oder netzwerkgebundenen Dateisystemen (NFS, SMB, FUSE) bringt eine höhere Anzahl paralleler Prozesse oft keinen Geschwindigkeitsgewinn und kann stattdessen zusätzliche Last auf die Quelle, das Ziel oder die Verbindung zwischen ihnen bringen. Beginnen Sie mit einer kleinen Anzahl von Prozessen, messen Sie das Ergebnis und erhöhen Sie die Anzahl nur, wenn die Festplatten und das Netzwerk mithalten können.

Wie parsyncfp funktioniert

parsyncfp verwendet das Dienstprogramm fpart, um den Quellverzeichnisbaum in Chunks von ungefähr gleicher Größe aufzuteilen, und startet dann mehrere rsync-Prozesse parallel, einen pro Chunk. Da fpart den Baum inkrementell aufteilt, kann parsyncfp mit der Übertragung von Dateien beginnen, bevor der vollständige Scan des Quellbaums abgeschlossen ist, was bei sehr großen Verzeichnisbäumen wichtig ist.

Das Tool muss nur auf dem Quellserver installiert werden. rsync übernimmt die Empfängerseite wie gewohnt.

Derselbe Autor pflegt einen Nachfolger namens parsyncfp2 (pfp2), der Fehlerkorrekturen und Verbesserungen gegenüber parsyncfp enthält und zusätzlich das Senden von mehreren Quell-Hosts gleichzeitig unterstützt. Für neue Implementierungen ist parsyncfp2 die empfohlene Wahl. Diese Anleitung behandelt das klassische parsyncfp; die Befehlssyntax von pfp2 ist weitgehend kompatibel.

Wann parsyncfp nützlich ist

parsyncfp bringt den größten Vorteil, wenn:

  • die Quelle Millionen kleiner Dateien enthält, bei denen rsync die meiste Zeit mit Metadatenoperationen statt mit der eigentlichen Datenübertragung verbringt;
  • sowohl die Quelle als auch das Ziel auf schnellem Speicher basieren (NVMe, SSD oder ein gut abgestimmtes RAID);
  • das Netzwerk zwischen Quelle und Ziel schnell und stabil ist (1 Gbit/s oder mehr, geringer Paketverlust);
  • ein einzelner rsync-Prozess durch die CPU oder den Durchsatz pro Stream ausgebremst wird, nicht durch die Festplatte oder die Verbindung.

Bei kleinen Verzeichnissen, langsamen mechanischen Festplatten oder einem ausgelasteten Netzwerk reicht in der Regel einfaches rsync aus.

Das Verzeichnis ~/.parsyncfp

parsyncfp erstellt auf dem Quellserver ein Cache-Verzeichnis namens ~/.parsyncfp. Darin finden Sie das Unterverzeichnis fpcache, das das fpart-Protokoll, die PID-Dateien der laufenden rsync-Prozesse und die Chunk-Dateien enthält, die auflisten, welche Pfade jeder rsync-Prozess kopieren soll. Protokolldateien sind mit einem Datumsstempel versehen und werden zwischen den Läufen nicht überschrieben, sodass frühere Läufe später überprüft werden können.

Wenn Sie mehrere parsyncfp-Instanzen gleichzeitig ausführen möchten, weisen Sie jeder einen separaten Cache-Speicherort mit der Option --altcache zu. parsyncfp erkennt beim Start andere laufende Instanzen und warnt davor, sodass versehentlich überlappende Läufe frühzeitig sichtbar werden.

Installation der Abhängigkeiten

parsyncfp selbst ist auf rsync (den Transport) und fpart (zum Aufteilen des Quellbaums in Chunks) angewiesen. Installieren Sie beide auf dem Quellserver.

Unter Debian und Ubuntu:

apt-get install rsync fpart

Unter RHEL, CentOS Stream, AlmaLinux und Rocky Linux ist fpart nicht in den Basis-Repositories enthalten. Aktivieren Sie zunächst das EPEL-Repository und installieren Sie dann beide Pakete:

dnf install epel-release dnf install rsync fpart

Einige EPEL-Pakete hängen von Paketen aus dem PowerTools- oder CRB-Repository ab, das standardmäßig deaktiviert ist. Aktivieren Sie das für Ihre Version passende Repository:

# RHEL/AlmaLinux/Rocky Linux 9 und neuer dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools

Info

Wenn Ihre Distribution fpart überhaupt nicht mitliefert (zum Beispiel RHEL 10 oder dessen Neuaufbauten zum Zeitpunkt der Erstellung dieses Textes) oder Sie EPEL nicht verwenden möchten, kompilieren Sie fpart aus dem Quellcode. Das offizielle Repository ist das fpart-GitHub-Repository; die README listet einen kleinen Satz an Build-Abhängigkeiten auf (ein C-Compiler, make und die Standard-C-Bibliotheks-Header).

Installation von parsyncfp

parsyncfp ist ein einzelnes Perl-Skript, das auf GitHub gehostet wird. Laden Sie es herunter, machen Sie es ausführbar und verschieben Sie es in ein Verzeichnis in Ihrem PATH, damit Sie es aufrufen können, ohne den vollständigen Pfad einzugeben:

wget https://raw.githubusercontent.com/hjmangalam/parsy ncfp /master/parsyncfp chmod +x parsyncfp sudo mv parsyncfp /usr/local/bin/

Überprüfen Sie, ob das Skript ausgeführt wird:

parsyncfp --help

Wenn der Hilfebildschirm erscheint, ist parsyncfp einsatzbereit.

Einrichten des SSH-Zugriffs auf das Ziel

parsyncfp führt rsync über SSH aus, daher muss sich der Quellserver ohne Passwort beim Ziel anmelden können. Erzeugen Sie auf der Quelle ein Schlüsselpaar (falls noch keines vorhanden ist) und kopieren Sie den öffentlichen Schlüssel auf das Ziel:

ssh-keygen ssh-copy-id user@target_host

Ersetzen Sie user@target_host durch den Benutzernamen sowie die IP-Adresse oder den Hostnamen Ihres Zielservers. Nach diesem Schritt sollte der folgende Befehl eine Verbindung herstellen, ohne nach einem Passwort zu fragen:

ssh user@target_host

Eine Übertragung ausführen

Ein typischer parsyncfp-Befehl sieht folgendermaßen aus:

parsyncfp --NP=8 --altcache=/dir/local/tmp --startdir=/dir/local/ www/ [email protected]:/var/dir/

Dieser Befehl startet 8 rsync-Prozesse, verwendet /dir/local/tmp als Cache-Verzeichnis und kopiert den Inhalt von /dir/local/www nach /var/dir/ auf dem Ziel-Host 192.168.67.1.

Info

Achten Sie auf den abschließenden Schrägstrich beim Quellargument: www/ kopiert den Inhalt des Verzeichnisses www in das Ziel (wie im obigen Beispiel), während www (ohne Schrägstrich) das Verzeichnis www selbst kopiert und dabei /var/dir/www/ auf dem Ziel erstellt. Dies entspricht dem Verhalten von einfachem rsync.

Wichtige Befehlsparameter

  • --NP legt die Anzahl der parallelen rsync-Prozesse fest. Ein vernünftiger Ausgangswert liegt bei 4 bis 8; erhöhen Sie die Anzahl schrittweise und nur, wenn Festplatten und Netzwerk noch nicht ausgelastet sind. --NP allein auf die Anzahl der CPU-Kerne zu setzen, ist selten die richtige Wahl.
  • --altcache gibt ein alternatives Cache-Verzeichnis an. Nützlich, wenn Sie mehrere parsyncfp-Instanzen gleichzeitig ausführen oder wenn sich der Standardspeicherort auf langsamem Speicher befindet. Vermeiden Sie es, hier auf einen tmpfs-basierten Speicherort (wie /tmp auf vielen Distributionen) zu verweisen, da die Chunk-Listen bei sehr großen Quellbäumen groß werden können und diese nicht den RAM belegen sollten.
  • --startdir legt das Arbeitsverzeichnis fest, das als Basis für die nachfolgenden Quellpfade dient.
  • Die Argumente nach --startdir sind die zu kopierenden Quellverzeichnisse (eines oder mehrere, durch Leerzeichen getrennt), gefolgt vom Ziel im rsync-Stil in der Form user@host:/path/.

Die vollständige Liste der Optionen erhalten Sie mit parsyncfp --help oder in der Upstream-Dokumentation.

Nützliche zusätzliche Optionen

Sobald die grundlegende Übertragung funktioniert, lohnt es sich, einige Optionen für den Produktivbetrieb zu kennen:

  • --maxbw=500000 begrenzt die von allen rsync-Prozessen insgesamt genutzte Bandbreite in KB/s. Nützlich, wenn die Verbindung mit anderen Diensten geteilt wird.
  • --maxload=12 pausiert das Starten neuer rsync-Prozesse, sobald die durchschnittliche Systemlast den angegebenen Wert übersteigt. Hilfreich bei stark ausgelasteten Quellservern, beachten Sie jedoch den Warnhinweis unten, bevor Sie diese Option verwenden.
  • --chunksize=5G steuert, wie groß jeder fpart-Chunk ist. Größere Chunks reduzieren den Overhead pro Chunk bei Übertragungen mit vielen kleinen Dateien; kleinere Chunks verbessern die Parallelität bei Übertragungen mit wenigen sehr großen Dateien.
  • --rsyncopts="-a -s -x" ermöglicht es Ihnen, zusätzliche Flags direkt an die zugrunde liegenden rsync-Prozesse zu übergeben. Nutzen Sie diese Option, um Komprimierung (-z) zu aktivieren, eine benutzerdefinierte Blockgröße festzulegen oder andere rsync-Optimierungen anzuwenden. Übergeben Sie --delete nicht über --rsyncopts; im Abschnitt „Einschränkungen“ unten erfahren Sie, warum dies unsicher ist.
  • --verbose=2 erhöht die Protokollierungsdetails, was die Fehlersuche bei den ersten Durchläufen erleichtert.

Warning

Der Upstream-Autor hat ein bekanntes Problem mit --maxload dokumentiert: Wenn parsyncfp wiederholte Pausen- und Fortsetzungszyklen durchläuft, werden möglicherweise einige Quelldateien nicht auf das Ziel übertragen. Wenn Sie --maxload verwenden, setzen Sie den Schwellenwert hoch genug, damit Pausen niemals ausgelöst werden, oder überprüfen Sie das Ergebnis nach Abschluss der Übertragung mit einer separaten Konsistenzprüfung.

Einschränkungen

Auch auf geeigneter Hardware hat parsyncfp Kompromisse, die man kennen sollte, bevor man die Anzahl der Prozesse erhöht:

  • parsyncfp unterstützt die Option --delete von rsync nicht sicher. Jeder parallele rsync-Prozess sieht nur seinen eigenen Teil der Quelle. Wird --delete durchgereicht, versucht jeder Prozess, Dateien auf dem Ziel zu löschen, die sich nicht in seinem Chunk befinden – also Dateien, die rechtmäßig zu anderen Chunks gehören. Dies kann große Teile des Ziels löschen. Verwenden Sie einfaches rsync (oder einen separaten Bereinigungsdurchgang), wenn Sie die Semantik von --delete benötigen.
  • parsyncfp bewahrt keine globale Reihenfolge der Dateien über die parallelen rsync-Prozesse hinweg, sodass die Reihenfolge, in der Dateien auf dem Ziel erscheinen, nicht vorhersehbar ist. Dies ist nur für Arbeitsabläufe relevant, die während des Kopiervorgangs selbst von Datei-Zeitstempeln oder der Reihenfolge der Verzeichnisauflistung abhängen.
  • Bei HDD-Arrays verwandeln viele parallele rsync-Prozesse ein sonst sequenzielles Lesemuster in ein nahezu zufälliges, was langsamer sein kann als ein einzelner rsync-Lauf. SSDs und NVMe-Laufwerke sind davon deutlich weniger betroffen.
  • Bei Dateisystemen mit sehr vielen kleinen Dateien kann der Metadaten-Overhead pro Datei die Übertragungszeit dominieren. Parallelität hilft bis zu einem gewissen Punkt und stagniert dann.
  • Jeder rsync-Prozess öffnet seine eigene SSH-Verbindung zum Ziel, sodass hohe --NP-Werte den Overhead für den Verbindungsaufbau vervielfachen. Bei WAN-Verbindungen mit Paketverlust oder hoher Latenz kann dies die Überlastung eher verschlimmern als verbessern. In diesem Fall liefert oft eine geringere Prozessanzahl mit optimiertem rsync (Komprimierung, größere Blockgröße) bessere Ergebnisse als viele parallele Prozesse.

Siehe auch

Falls sich parsyncfp als aufwendiger erweist, als Sie benötigen: Das Paket fpart enthält auch fpsync, einen einfacheren parallelen rsync-Wrapper desselben Autors. Es nutzt dieselbe Chunking-Idee, jedoch mit weniger Optionen, und reicht oft für einmalige Übertragungen aus.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA