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/network1
ist 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 rsync
Daemons ü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 nc
ist ein unglaublich cooles Programm, das definitiv nicht für mich funktioniert. Ich habe das netcat-openbsd
und die netcat-traditional
Pakete 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 nc
arbeiten, hat alle meine NFS-Probleme behoben und meine Liebe zu NFS neu entfacht.
Die genaue Konfiguration, die ich verwendet habe ( 192.168.1.1
natü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 nc
in Aktion sehen, also hoffe ich, dass mir jemand hilft, diesen Prozess zu debuggen.
quelle
/bin/cp
oder gar kein NFS zu verwendennfsvers=2
) aus diesem Tutorial ( michaelminn.com/linux/home_network )Antworten:
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
):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). Diev
Flags 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 wiepv
in die Pipeline einfügen , um eine Fortschrittsanzeige zu erhalten:Sie können natürlich auch andere Dinge einfügen, z. B.
gzip -1
(und dasz
Flag auf der empfangenden Seite hinzufügen - dasz
Flag 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:
Für ältere ssh / sshd versuchen Sie
aes128-ctr
oderaes128-cbc
anstelle 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):Dann würden Sie auf dem Zielcomputer Folgendes ausführen:
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.
quelle
netcat
Ansatz? Wenn das Netzwerk Pakete verwirft, scheinen zufällige Teile der Dateien verloren zu gehen.tee
Befehle auf beiden Seiten in die Pipe einfügen , um die Prüfsummen zu berechnen.tar
Teil weist es an, das aktuelle Verzeichnis zu erstellen . Dies ist eigentlich kein Teil desnc
Befehls. 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 denWie? Oder TL; DR
Die schnellste Methode , die ich gefunden habe , ist eine Kombination aus
tar
,mbuffer
undssh
.Z.B:
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
mbuffer
oderbuffer
. Sie sind weitgehend ähnlich, haben abermbuffer
einige Vorteile. Die Standardpuffergröße beträgt 2 MB fürmbuffer
und 1 MB fürbuffer
. 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}?buffer
Plus 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,
tar
um sie zu einem einzigen Datenstrom zusammenzufassen. Wenn es sich um eine einzelne Datei handelt, können Sie diecat
E / A-Umleitung verwenden. Der Overhead vontar
vs.cat
ist statistisch unbedeutend, daher verwende ich immertar
(oderzfs -send
wo ich kann), es sei denn, es ist bereits ein Tarball . Weder von diesen wird garantiert, dass Sie Metadaten erhalten (und insbesonderecat
nicht). Wenn Sie Metadaten wünschen, lasse ich das als Übung für Sie.Schließlich ist die Verwendung
ssh
für einen Transportmechanismus sowohl sicher als auch mit sehr geringem Aufwand verbunden. Auch hier ist der Overhead vonssh
vs.nc
statistisch unbedeutend.quelle
openssl speed
Auf 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.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).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.
quelle