Ich habe ein rsync
Skript verwendet, um Daten auf einem Host mit den Daten auf einem anderen Host zu synchronisieren. Die Daten enthalten zahlreiche kleine Dateien, die zu fast 1,2 TB beitragen.
Um diese Dateien zu synchronisieren, habe ich den rsync
Befehl wie folgt verwendet:
rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/
Die Inhalte von proj.lst lauten wie folgt:
+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *
Als Test habe ich zwei dieser Projekte (8,5 GB Daten) ausgewählt und den obigen Befehl ausgeführt. Da es sich um einen sequentiellen Prozess handelt, dauert der Vorgang 14 Minuten und 58 Sekunden. Für 1,2 TB Daten würde es also mehrere Stunden dauern.
Wenn ich mehrere würde könnte rsync
Prozesse parallel (unter Verwendung von &
, xargs
oder parallel
), wäre es meine Zeit sparen.
Ich habe versucht mit dem folgenden Befehl parallel
(nachdem ich cd
in das Quellverzeichnis gegangen bin ) und es dauerte 12 Minuten 37 Sekunden, um auszuführen:
parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .
Dies hätte 5-mal weniger Zeit in Anspruch nehmen sollen, tat es aber nicht. Ich denke, ich gehe irgendwo falsch.
Wie kann ich mehrere rsync
Prozesse ausführen, um die Ausführungszeit zu verkürzen?
quelle
rsync
s ist jedoch unsere oberste Priorität.rsync
s parallel stehen jetzt im Vordergrund.Antworten:
Folgende Schritte haben den Job für mich erledigt:
rsync --dry-run
ersten aus, um die Liste der betroffenen Dateien abzurufen.cat transfer.log
to eingespeistparallel
, um 5rsync
s parallel laufen zu lassen :Hier hat
--relative
Option ( Link ) dafür gesorgt, dass die Verzeichnisstruktur für die betroffenen Dateien an der Quelle und am Ziel unverändert bleibt (innerhalb des/data/
Verzeichnisses), sodass der Befehl im Quellordner ausgeführt werden muss (z/data/projects
. B. ).quelle
split
dieser Dateinamen aufzuteilen und parallel zu übertragen. Verwenden Sie dann rsync--files-from
, um die Dateinamen aus jeder Datei zu entfernen und sie zu synchronisieren. rm backups. * split -l 3000 backup.list backups. ls Backups. * | Paralleler Zeilenpuffer --verbose -j 5 rsync --progress -av --files-from {} / LOCAL / PARENT / PATH / REMOTE_HOST: REMOTE_PATH /receiving file list ... done
created directory /data/
.--info=name
anstelle von verwenden-v
, und Sie erhalten nur die Namen der Dateien und Verzeichnisse. Möglicherweise möchten Sie --protect-args auch für das 'innere' übertragende rsync verwenden, wenn Dateien Leerzeichen oder Shell-Metazeichen enthalten.Ich persönlich benutze dieses einfache:
Dies ist nur dann nützlich, wenn Sie mehr als ein paar nicht nahezu leere Verzeichnisse haben, da sonst fast alle
rsync
beendet werden und das letzte den ganzen Job alleine erledigt.quelle
Ich würde niemanden davon abhalten, die akzeptierte Antwort zu verwenden. Eine bessere Lösung besteht darin, das Verzeichnis der obersten Ebene zu crawlen und eine proportionale Anzahl von Rync-Vorgängen zu starten.
Ich habe ein großes ZFS-Volume und meine Quelle war ein CIFS-Mount. Beide sind mit 10G verbunden und können in einigen Benchmarks die Verbindung sättigen. Die Leistung wurde mit bewertet
zpool iostat 1
.Das Quelllaufwerk wurde wie folgt gemountet:
Mit einem einzigen
rsync
Prozess:das io meter lautet:
In synthetischen Benchmarks (Crystal Disk) erreicht die Leistung für sequentielles Schreiben 900 MB / s, was bedeutet, dass die Verbindung gesättigt ist. 130MB / s ist nicht sehr gut, und der Unterschied zwischen einem Wochenende und zwei Wochen warten.
Also habe ich die Dateiliste erstellt und versucht, die Synchronisierung erneut auszuführen (ich habe einen 64-Core-Computer):
und es hatte die gleiche Leistung!
Als Alternative habe ich einfach rsync für die Root-Ordner ausgeführt:
Dies hat die Leistung tatsächlich gesteigert:
Als Fazit, als @Sandip Bhattacharya auftauchte, schreiben Sie ein kleines Skript, um die Verzeichnisse zu erhalten und parallel dazu. Alternativ können Sie eine Dateiliste an rsync übergeben. Erstellen Sie jedoch nicht für jede Datei neue Instanzen.
quelle
Eine getestete Methode zur parallelisierten Synchronisierung ist: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync
quelle
find
?--dry-run
Option in verwendersync
, hätte ich eine Liste der Dateien, die übertragen werden würden. Kann ich diese Dateiliste zur Verfügung stellen,parallel
um den Prozess zu parallelisieren?mkdir -p /dest-dir/{//}\;
Teil erklären ? Besonders die{//}
Sache ist etwas verwirrend.Für Synchronisierungen mit mehreren Zielen verwende ich
Hinweis: Alle SSH-Verbindungen werden mit öffentlichen Schlüsseln in hergestellt
~/.ssh/authorized_keys
quelle
Ich google immer nach parallelem rsync, da ich immer den vollständigen Befehl vergesse, aber bei mir hat keine Lösung funktioniert, wie ich wollte - entweder umfasst sie mehrere Schritte oder muss installiert werden
parallel
. Am Ende habe ich diesen Einzeiler zum Synchronisieren mehrerer Ordner verwendet:-P 5
ist die Anzahl der Prozesse, die Sie erzeugen möchten - verwenden Sie 0 für unbegrenzt (offensichtlich nicht empfohlen).--bwlimit
zu vermeiden, die gesamte Bandbreite zu nutzen.-I %
Argument von find (Verzeichnis gefunden indir/
)$(echo dir/%/ host:/dir/%/)
- druckt Quell- und Zielverzeichnisse, die von rsync als Argumente gelesen werden. % wird durch den von gefundenenxargs
Verzeichnisnamen ersetztfind
.Nehmen wir an, ich habe zwei Verzeichnisse in
/home
:dir1
unddir2
. Ich rennefind /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'
. Der Befehl rsync wird also als zwei Prozesse ausgeführt (zwei Prozesse, weil er/home
zwei Verzeichnisse hat) und hat folgende Argumente:quelle