Schnelle Möglichkeit zum Kopieren einer großen Datei in ein LAN

24

Ich habe einige Probleme mit NFS und möchte versuchen, nur einfaches altes TCP zu verwenden.

Ich habe jedoch keine Ahnung, wo ich anfangen soll.

In Bezug auf die Hardware verwende ich ein Ethernet-Crossover-Kabel, um zwei Netbooks zu vernetzen.

Um sie zu vernetzen, tippe ich

$ sudo ifconfig eth0 192.168.1.1 up && ping -c 10 -s 10 192.168.1.2 && sudo /etc/init.d/nfs-kernel-server start

auf dem ersten Netbook und

$ sudo ifconfig eth0 192.168.1.2 up
$ ping -c 10 -s 10 192.168.1.1
$ mount /mnt/network1

auf dem zweiten

Wo /mnt/network1ist in / etc / fstab als angegeben

192.168.1.1:/home /mnt/network1 nfs noauto,user,exec,soft,nfsvers=2 0 0

sowie in /etc/exports(unter Verwendung der Syntax dieser Datei) auf dem ersten Netbook.

Das obige funktioniert gut, aber die Dateien und Verzeichnisse sind riesig. Die Dateien enthalten durchschnittlich etwa ein halbes Gigabyte pro Stück, und die Verzeichnisse sind alle zwischen 15 und 50 Gigabyte groß.

Ich benutze rsync, um sie zu übertragen, und der Befehl (auf 192.168.1.2) ist

$ rsync -avxS /mnt/network1 ~/somedir

Ich bin nicht sicher, ob es eine Möglichkeit gibt, meine NFS-Einstellungen zu optimieren, um große Dateien besser verarbeiten zu können, aber ich möchte sehen, ob die Ausführung eines rsyncDaemons über einfaches altes TCP besser funktioniert als rsyncüber NFS.

Wie richte ich ein ähnliches Netzwerk mit TCP ein?

AKTUALISIEREN:

Nachdem ich ein paar Stunden lang versucht hatte, mich aus dem Morast meiner eigenen Ignoranz herauszuholen (oder, wie ich gerne daran denke, mich an meinen eigenen Stiefeln hochzuziehen), hatte ich einige nützliche Fakten.

Aber zuallererst war es das, was mich auf diesen Hasenpfad geführt hat, anstatt einfach die aktuell beste Antwort zu akzeptieren: Es ncist ein unglaublich cooles Programm, das definitiv nicht für mich funktioniert. Ich habe das netcat-openbsdund die netcat-traditionalPakete ohne Glück ausprobiert .

Der Fehler, den ich auf dem empfangenden Computer erhalte ( 192.168.1.2), ist:

me@netbook:~$ nc -q 1 -l -p 32934 | tar xv
Can't grab 0.0.0.0:32934 with bind
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

route gibt:

me@netbook:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         dir-615         0.0.0.0         UG    0      0        0 wlan0
link-local      *               255.255.0.0     U     1000   0        0 eth0
192.168.0.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0

Aber hier ist die gute Nachricht: Das Festlegen der statischen IP-Adressen /etc/network/interfaces, mit denen ich angefangen habe, als ich versucht habe zu ncarbeiten, hat alle meine NFS-Probleme behoben und meine Liebe zu NFS neu entfacht.

Die genaue Konfiguration, die ich verwendet habe ( 192.168.1.1natürlich für das erste Netbook), war:

auto eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0

Mit diesen Einstellungen können sich die beiden Netbooks direkt nach dem Booten gegenseitig anpingen, ohne dass ein ifup.

Wie auch immer, ich würde es immer noch gerne ncin Aktion sehen, also hoffe ich, dass mir jemand hilft, diesen Prozess zu debuggen.

