Mehrere SCP-Threads gleichzeitig ausführen

10

Mehrere scp-Threads gleichzeitig ausführen:

Hintergrund:

Ich finde mich oft dabei, eine Reihe von Serverdateien häufig zu spiegeln, und in diesen Serverdateien sind Tausende kleiner 1kb-3kb-Dateien enthalten. Alle Server sind mit 1-Gbit / s-Ports verbunden, die in der Regel in verschiedenen Rechenzentren verteilt sind.

Problem:

SCP überträgt diese kleinen Dateien, EINE für EINE, und es dauert ewig, und ich habe das Gefühl, dass ich die schönen Netzwerkressourcen verschwende, die ich habe.

Lösung?:

Ich hatte eine Idee; Erstellen eines Skripts, das die Dateien in gleiche Mengen aufteilt und 5-6 scp-Threads startet, die dann theoretisch 5-6 mal schneller erledigt würden, nicht wahr? Aber ich habe keine Erfahrung mit Linux-Skripten!

Fragen):

  • Gibt es eine bessere Lösung für das erwähnte Problem?
  • Gibt es so etwas schon?
  • Wenn nicht, gibt es jemanden, der mir einen Anfang macht oder mir hilft?
  • Wenn nicht zu 2 oder 3, wo wäre ein guter Ort, um Linux-Skripte zu lernen? Wie Bash oder andere.
Caesay
quelle

Antworten:

9

Ich würde es so machen:
tar -cf - /manyfiles | ssh dest.server 'tar -xf - -C /manyfiles'

Abhängig von den Dateien, die Sie übertragen, kann es sinnvoll sein, die Komprimierung in den tarBefehlen zu aktivieren :
tar -czf - /manyfiles | ssh dest.server 'tar -xzf - -C /manyfiles'

Es kann auch sinnvoll sein, eine CPU-freundlichere Verschlüsselung für den sshBefehl auszuwählen (z. B. arcfour): tar -cf - /manyfiles | ssh -c arcfour dest.server 'tar -xf - -C /manyfiles'

Oder kombinieren Sie beide, aber es hängt wirklich davon ab, was Ihr Engpass ist.
Offensichtlich rsyncwird es viel schneller sein, wenn Sie inkrementelle Synchronisierungen durchführen.

Schwindler
quelle
9

Verwenden Sie rsyncanstelle von scp. Sie können rsyncover sshso einfach wie verwenden scpund es unterstützt "Pipelining von Dateiübertragungen zur Minimierung der Latenzkosten".

Ein Tipp: Wenn die Daten komprimierbar sind, aktivieren Sie die Komprimierung. Wenn nicht, deaktivieren Sie es.

David Schwartz
quelle
Ich habe letzte Nacht nur eine Übertragung mit scp durchgeführt und mache eine weitere ähnliche Übertragung mit rsync - es scheint viel schneller zu sein. Es scheint jedoch immer noch eine Datei gleichzeitig zu übertragen - jede Idee, wie dies dazu führen kann, dass mehrere Threads ausgeführt werden (über das Einschließen und Ausschließen einer Reihe von Verzeichnissen per Skript hinaus; siehe: sun3.org/archives) / 280 )
aendrew
Angesichts der begrenzten Bandbreite macht es keinen Sinn, mehrere Dateien gleichzeitig zu übertragen. Ich glaube, Sie werden diesen Befehl nicht berücksichtigen, wenn die Bandbreite reichlich ist. Das Eliminieren der Latenzkosten hat bereits beim Kopieren vieler kleiner Dateien sehr geholfen. Selbst wenn Sie mehrere Dateien gleichzeitig kopieren können, beschleunigt die begrenzte Bandbreite Ihre Dateiübertragung nicht.
Joe
1

Ich wollte gerade GNO Parallel vorschlagen (was noch einige Skriptarbeiten von Ihrer Seite erfordert), aber dann fand ich pscp (das Teil von pssh ist ). Das passt vielleicht genau zu Ihren Bedürfnissen.

Rilindo
quelle
1
Es scheint psshgleichzeitig mit mehreren Maschinen zu arbeiten. Ich glaube nicht, dass es Parallelität auf Dateiebene implementiert.
David Schwartz
Ich sollte wahrscheinlich spezifisch sein - ich meinte pscp.
Rilindo
0

Möglicherweise ohne Bezug, aber wenn Sie etwas mehr in Echtzeit möchten, können Sie GlusterFS ausprobieren . Funktioniert gut, erfordert jedoch einige Anpassungen, wenn Sie kleine Dateien effizient lesen möchten.

Kyle
quelle
0

Nicht scp direkt, aber eine Option für die Übertragung mit mehreren Threads (auch für einzelne Dateien) ist bbcp - https://www2.cisl.ucar.edu/resources/storage-and-file-systems/bbcp .

Verwenden Sie die Option -s für die Anzahl der Threads, die Sie Daten übertragen möchten. Hervorragend geeignet für Verbindungen mit hoher Bandbreite, aber Verzögerung, da die Verzögerung die Größe des TCP-Fensters pro Thread begrenzt.

der Werkzeugmann
quelle