Inverses Multiplexing zur Beschleunigung der Dateiübertragung

19

Ich habe eine große Datenmenge von einem Computer zu einem anderen gesendet. Wenn ich mit rsync (oder einer anderen Methode) sende, wird die Geschwindigkeit konstant 320 kb / s betragen. Wenn ich zwei oder drei Übertragungen gleichzeitig initiiere, wird jede bei 320 ausgeführt, und wenn ich vier Übertragungen gleichzeitig durchführe, wird die Verbindung maximal.

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

Gibt es ein Tool, das dies tut, oder muss ich mein eigenes erstellen? Der Absender ist CentOS, der Empfänger ist FreeBSD.

ZimmyDubZongyZongDubby
quelle

Antworten:

29

Der Beweis, dass alles passt - ich präsentiere den 'heiligen Gral' von Remote Mirror-Befehlen. Danke an davr für den lftpvorschlag.

lftp -c "mirror --use-pget-n=10 --verbose sftp://username:[email protected]/directory" 

Der obige Befehl spiegelt ein entferntes Verzeichnis rekursiv und teilt jede Datei bei der Übertragung in 10 Threads auf!

Tim Woolford
quelle
lftpist großartig, aber ich bin nicht in der Lage, es beim UPloading mehrteilig zu machen. Ich benutze mirror --use-pget-n=20 -R- aber es scheint, dass --use-pget-nnur beim Herunterladen funktioniert.
Dan
PS, -P20funktioniert, um mehrere Dateien hochzuladen, aber ich kann nicht jede Datei mehrteilig.
Dan
1
lftp unterstützt keine segmentierten / mehrteiligen Uploads. Sie müssen die Übertragung von der Zielseite aus initiieren, um sie verwenden zu können pget -n.
Apraetor
Denken Sie daran, mirrorist bidirektional; Das pgetArgument gilt nur für heruntergeladene Dateien.
17.
10

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

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

    lftp -e 'pget -n 4 sftp://[email protected]/some/dir/file.ext'

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

  • Hinzu kommen die zahlreichen Tools für den Download-Beschleuniger, die jedoch in der Regel nur HTTP oder FTP unterstützen, die Sie möglicherweise nicht auf dem Remote-Server einrichten müssen. Einige Beispiele sind Axel , aria2 und ProZilla

davr
quelle
8

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

Wenn Sie eine große Anzahl kleiner Dateien haben, verwenden lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>Sie: Dann laden Sie 100 Dateien ohne Segmentierung parallel herunter. Insgesamt sind 100 Verbindungen offen. Dies kann dazu führen, dass die verfügbaren Clients auf dem Server nicht mehr verfügbar sind oder dass Sie auf einigen Servern gesperrt werden.

Sie können verwenden --continue, um den Job fortzusetzen :) und die -ROption zum Hochladen statt Herunterladen (und dann die Argumentreihenfolge zu wechseln <local_dir> <remote_dir>).

Mário Melo Filho
quelle
1
Tippfehler im Parameter: --use-pget-n statt --use-pget-m. Versucht zu bearbeiten, aber meine Bearbeitung war zu kurz.
Tony
2

Möglicherweise können Sie Ihre TCP-Einstellungen optimieren, um dieses Problem zu vermeiden. Dies hängt davon ab, was die Beschränkung von 320 KB / s pro Verbindung verursacht. Ich vermute, dass es keine explizite Beschränkung der Verbindungsrate durch den ISP gibt. Es gibt zwei mögliche Gründe für die Drosselung:

  1. Eine Verbindung zwischen den beiden Maschinen ist überlastet und verwirft 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-Überlastungskontrolle gleichermaßen konkurrieren. Sie können dies auch verbessern, indem Sie die Algorithmen für die Überlastung der Steuerung ändern oder das Backoff reduzieren.

Im zweiten Fall sind Sie nicht durch Paketverlust eingeschränkt. Das Hinzufügen zusätzlicher Verbindungen ist eine grobe Methode zum Erweitern der Gesamtfenstergröße. Wenn Sie die Fenstergröße manuell erhöhen können, wird das Problem behoben. (Dies erfordert möglicherweise eine TCP-Fensterskalierung, wenn die Verbindungslatenz ausreichend hoch ist.)

Sie können ungefähr feststellen, wie groß das Fenster sein muss, indem Sie die Ping-Zeit für die Hin- und Rückfahrt mit der Gesamtgeschwindigkeit der Verbindung multiplizieren. 1280 KB / s benötigen 1280 (1311 für 1024 = 1 KB) Bytes pro Millisekunde Roundtrip. Ein 64K-Puffer wird bei einer Latenz von ca. 50 ms maximal ausgelastet, was ziemlich typisch ist. Ein 16K-Puffer würde dann um 320KB / s sättigen.

Kapitän Segfault
quelle
1

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

Es hängt alles davon ab, wie Ihre Quelldaten strukturiert sind. Es gibt Tonnen von Unix-Werkzeugen zum Schneiden, Würfeln und Zusammensetzen von Dateien.

Geoff Fritz
quelle
Beliebige Daten. Manchmal ist es ein großes Verzeichnis, manchmal eine einzelne Datei.
ZimmyDubZongyZongDubby
1

Wenn Sie ein passwortloses SSH-Login einrichten können, werden 4 gleichzeitige SCP-Verbindungen (-n) geöffnet, wobei jede Verbindung 4 Dateien (-L) verarbeitet:

finden . -Typ 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 &
user67730
quelle
0

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