ixtmixilix
quelle
Wenn beide Verzeichnisse lokal sind, ist es besser, einfach nur normales /bin/cpoder gar kein NFS zu verwenden
Karlson,
1
Wenn Sie rsync für eine Datei ausführen, auf die über NFS zugegriffen wird, muss der gesamte Inhalt der Datei mindestens einmal über das Netzwerk kopiert werden. Sie benötigen keinen Daemon, um einen Client / Server-Rsync aufzurufen - führen Sie ihn einfach über ssh aus. (Es ist theoretisch möglich, das Remote-Ende über telnet / rsh aufzurufen, aber es ist ziemlich albern, einen solchen Dienst in der Praxis auszuführen - ssh fügt nicht viel Overhead hinzu.)
Symcbean
NFSv2 ist ziemlich alt. Welches Betriebssystem verwenden Sie?
Nils
das neueste Debian bzw. das neueste Ubuntu. Ich habe alle diese Befehle (einschließlich nfsvers=2) aus diesem Tutorial ( michaelminn.com/linux/home_network )
ixtmixilix
5
eigentlich fügt ssh eine ziemlich große Menge an Overhead hinzu, Krypto ist nicht billig. Bei normalen Internetgeschwindigkeiten spielt das keine Rolle, aber bei LAN-Verbindungen (oder in diesem Fall direkten Cross-Connect-Verbindungen) stellen Sie möglicherweise fest. Über Gigabit, außer auf den schnellsten Computern (oder solchen mit AES-NI-Anweisungen, wenn SSH diese verwendet), bin ich mir ziemlich sicher, dass es auffallen wird.
Derobert

Antworten:

43

Der schnelle Weg

Der schnellste Weg, um Dateien über ein LAN zu übertragen, ist wahrscheinlich nicht rsync, es sei denn, es gibt nur wenige Änderungen. rsync verbringt viel Zeit mit Prüfsummen, Berechnen von Differenzen usw. Wenn Sie wissen, dass Sie die meisten Daten trotzdem übertragen werden, gehen Sie wie folgt vor (Hinweis: Es gibt mehrere Implementierungen von netcat; lesen Sie das Handbuch für die richtigen Optionen. Insbesondere möchten Ihre möglicherweise nicht die -p):

user@dest:/target$ nc -q 1 -l -p 1234 | tar xv

user@source:/source$ tar cv . | nc -q 1 dest-ip 1234

Das verwendet netcat ( nc), um tar über eine rohe TCP-Verbindung an Port 1234 zu senden. Es gibt keine Verschlüsselung, Authentizitätsprüfung usw., daher ist es sehr schnell. Wenn Ihre Querverbindung mit Gigabit oder weniger ausgeführt wird, binden Sie das Netzwerk an. Wenn es mehr ist, werden Sie die Festplatte fixieren (es sei denn, Sie haben ein Speicherarray oder eine schnelle Festplatte). Die vFlags für tar sorgen dafür, dass Dateinamen sofort gedruckt werden (ausführlicher Modus). Bei großen Dateien ist das praktisch kein Overhead. Wenn Sie Unmengen kleiner Dateien erstellen würden, würden Sie dies deaktivieren. Sie können auch so etwas wie pvin die Pipeline einfügen , um eine Fortschrittsanzeige zu erhalten:

user@dest:/target$ nc -q 1 -l -p 1234 | pv -pterb -s 100G | tar xv

Sie können natürlich auch andere Dinge einfügen, z. B. gzip -1(und das zFlag auf der empfangenden Seite hinzufügen - das zFlag auf der sendenden Seite würde eine höhere Komprimierungsstufe als 1 verwenden, sofern Sie nicht die Umgebungsvariable GZIP festlegen). Obwohl gzip wahrscheinlich langsamer sein wird, es sei denn, Ihre Daten werden wirklich komprimiert.

Wenn Sie wirklich rsync brauchen

Wenn Sie wirklich nur einen kleinen Teil der geänderten Daten übertragen, ist rsync möglicherweise schneller. Vielleicht möchten Sie auch die -W/ --whole-file-Option prüfen, da ein sehr schnelles Netzwerk (wie ein Cross-Connect) schneller sein kann.

Der einfachste Weg, rsync auszuführen, ist über ssh. Sie sollten mit ssh-Chiffren experimentieren, um herauszufinden, welche am schnellsten ist. Es handelt sich entweder um AES, ChaCha20 oder Blowfish (obwohl bei der 64-Bit-Blockgröße von Blowfish einige Sicherheitsbedenken bestehen), je nachdem, ob Ihr Chip über Intels AES verfügt -NI Anweisungen (und Ihre OpenSSL verwendet sie). Auf einem ausreichend neuen ssh sieht rsync-over-ssh folgendermaßen aus:

user@source:~$ rsync -e 'ssh -c [email protected]' -avP /source/ user@dest-ip:/target

Für ältere ssh / sshd versuchen Sie aes128-ctroder aes128-cbcanstelle von [email protected].

