Inverses Multiplexing zur Beschleunigung der Dateiübertragung

23323
ZimmyDubZongyZongDubby

Ich habe eine große Datenmenge von einer Maschine zur anderen gesendet. Wenn ich mit rsync (oder einer anderen Methode) sende, wird es bei einer konstanten Geschwindigkeit von 320 kb / s gehen. Wenn ich zwei oder drei Übertragungen gleichzeitig initiiere, wechselt jede bei 320, und wenn ich vier gleichzeitig mache, wird die Verbindung maximal.

Ich muss in der Lage sein, Daten so schnell wie möglich zu senden, daher brauche ich ein Tool, das inverses Multiplexing mit Dateiübertragungen ausführen kann. Ich brauche eine generelle Lösung, daher ist es nicht praktikabel, Split auf dem Quellcomputer auszuführen und sie am anderen Ende zusammen zu kattern. Ich brauche das, um automatisiert zu arbeiten.

Gibt es ein Werkzeug, das dies tut, oder muss ich mein eigenes machen? Der Sender ist CentOS, der Empfänger ist FreeBSD.

16

11 Antworten auf die Frage

26
Tim Woolford

Beweise, dass alles in Ordnung ist - ich präsentiere den 'Heiligen Gral' von Remote Mirror-Befehlen. Vielen Dank an davr für den lftpVorschlag.

lftp -c "mirror --use-pget-n=10 --verbose sftp://username:password@server.com/directory" 

Das Obige spiegelt rekursiv ein Remote-Verzeichnis wider und teilt jede Datei in 10 Threads auf, wenn sie übertragen wird!

`lftp` ist großartig, aber ich kann es beim Laden nicht zum Multipart-Tuning bringen. Ich verwende `mirror --use-pget-n = 20 -R` - aber es scheint, dass` --use-pget-n` nur beim Download funktioniert. Ze'ev vor 8 Jahren 0
PS, `-P20` lädt mehrere Dateien hoch, aber ich kann nicht jede Datei mehrteilig machen. Ze'ev vor 8 Jahren 0
lftp unterstützt kein segmentiertes / mehrteiliges Hochladen. Sie müssen die Übertragung von der Zielseite aus starten, um "pget -n" zu verwenden. apraetor vor 7 Jahren 1
Denken Sie daran, dass "Spiegel" bidirektional ist. Das Argument 'pget' gilt nur für heruntergeladene Dateien. apraetor vor 7 Jahren 0
9
davr

Es gibt ein paar Tools, die funktionieren könnten.

  • LFTP - unterstützt FTP, HTTP und SFTP. Unterstützt die Verwendung mehrerer Verbindungen zum Herunterladen einer einzelnen Datei. Angenommen, Sie möchten eine Datei von remoteServer auf localServer übertragen, installieren Sie LFTP auf localServer und führen Sie Folgendes aus:

    lftp -e 'pget -n 4 sftp://userName@remoteServer.com/some/dir/file.ext'

    Die '-n 4' gibt an, wie viele Verbindungen parallel verwendet werden sollen.

  • Dann gibt es die vielen "Download Accelerator" -Tools, die im Allgemeinen nur HTTP oder FTP unterstützen, die Sie möglicherweise nicht auf dem Remote-Server einrichten müssen. Beispiele sind Axel, aria2 und ProZilla

7
Mário Melo Filho

Wenn Sie nur wenige und große Dateien verwenden, werden lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server>Sie 2 Dateien herunterladen, wobei jede Datei in 10 Segmente mit insgesamt 20 FTP-Verbindungen aufgeteilt ist <ftp_server>.

Wenn Sie viele kleine Dateien haben, verwenden lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>Sie: Sie laden 100 Dateien parallel ohne Segmentierung herunter. Insgesamt sind 100 Verbindungen geöffnet. Dies kann dazu führen, dass die verfügbaren Clients auf dem Server ausgeblendet werden oder dass Sie auf einigen Servern gesperrt werden.

Sie können --continueden Job fortsetzen :) und die -ROption zum Hochladen statt Herunterladen (dann Umschalten der Argumentreihenfolge auf <local_dir> <remote_dir>).

Tippfehler im Parameter: --use-pget-n statt --use-pget-m. Versuchte zu bearbeiten, aber meine Bearbeitung war zu kurz. Tony vor 9 Jahren 1
1
Geoff Fritz

Wie sind Ihre Daten aufgebaut? Ein paar große Dateien? Ein paar große Verzeichnisse? Sie könnten mehrere Instanzen von rsync in bestimmten Zweigen Ihrer Verzeichnisstruktur erzeugen.

Es hängt alles davon ab, wie Ihre Quelldaten strukturiert sind. Es gibt Unmengen von Unix-Tools, um Dateien zu schneiden, zu würfeln und wieder zusammenzusetzen.

