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 die verfügbare Bandbreite und CPU effizienter genutzt werden als mit einem einzelnen rsync-Stream.

Diese Anleitung erklärt, wann parsyncfp hilfreich ist, wie man es installiert und wie man eine grundlegende Übertragung zwischen zwei Servern durchführt.

Warning

Paralleles Kopieren beschleunigt Übertragungen nur bei schnellen Festplatten und einem stabilen Netzwerk. Bei langsamen Festplatten oder netzwerkgemounteten Dateisystemen (NFS, SMB, FUSE) bringt eine Erhöhung der Anzahl paralleler Prozesse oft keinen Geschwindigkeitsgewinn und kann stattdessen zusätzliche Last auf die Quelle, das Ziel oder die Verbindung dazwischen erzeugen. 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 Quelldateibaum in Teile von etwa gleicher Größe aufzuteilen, und startet dann mehrere rsync-Prozesse parallel, einen pro Teil. 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 Empfangsseite wie üblich.

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

Wann parsyncfp nützlich ist

parsyncfp bringt den größten Nutzen, wenn:

  • die Quelle Millionen kleiner Dateien enthält, bei denen rsync den größten Teil seiner Zeit mit Metadatenoperationen statt mit der tatsächlichen Datenübertragung verbringt;
  • sowohl die Quelle als auch das Ziel durch schnellen Speicher (NVMe, SSD oder ein gut abgestimmtes RAID) unterstützt werden;
  • das Netzwerk zwischen Quelle und Ziel schnell und stabil ist (1 Gbps oder mehr, geringer Paketverlust);
  • ein einzelner rsync-Prozess durch die CPU oder den Durchsatz pro Stream begrenzt ist, nicht durch die Festplatte oder die Verbindung.

Für kleine Verzeichnisse, langsame Festplatten oder ein gesättigtes Netzwerk reicht das einfache rsync in der Regel 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 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 mit der Option --altcache einen separaten Cache-Speicherort zu. parsyncfp erkennt andere laufende Instanzen beim Start und warnt davor, sodass versehentliche Überlappungen frühzeitig sichtbar werden.

Installieren der Abhängigkeiten

parsyncfp selbst basiert auf rsync (dem Transport) und fpart (zum Aufteilen des Quellbaums in Chunks). 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 zuerst 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 richtige für Ihre Version:

# 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 ausliefert (zum Beispiel RHEL 10 oder dessen Rebuilds zum Zeitpunkt der Erstellung dieses Dokuments) oder Sie EPEL lieber nicht verwenden möchten, bauen Sie fpart aus dem Quellcode. Das offizielle Repository ist das fpart-GitHub-Repository; die README listet eine kleine Reihe von Build-Abhängigkeiten auf (einen C-Compiler, make und die Standard-C-Bibliothek-Header).

Installieren 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 ohne Angabe des vollständigen Pfads aufrufen können:

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

Überprüfen Sie, ob das Skript läuft:

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 ein Schlüsselpaar auf der Quelle (falls nicht bereits vorhanden) 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 und die IP-Adresse oder den Hostnamen Ihres Zielservers. Nach diesem Schritt sollte der folgende Befehl ohne Passworteingabe eine Verbindung herstellen:

ssh user@target_host

Durchführen einer Übertragung

Ein typischer parsyncfp-Befehl sieht wie folgt 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 Zielhost 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 /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 sinnvoller Ausgangspunkt sind 4 bis 8; erhöhen Sie die Anzahl schrittweise und nur, wenn die Festplatten und das Netzwerk noch nicht ausgelastet sind. --NP gleich der Anzahl der CPU-Kerne zu setzen, ist selten die richtige Wahl an sich.
  • --altcache gibt ein alternatives Cache-Verzeichnis an. Es ist nützlich, wenn Sie mehrere parsyncfp-Instanzen gleichzeitig ausführen oder wenn der Standardspeicherort auf langsamem Speicher liegt. Vermeiden Sie es, auf einen tmpfs-basierten Speicherort zu zeigen (wie /tmp in vielen Distributionen), da die Chunk-Listen bei sehr großen Quellbäumen groß werden können und Sie nicht möchten, dass sie den RAM auffressen.
  • --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 rsync-typischen Ziel in der Form user@host:/path/.

Für die vollständige Liste der Optionen führen Sie parsyncfp --help aus oder lesen Sie die Upstream-Dokumentation.

Nützliche zusätzliche Optionen

Sobald die grundlegende Übertragung funktioniert, lohnt es sich, einige Optionen für Produktionsläufe zu kennen:

  • --maxbw=500000 begrenzt die Gesamtbandbreite aller rsync-Prozesse 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 über den angegebenen Wert steigt. Hilfreich auf belasteten Quellservern, aber lesen Sie die Warnung unten, bevor Sie die 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, zusätzliche Flags direkt an die zugrunde liegenden rsync-Prozesse zu übergeben. Verwenden Sie es, um Komprimierung (-z) zu aktivieren, eine benutzerdefinierte Blockgröße einzustellen oder andere rsync-Anpassungen vorzunehmen. Übergeben Sie --delete nicht über --rsyncopts; siehe Abschnitt „Einschränkungen" weiter unten, warum dies unsicher ist.
  • --verbose=2 erhöht die Detailgenauigkeit der Protokollierung, was die Fehlerbehebung bei den ersten Läufen erleichtert.

Warning

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

Einschränkungen

Selbst auf geeigneter Hardware hat parsyncfp Kompromisse, die Sie kennen sollten, bevor Sie die Anzahl der Prozesse erhöhen:

  • parsyncfp unterstützt die Option --delete von rsync nicht sicher. Jeder parallele rsync-Prozess sieht nur seinen eigenen Teil der Quelle. Wenn --delete also durchgereicht wird, versucht jeder Prozess, Dateien auf dem Ziel zu löschen, die nicht in seinem Teil enthalten sind, also Dateien, die rechtmäßig zu anderen Teilen gehören. Dies kann große Teile des Ziels auslöschen. Verwenden Sie einfaches rsync (oder einen separaten Bereinigungsdurchlauf), wenn Sie die Semantik von --delete benötigen.
  • parsyncfp behält keine globale Reihenfolge der Dateien über die parallelen rsync-Prozesse hinweg bei, sodass die Reihenfolge, in der Dateien auf dem Ziel erscheinen, nicht vorhersehbar ist. Dies ist nur wichtig für Arbeitsabläufe, die während des Kopierens von Dateizeitstempeln oder der Reihenfolge der Verzeichnisauflistung abhängen.
  • Bei HDD-Arrays verwandeln viele parallele rsync-Prozesse das, was ein sequenzielles Lesemuster wäre, in ein nahezu zufälliges Muster, was langsamer sein kann als ein einzelnes rsync. SSDs und NVMe-Laufwerke sind weit 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, dann stagniert sie.
  • Jeder rsync-Prozess öffnet seine eigene SSH-Verbindung zum Ziel, sodass hohe --NP-Werte den Overhead des Verbindungsaufbaus vervielfachen. Über WAN-Verbindungen mit Paketverlust oder hoher Latenz kann dies die Überlastung eher verschlimmern als verbessern. In diesem Fall führen weniger Prozesse mit einem optimierten rsync (Komprimierung, größere Blockgröße) oft zu besseren Ergebnissen als viele parallele.

Siehe auch

Wenn parsyncfp sich als aufwendiger erweist, als Sie benötigen, enthält das fpart-Paket auch fpsync, einen einfacheren parallelen rsync-Wrapper desselben Autors. Es verwendet die gleiche Chunking-Idee, aber 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