ChaCha20 wäre [email protected](braucht auch ein neues ssh / sshd) und Blowfish wäre blowfish-cbc. OpenSSH erlaubt keine Ausführung ohne Verschlüsselung. Sie können natürlich die von Ihnen gewünschten rsync-Optionen anstelle von verwenden -avP. Natürlich können Sie auch in die andere Richtung gehen und rsync vom Zielcomputer (pull) anstatt vom Quellcomputer (push) ausführen.

Rsync schneller machen

Wenn Sie einen rsync-Daemon ausführen, können Sie den Krypto-Overhead beseitigen. Zuerst erstellen Sie eine Daemon-Konfigurationsdatei ( /etc/rsyncd.conf), zum Beispiel auf dem Quellcomputer (Einzelheiten finden Sie in der Manpage rsyncd.conf):

[big-archive]
    path = /source
    read only = yes
    uid = someuser
    gid = somegroup

Dann würden Sie auf dem Zielcomputer Folgendes ausführen:

user@dest:~$ rsync -avP source-ip::big-archive/ /target

Sie können dies auch umgekehrt tun (aber Sie müssen natürlich read only auf no setzen). Es gibt Optionen für die Authentifizierung usw. Weitere Informationen finden Sie auf der Manpage.

derobert
quelle
2
Dies ist eine hervorragende Antwort. Der andere ist auch großartig. Gibt es keine akzeptierte Antwort, nur weil der Fragesteller nicht zwischen ihnen wählen kann?
sudo
Wie robust ist der netcatAnsatz? Wenn das Netzwerk Pakete verwirft, scheinen zufällige Teile der Dateien verloren zu gehen.
Sudo
1
@sudo verwendet TCP, das bei Bedarf erneut überträgt. Es sollte also gegen Paketverlust, zufällige Beschädigung (sofern TCP- und Ethernet-Prüfsummen es erfassen) usw. in Ordnung sein. Natürlich ist es nicht sicher gegen Angriffe wie das Tunneln über ssh.
Derobert
1
@sudo Sie können alles auf einmal tun, indem Sie einige teeBefehle auf beiden Seiten in die Pipe einfügen , um die Prüfsummen zu berechnen.
Derobert
1
@TheStoryCoder Der Punkt im tarTeil weist es an, das aktuelle Verzeichnis zu erstellen . Dies ist eigentlich kein Teil des ncBefehls. Mit tar wird ein tar-Archiv erstellt, das an netcat weitergeleitet wird (und auf der anderen Seite wird netcat an tar weitergeleitet, um das Archiv zu extrahieren). Ich fürchte, ein Kommentar reicht nicht wirklich aus, um die Pfeifen zu erklären, aber hoffentlich reicht er aus, um Ihnen den
Einstieg zu erleichtern
17

Wie? Oder TL; DR

Die schnellste Methode , die ich gefunden habe , ist eine Kombination aus tar, mbufferund ssh.

Z.B:

tar zcf - bigfile.m4p | mbuffer -s 1K -m 512 | ssh otherhost "tar zxf -"

Auf diese Weise habe ich dauerhafte lokale Netzwerkübertragungen über 950 Mbit / s auf 1-Gbit-Verbindungen erreicht. Ersetzen Sie die Pfade in jedem tar-Befehl, damit sie für die Übertragung geeignet sind.

Warum? mbuffer!

Der größte Engpass bei der Übertragung großer Dateien über ein Netzwerk ist bei weitem die Festplatten-E / A. Die Antwort darauf ist mbufferoder buffer. Sie sind weitgehend ähnlich, haben aber mbuffereinige Vorteile. Die Standardpuffergröße beträgt 2 MB für mbufferund 1 MB für buffer. Größere Puffer sind mit größerer Wahrscheinlichkeit niemals leer. Wenn Sie eine Blockgröße wählen, die das niedrigste gemeinsame Vielfache der nativen Blockgröße auf dem Zieldateisystem und dem Zieldateisystem ist, wird die beste Leistung erzielt.

Buffering ist die Sache , die macht alle den Unterschied! Verwenden Sie es, wenn Sie es haben! Wenn Sie es nicht haben, holen Sie es sich! Mit (m}?bufferPlus ist alles besser als alles für sich. Es ist buchstäblich ein Allheilmittel für langsame Dateiübertragungen im Netzwerk.