Willkürliche Daten. Manchmal ist es ein großes Verzeichnis, manchmal eine einzelne Datei. ZimmyDubZongyZongDubby vor 14 Jahren 0
1
Captain Segfault

Möglicherweise können Sie Ihre TCP-Einstellungen anpassen, um dieses Problem zu vermeiden, je nachdem, was die 320 KB / s pro Verbindungslimit verursacht. Meine Vermutung ist, dass es keine explizite Begrenzung der Verbindungsraten durch den ISP gibt. Es gibt zwei wahrscheinliche Schuldige für die Drosselung:

  1. Einige Verbindungen zwischen den beiden Rechnern sind gesättigt und verwerfen Pakete.
  2. Die TCP-Fenster sind gesättigt, weil das Bandbreitenverzögerungsprodukt zu groß ist.

Im ersten Fall würde jede TCP-Verbindung bei der Standard-TCP-Überlastungssteuerung effektiv gleich konkurrieren. Sie können dies auch verbessern, indem Sie die Algorithmen für die Überfüllung der Daten ändern oder den Backoff-Betrag reduzieren.

Im zweiten Fall sind Sie nicht durch Paketverlust eingeschränkt. Das Hinzufügen zusätzlicher Verbindungen ist eine einfache Methode, um die Gesamtfenstergröße zu erweitern. Wenn Sie die Fenstergrößen manuell vergrößern können, wird das Problem behoben. (Dies erfordert möglicherweise eine Skalierung des TCP-Fensters, wenn die Verbindungslatenz ausreichend hoch ist.)

Wie groß das Fenster sein muss, lässt sich durch die Multiplikation der Ping-Zeit mit der Gesamtgeschwindigkeit der Verbindung ablesen. 1280 KB / s benötigt 1280 Bytes pro Millisekunde (1311 für 1024 = 1 KB). Ein 64-KByte-Puffer wird bei einer Latenz von etwa 50 ms herausgefahren, was ziemlich typisch ist. Ein 16-KByte-Puffer würde dann um 320 KBit / s sättigen.

1
user67730

Wenn Sie ein Kennwort ohne SSH-Anmeldung einrichten können, werden 4 gleichzeitige SCP-Verbindungen (-n) geöffnet, und jede Verbindung behandelt 4 Dateien (-L):

finden . -type f | xargs -L 4 -n 4 /tmp/scp.sh Benutzer @ Host: Pfad

Datei /tmp/scp.sh:

#!/bin/bash  #Display the help page function showHelp() { echo "Usage: $0 <destination> <file1 [file2 ... ]>" }  #No arguments? if [ -z "$1" ] || [ -z "$2" ]; then showHelp exit 1 fi  #Display help? if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then showHelp exit 0 fi  #Programs and options SCP='scp' SCP_OPTS='-B' DESTINATION="$1";shift;  #Check other parameters if [ -z "$DESTINATION" ]; then showHelp exit 1 fi  echo "$@"  #Run scp in the background with the remaining parameters. $SCP $SCP_OPTS $@ $DESTINATION & 
0
Jimmy Hedman

Versuchen Sie, alle Dateien in inode (find / mydir -type f -print | xargs ls -i | sort -n) zu sortieren, und übertragen Sie sie beispielsweise mit cpio über ssh. Dadurch wird Ihre Festplatte maximal ausgelastet und das Netzwerk wird zum Engpass. Schneller als das ist schwer zu gehen, wenn Sie über ein Netzwerk gehen.

das ist geradezu hinterlistig :) warren vor 14 Jahren 0
Ich kann nicht garantieren, dass alle Dateisysteme dadurch einen Schub erhalten. Dies hängt davon ab, wie das Inode-Layout erstellt wird. Jimmy Hedman vor 14 Jahren 0
Der Engpass ist, dass jede TCP-Verbindung auf 320 KB / s beschränkt ist. Ich möchte Dateien in parallelen TCP-Verbindungen senden, so dass ich 320 * NumConnections bis zur Grenze des Netzwerks (etwa 1200 KB / s) bekomme. Das Sortieren nach Inode erreicht dies nicht. ZimmyDubZongyZongDubby vor 14 Jahren 0
Was begrenzt die TCP-Geschwindigkeit? Ein Router zwischen den Maschinen? Jimmy Hedman vor 14 Jahren 0
Mein ISP. Netzneutralität? HA! ZimmyDubZongyZongDubby vor 14 Jahren 0
Bleh, schlechter ISP! Ich gehe davon aus, dass ein UDP-Stream ähnlich begrenzt ist. Ich denke, Sie müssen selbst etwas schreiben, denken Sie nicht, dass die Torrent-Lösung hilfreich ist, wenn Sie nur zwei Maschinen verwenden. Jimmy Hedman vor 14 Jahren 0
0
kolypto