Jimmy Hedman
quelle
das ist ausgesprochen hinterhältig :)
warren
Ich kann nicht garantieren, dass alle Dateisysteme dadurch einen Schub bekommen, es hängt davon ab, wie das Inode-Layout gemacht wird.
Jimmy Hedman
Der Engpass besteht darin, dass jede TCP-Verbindung auf 320 KB / s begrenzt ist. Ich möchte Dateien in parallelen TCP-Verbindungen senden, damit ich 320 * NumConnections bis zur Netzwerkgrenze (ca. 1200 KB / s) erhalte. Das Sortieren nach Inode erreicht dies nicht.
ZimmyDubZongyZongDubby
Was begrenzt die TCP-Geschwindigkeit? Ein Router zwischen den Maschinen?
Jimmy Hedman
Mein ISP. Netzneutralität? HA!
ZimmyDubZongyZongDubby
0

Ich kenne ein Tool, das Dateien in Stücken übertragen kann. Das Tool heißt 'rtorrent' Paket / Port, das auf beiden Hosts verfügbar ist;) BitTorrent-Clients reservieren häufig Speicherplatz vor der Übertragung, und Chunks werden direkt von Sockets auf die Festplatte geschrieben. Außerdem können Sie ALLE Übertragungszustände in einem netten Bildschirm überprüfen.

Sie können einfache Bash-Skripte erstellen, um die Erstellung von "* .torrent" -Dateien zu automatisieren, und einen Befehl an den Remote-Computer senden, damit dieser ihn herunterlädt. Das sieht ein bisschen hässlich aus, aber ich glaube nicht, dass Sie eine einfache Lösung finden werden, ohne sie zu entwickeln :)

kolypto
quelle
1
Wie kann ein Torrent helfen, wenn nur zwei Computer an der Dateiübertragung beteiligt sind? Die Idee eines Torrents ist ein Schwarm von Seedern, die die Daten einem Kundenanforderer zur Verfügung stellen.
DaveParillo
Du hast recht. Aber wer hat gesagt, dass es mit einer Einzelkornsämaschine nicht sinnvoll ist? ;)
kolypto
2
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 herstellen.
Chronos
0

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 benötigen.

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

rauben
quelle
Wäre SFTP nicht viel einfacher und genauso (wenn nicht sogar sicherer)?
Mark Renouf
1
@rob: woher hast du das "FTP verwendet mehrere Verbindungen für Dateiübertragungen"? Einige Clients erlauben das Herunterladen mehrerer Streams von FTP, aber es gibt definitiv keine FTP-Client / Server-Kombination, die das Hochladen mehrerer Streams auf FTP ermöglicht.
Chronos
@Mark: Ja, SFTP wäre wahrscheinlich einfacher und ebenso sicher, aber ich weiß nicht, ob es mehrere Verbindungen zum Übertragen einer einzelnen Datei unterstützt. Vielen Dank für den Vorschlag. Ich werde es der Liste hinzufügen.
Rob
1
@chronos: Entschuldigung, es war nicht klar; Ich schlug vor, dass ZimmyDubZongyZongDubby FTP verwendet, um vom CentOS-Server auf den FreeBSD-Client herunterzuladen. Ich habe die Antwort aktualisiert und ausdrücklich "Downloads" anstelle von "Dateiübertragungen" angegeben.
Rob
-1

Lösung 1: Ich bin mir nicht sicher, ob dies in Ihrem Fall sinnvoll ist, aber Sie können ein übergreifendes Archiv erstellen (z. B. eine in Blöcke aufgeteilte Tarfile oder ein übergreifendes 7zip-Archiv) und dann mehrere Instanzen von rsync verwenden, um sie zu senden das Netzwerk und montieren / extrahieren sie auf der anderen Seite. Sie können 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 den zusätzlichen Aufwand für das Archivieren / Extrahieren der Dateien auf beiden Seiten haben.

Lösung 2: Eine bessere Lösung wäre, ein Skript oder Programm zu schreiben, das den großen Verzeichnisbaum anhand der Größe in Teilbäume aufteilt und diese Teilbäume dann parallel kopiert. Es kann die Sache vereinfachen, wenn Sie zuerst die gesamte Verzeichnisstruktur (ohne die Dateien) kopieren.

rauben
quelle
Möchte jemand die Ablehnung näher erläutern?
Rob
-1

Laufen Sie zwei Computer in einer vertrauenswürdigen Umgebung? Sie könnten Netcat versuchen . Auf der Serverseite:

tar -czf - ./yourdir | nc -l 9999

und auf dem Client:

nc your.server.net 9999 > yourdir.tar.gz

Sie können die Client-Verbindung einen SSH-Tunnel verwenden lassen:

ssh -f -L 23333:127.0.0.1:9999 [email protected] sleep 10; \
    nc 127.0.0.1 23333 > yourdir.tar.gz

Sogar eine ganze Partition kann so verschoben werden:

dd if=/dev/sda1 | gzip -9 | nc -l 9999

und auf dem Client:

nc your.server.net 9999 > mysda1.img.gz

.

Hinweis

Netcat ist nicht das sicherste Übertragungswerkzeug, aber in der richtigen Umgebung kann es schnell sein, weil es einen so geringen Overhead hat.

HowtoForge hat eine gute Beispielseite .

DaveParillo
quelle
Dies scheint eine generische Antwort zu sein, die seine Frage nicht beantwortet. Ich kann nicht sehen, wie eine Ihrer Lösungen parallel übertragen würde, nc ist
meines Wissens
Möglicherweise haben Sie recht, aber mit nc haben Sie die Kontrolle über die geöffneten Ports. Sie können 10.000 angeben, wenn Sie dazu geneigt sind.
DaveParillo