Wenn Sie mehrere Dateien übertragen, verwenden Sie diese, tarum sie zu einem einzigen Datenstrom zusammenzufassen. Wenn es sich um eine einzelne Datei handelt, können Sie die catE / A-Umleitung verwenden. Der Overhead von tarvs. catist statistisch unbedeutend, daher verwende ich immer tar(oder zfs -sendwo ich kann), es sei denn, es ist bereits ein Tarball . Weder von diesen wird garantiert, dass Sie Metadaten erhalten (und insbesondere catnicht). Wenn Sie Metadaten wünschen, lasse ich das als Übung für Sie.

Schließlich ist die Verwendung sshfür einen Transportmechanismus sowohl sicher als auch mit sehr geringem Aufwand verbunden. Auch hier ist der Overhead von sshvs. ncstatistisch unbedeutend.

Bahamat
quelle
4
openssl speedAuf einem i7-3770 ergeben sich ~ 126–146 MB / s für Blowfish CBC und ~ 138–157 MB / s für AES CBC (dieser Chip verfügt über AES-NI-Anweisungen). Dann ~ 200–300 MB / s für sha256. Es kann also nur knapp 1 Gigabit drücken. Mit OpenSSH 6.1 oder höher können Sie AES GCM verwenden, was bei Blinding-Raten (370–1320 MB / s, abhängig von der Nachrichtengröße) möglich ist. Ich denke es ist nur wahr, dass OpenSSH wenig Overhead hat, wenn Sie 6.1+ auf einem Chip mit AES-NI und AES-GCM verwenden.
Derobert
1
Ugh, ich habe das in letzter Minute auf 6.1+ anstatt 6.2+ geändert, nachdem ich es noch einmal überprüft hatte. Das war natürlich ein Fehler, es hat sich seit 6.1 geändert . OpenSSH 6.2+ ist also die richtige Version. Und ich kann den Kommentar jetzt nicht mehr bearbeiten. Kommentare, die älter als 5 Minuten sind, müssen falsch bleiben. Wenn Sie OpenSSH 6.4 nicht verwenden, sehen Sie unter openssh.com/txt/gcmrekey.adv nach, wie es ohne Patch möglich ist. In der AES-GCM-Implementierung von OpenSSH ist ein ausnutzbarer Fehler aufgetreten .
Derobert
Der Overhead für ssh(oder Rsync über SSH) ist sehr, sehr wichtig. Ich habe ein NAS, das eine Intel Atom-CPU verwendet. Durch die SSH-Verschlüsselung wird die Übertragungsgeschwindigkeit ABSOLUT ANGEGEBEN. Ich bekomme konsistent <400 Mbit / s für RSA, manuelles Überschreiben auf RC4 bringt mir ~ 600 Mbit / s, und wenn ich rsync als Daemon verwende, läuft es mit der nativen Verbindungsgeschwindigkeit (> 900 Mbit / s, auf einem Gigabit) Verbindung).
Fake Name
Obwohl der Transport in vielen Situationen nicht kritisch ist, ist es absolut wichtig, ihn zu berücksichtigen, insbesondere wenn Sie nicht mit extrem hochwertiger Hardware arbeiten. In meinem Fall ist der Atom (es ist ein D525 mit 1,8 GHz Dual-Core) ein vollwertiger NAS mit viel Geschwindigkeit für kleine und mittlere Unternehmen.
Fake Name
2
Ich erhalte einen schwerwiegenden Fehler aufgrund der Parametrisierung von mbuffer: 'mbuffer: fatal: Gesamtspeicher muss größer als Blockgröße sein \ n Abgebrochen'. Ich vermute, es sollte etwas wie 'mbuffer -s 1K -m 512M' lauten, wobei das letzte 'M' für MByte steht (Quelle: man mbuffer)
Peter Lustig
1

Sie müssen nicht einmal TCP verwenden. AoE ist eine ATA-Implementierung über Ethernet, da Layer 2 ein Ansatz mit geringerem Overhead ist, bei dem der TCP / IP-Stack nicht bekannt ist. Es bietet Ihnen den schnellstmöglichen Transfer mit dem geringsten Overhead. ***

https://en.wikipedia.org/wiki/ATA_over_Ethernet

*** Wenn das Netzwerk der Engpass ist, stellen Sie sicher, dass Sie komprimierte Daten senden.

William Deans
quelle
Wow das ist harter Kern! :)
Ich frage