Ich kenne ein Werkzeug, mit dem Dateien in Brocken übertragen werden können. Das Tool heißt "rtorrent" -Paket / -Port, das auf beiden Hosts verfügbar ist. BitTorrent-Clients reservieren häufig Speicherplatz vor der Übertragung, und Blöcke werden direkt von Sockets auf die Festplatte geschrieben. Außerdem können Sie den Status aller Überweisungen in einem schönen Bildschirm überprüfen.

Sie können einfache Bash-Skripte erstellen, um die Dateierstellung "* .torrent" zu automatisieren, und ssh einen Befehl an den Remote-Computer, damit er diese herunterlädt. Das sieht ein bisschen hässlich aus, aber ich denke nicht, dass Sie eine einfache Lösung finden werden, ohne weiterentwickelt zu werden :)

Wenn nur zwei Maschinen an der Dateiübertragung beteiligt sind, wie kann ein Torrent dabei helfen? Die Idee eines Torrents ist ein Schwarm von Sämaschinen, der die Daten einem Client-Anforderer zur Verfügung stellt. DaveParillo vor 14 Jahren 1
Du hast recht. Aber wer hat gesagt, dass es bei einer einzelnen Sämaschine nicht nützlich ist? ;) kolypto vor 14 Jahren 0
Wenn ein Torrent-Client mehrere TCP-Verbindungen mit einem einzigen Peer herstellt, würde dies das Problem von OP lösen. Ich weiß jedoch nicht, ob Torrent-Clients tatsächlich mehrere TCP-Verbindungen mit einzelnen Peers erstellen. chronos vor 14 Jahren 2
0
rob

FTP verwendet mehrere Verbindungen zum Herunterladen. Wenn Sie einen sicheren Kanal für FTP über ein VPN oder FTP über SSH einrichten können, sollten Sie in der Lage sein, Ihre Netzwerkverbindung maximal zu nutzen. (Beachten Sie, dass für FTP über SSH besondere Überlegungen erforderlich sind - siehe Link.)

FTPS (FTP über SSL) kann auch das tun, was Sie brauchen.

Sie können auch einen SFTP-Client verwenden, der mehrere Verbindungen unterstützt. Ich bin jedoch nicht sicher, ob SFTP mehrere Verbindungen für eine einzelne Datei unterstützt. Dies sollte das tun, was Sie die meiste Zeit benötigen, kann jedoch nicht den maximalen Durchsatz bieten, wenn Sie nur eine große Datei übertragen müssen.

Wäre SFTP nicht viel einfacher und genauso sicher (wenn nicht sogar sicherer)? Mark Renouf vor 14 Jahren 0
@rob: woher hast du das "FTP verwendet mehrere Verbindungen für Dateiübertragungen"? Einige Clients erlauben mehrere Streams für _downloading_ von FTP, aber es gibt definitiv keine FTP-Client / Server-Kombination, die mehrere Streams für _uploading_ auf FTP zulässt. chronos vor 14 Jahren 1
@ Mark: Ja, SFTP wäre wahrscheinlich einfacher und gleichermaßen sicher, aber ich weiß nicht, ob es mehrere Verbindungen für die Übertragung einer einzelnen Datei unterstützt. Vielen Dank für den Vorschlag. Ich werde es der Liste hinzufügen. rob vor 14 Jahren 0
@chronos: Sorry es war nicht klar; Ich schlug vor, dass ZimmyDubZongyZongDubby FTP zum Herunterladen vom CentOS-Server auf den FreeBSD-Client verwendet. Ich habe die Antwort so aktualisiert, dass "downloads" statt "Dateiübertragungen" heißt. rob vor 14 Jahren 1
-1
rob

Lösung 1: Ich bin nicht sicher, ob dies in Ihrem Fall praktisch ist, aber Sie könnten ein übergreifendes Archiv erstellen (z. B. ein in Chunks aufgespaltenes Tarfile oder ein übergreifendes 7zip-Archiv) und dann mehrere Instanzen von rsync verwenden, um sie zu senden das Netzwerk und bauen Sie sie auf der anderen Seite zusammen. Sie könnten ein Allzweck-Skript schreiben, dessen Argumente das zu übertragende Verzeichnis und die Anzahl der zu verwendenden Verbindungen sind. Der offensichtliche Nachteil ist, dass Sie auf beiden Seiten doppelt so viel freien Speicherplatz benötigen und zusätzlichen Aufwand haben müssen, um die Dateien auf beiden Seiten zu archivieren / zu extrahieren.

Lösung 2: Eine bessere Lösung wäre, ein Skript oder ein Programm zu schreiben, das die große Verzeichnisstruktur je nach Größe in Teilbäume unterteilt und diese Teilbäume dann parallel kopiert. Es könnte einfacher sein, wenn Sie zuerst die gesamte Verzeichnisstruktur (ohne die Dateien) kopieren.

Möchten Sie die Downvote näher erläutern? rob vor 14 Jahren 0