Warum ist rsync schneller als NFS?

40

Vor ein paar Tagen ist mir etwas Merkwürdiges aufgefallen (zumindest für mich). Ich ließ rsync laufen, das die gleichen Daten kopiert und sie anschließend zum NFS-Einfassung löscht, genannt /nfs_mount/TEST. Dies /nfs_mount/TESTwird gehostet / exportiert von nfs_server-eth1. Die MTU auf beiden Netzwerkschnittstellen beträgt 9000, der Switch dazwischen unterstützt auch Jumbo-Frames. In diesem rsync -av dir /nfs_mount/TEST/Fall erhalte ich eine Netzwerkübertragungsgeschwindigkeit von X MBit / s. In diesem rsync -av dir nfs_server-eth1:/nfs_mount/TEST/Fall erhalte ich eine Netzwerkübertragungsgeschwindigkeit von mindestens 2x MBit / s. Meine NFS-Mount-Optionen sind nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp.

Fazit: Beide Übertragungen laufen über dasselbe Netzwerksubnetz, dieselben Drähte, dieselben Schnittstellen, lesen dieselben Daten, schreiben in dasselbe Verzeichnis usw. Der einzige Unterschied besteht über NFSv3, der andere über rsync.

Der Client ist Ubuntu 10.04, der Server Ubuntu 9.10.

Wie kommt es, dass Rsync so viel schneller ist? Wie lässt sich NFS an diese Geschwindigkeit anpassen?

Vielen Dank

Bearbeiten: Bitte beachten Sie, dass ich mit rsync auf die NFS-Freigabe oder auf SSH auf den NFS-Server schreibe und dort lokal schreibe. Beide Male beginne ich rsync -avmit einem klaren Zielverzeichnis. Morgen werde ich es mit normaler Kopie versuchen.

Edit2 (zusätzliche Informationen): Die Dateigröße liegt zwischen 1 KB und 15 MB. Die Dateien sind bereits komprimiert, ich habe versucht, sie ohne Erfolg weiter zu komprimieren. Ich habe eine tar.gzAkte daraus gemacht dir. Hier ist das Muster:

  • rsync -av dir /nfs_mount/TEST/ = langsamste Übertragung;
  • rsync -av dir nfs_server-eth1:/nfs_mount/TEST/= schnellste rsync mit aktivierten Jumbo Frames; ohne Jumbo-Frames geht es etwas langsamer, aber immer noch deutlich schneller als direkt mit NFS;
  • rsync -av dir.tar.gz nfs_server-eth1:/nfs_mount/TEST/ = ungefähr das Gleiche wie sein Nicht-Tar.gz-Äquivalent;

Tests mit cpund scp:

  • cp -r dir /nfs_mount/TEST/= etwas schneller als rsync -av dir /nfs_mount/TEST/aber immer noch deutlich langsamer als rsync -av dir nfs_server-eth1:/nfs_mount/TEST/.
  • scp -r dir /nfs_mount/TEST/= am schnellsten insgesamt, leicht überwindet rsync -av dir nfs_server-eth1:/nfs_mount/TEST/;
  • scp -r dir.tar.gz /nfs_mount/TEST/ = ungefähr das Gleiche wie sein Nicht-Tar.gz-Äquivalent;

Schlussfolgerung, basierend auf diesen Ergebnissen: Für diesen Test gibt es keinen signifikanten Unterschied, wenn Sie eine große oder viele kleine tar.gz-Datei verwenden. Auch das Ein- und Ausschalten von Jumbo-Frames spielt kaum eine Rolle. cpund scpsind schneller als ihre jeweiligen rsync -avÄquivalente. Das direkte Schreiben in eine exportierte NFS-Freigabe ist erheblich langsamer (mindestens zweimal) als das Schreiben in dasselbe Verzeichnis über SSH, unabhängig von der verwendeten Methode.

Unterschiede zwischen cpund rsyncsind in diesem Fall nicht relevant. Ich beschloss zu versuchen cpund scpnur zu sehen, ob sie das gleiche Muster zeigen und sie machen - 2X Unterschied.

Da ich rsyncoder cpin beiden Fällen verwende, kann ich nicht verstehen, was NFS daran hindert, die Übertragungsgeschwindigkeit der gleichen Befehle über SSH zu erreichen.

Wie kommt es, dass das Schreiben auf die NFS-Freigabe 2X langsamer ist als das Schreiben über SSH an dieselbe Stelle?

Edit3 (NFS - Server / etc / exports - Optionen): rw,no_root_squash,no_subtree_check,sync. Die Kunden / proc / mounts zeigt: nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp.

Danke euch allen!

grs
quelle
Sollte dies für viele kleine Dateien und eine große Datei gleich sein?
Xiè Jìléi
@notpeter - fügte die Optionen im ursprünglichen Beitrag hinzu. Danke!
Grs
Ich erkenne, dass dies eine ziemlich alte Frage ist, aber ein Hauptunterschied zwischen SCP und rsync, der einen kleinen Unterschied in der Übertragungszeit ausmacht, ist die automatische Prüfsumme für die Dateiübertragung, die durchgeführt wird, um zu zeigen, dass die Datei korrekt übertragen wurde. Dies unterscheidet sich von der Option -c von rsync, die eine Prüfsumme verwendet, um zu überprüfen, ob eine Datei zwischen Hosts aktualisiert wurde. Wenn Sie nur neue Dateien kopieren, kommt dies nicht ins Spiel.
Rowan Hawkins

Antworten:

20

Möglicherweise ist es nicht die langsamere Übertragungsgeschwindigkeit, sondern die erhöhte Schreiblatenz. Versuchen Sie, die NFS-Freigabe asynchron anstatt synchron zu schalten, und prüfen Sie, ob dadurch die Geschwindigkeitslücke geschlossen wird. Wenn Sie rsync über ssh ausführen, schreibt der Remote-rsync-Prozess asynchron (schnell). Beim Schreiben auf die synchron gemountete nfs-Freigabe werden die Schreibvorgänge jedoch nicht sofort bestätigt: Der NFS-Server wartet, bis er die Festplatte (oder mit größerer Wahrscheinlichkeit den Controller-Cache) erreicht hat, bevor er eine Bestätigung an den NFS-Client sendet, dass das Schreiben erfolgreich war.

Wenn 'async' Ihr Problem behebt, denken Sie daran, dass beim Ausführen eines Schreibvorgangs auf dem NFS-Server möglicherweise inkonsistente Daten auf der Festplatte gespeichert werden. Solange dieser NFS-Mount nicht der primäre Speicher für diese (oder andere) Daten ist, ist das wahrscheinlich in Ordnung. Natürlich wären Sie im selben Boot, wenn Sie während / nach dem Ausführen von rsync-over-ssh den Stecker auf den nfs-Server ziehen würden (z. B. wenn rsync fertig ist, der nfs-Server abstürzt, nicht festgeschriebene Daten im Schreibcache jetzt verloren gehen) inkonsistente Daten auf der Festplatte belassen).

Obwohl dies bei Ihrem Test kein Problem darstellt (rsync neuer Daten), sollten Sie beachten, dass rsync over ssh erhebliche CPU- und E / A-Anforderungen an den Remote-Server stellen kann, bevor ein einzelnes Byte übertragen wird, während Prüfsummen berechnet und die Liste der erforderlichen Dateien erstellt wird Aktualisiert.

notpeter
quelle
1
Ich denke, diese Antwort ist die richtige. Wenn die Medien (Festplatten) auf den beiden Computern vergleichbar sind (gleiche RPM / Bandbreite / RAID-Konfiguration), können Sie anhand der umgekehrten Operation feststellen, ob dies der Fall ist: 'rsync -av / nfs_mount / TEST / dir 'Andernfalls ist das Ausschalten der Synchronisierung und der Versuch, es zu testen, der richtige Weg.
Slartibartfast
Ich habe schnelle Tests mit Sync vs Async durchgeführt und ich denke, dass diese Antwort gute Chancen hat, die richtige zu sein. Wenn Sie Async wählen, wird die Lücke deutlich geschlossen, aber es ist immer noch etwas langsamer als bei SSH. Ich werde weitere Tests machen und euch Bescheid geben. Danke vielmals!
Grs
3
Update: Meine neuen Tests haben einen signifikanten Unterschied in Bezug auf die Geschwindigkeit der Synchronisierung im Vergleich zur asynchronen NFS-Exportoption gezeigt. Mit NFS mit Async gemountet und rsync -av dir.tar.gz /nfs_mount/TEST/ich habe in etwa die gleiche Übertragungsgeschwindigkeit wie mit rsync -av dir nfs_server-eth1:/nfs_mount/TEST/. Ich werde diese Antwort als richtig markieren, bin aber gespannt, ob ich das Setup weiter verbessern kann. Danke! Gut gemacht, Peter!
Grs
22

NFS ist ein Freigabeprotokoll, während Rsync für Dateiübertragungen optimiert ist. es gibt viele Optimierungen, die getan werden kann , wenn man weiß von vornherein , dass Ihr Ziel - Dateien zu kopieren , um so schnell wie möglich statt den gemeinsamen Zugang zu ihnen.

Dies sollte helfen: http://en.wikipedia.org/wiki/Rsync

Massimo
quelle
2
Wenn Sie die Daten vorab kennen (was normalerweise der -e "ssh Compression=no"Fall ist ), können Sie die Komprimierung mit der Option , möglicherweise eine schnellere Übertragungsgeschwindigkeit zu erzielen, selektiv deaktivieren. Dies verhindert, dass Dateien komprimiert werden, die möglicherweise bereits komprimiert sind. Ich habe oft eine Beschleunigung bemerkt.
lsd
5
Die @ lsd - ssh - Komprimierung ist normalerweise standardmäßig deaktiviert und wird für rsync nicht empfohlen. Zulassen von rsync die Daten mit den Optionen zu komprimieren -z, --compress-levelund --skip-compresswird eine bessere Leistung tha mit einem komprimierten Transport bekommen.
JimB
5

Rsync ist ein Dateiprotokoll, das nur die geänderten Bits zwischen Dateien überträgt. NFS ist ein Protokoll für Remoteverzeichnisdateien, das jedes Mal alles verarbeitet ... in gewisser Weise wie ein SMB. Die beiden sind unterschiedlich und für unterschiedliche Zwecke. Sie können Rsync zum Übertragen zwischen zwei NFS-Freigaben verwenden.

pcunite
quelle
6
Ich fühle mich ein wenig schlecht, wenn Sie eine Abwertung vorgenommen haben, weil Sie technisch nichts Falsches gesagt haben, aber anscheinend haben Sie der Diskussion nichts hinzugefügt, und Sie sind eingetreten, nachdem viel spezifischere Informationen zur Verfügung gestellt wurden. Aus seinem Beitrag geht hervor, dass der Autor sich dieser Dinge bewusst war.
Slartibartfast
Ich dachte, ich wäre der zweite und der erste Beitrag, der erwähnte, dass beide Protokolle unterschiedliche Ziele verfolgen. Es ist okay, ich dachte, die erste Bearbeitung der Frage war ein bisschen dumm.
pcunite
3

Das ist interessant. Eine Möglichkeit, die Sie möglicherweise nicht berücksichtigt haben, ist der Inhalt / Typ der Datei, die Sie übertragen.

Wenn Sie viele kleine Dateien haben (z. B. E-Mails in einzelnen Dateien), kann die NFS-Effizienz beeinträchtigt werden, da nicht die gesamte MTU verwendet wird (möglicherweise ist dies bei TCP über UDP jedoch weniger wahrscheinlich).

Wenn Sie über stark komprimierbare Dateien / Daten, schnelle CPUs und ein Netzwerk verfügen, das nicht ganz so schnell wie die CPU ist (*), können Sie die Geschwindigkeit allein durch implizite Komprimierung über die SSH-Verbindung erhöhen.

Eine dritte Möglichkeit besteht darin, dass die Dateien (oder eine Version davon) bereits im Ziel vorhanden sind. In diesem Fall liegt die Beschleunigung darin, dass Sie durch das rsync-Protokoll die Dateien nicht übertragen müssen.

(*) In diesem Fall beziehe ich mich mit "Geschwindigkeit" auf die Rate, mit der die CPU Daten komprimieren kann, verglichen mit der Rate, mit der das Netzwerk Daten übertragen kann. Es dauert beispielsweise 5 Sekunden, um 5 MB über die Leitung, aber über die CPU zu senden kann diese 5 MB in 1 MB in 1 Sekunde komprimieren. In diesem Fall beträgt die Übertragungszeit komprimierter Daten etwas mehr als 1 Sekunde, während unkomprimierte Daten 5 Sekunden betragen.

Slartibartfast
quelle
Sehr gut! Die Dateien, mit denen ich teste, sind viele kleine Bilder. Sie variieren in der Größe. Ich muss noch einmal überprüfen, ob ich sie weiter komprimieren kann. Die Dateien existieren definitiv nicht am Ziel, da ich jedes Mal von vorne anfange. Morgen werde ich Tests mit einfachen cp -rvs machen rsyncund dann die Dateien komprimieren, um größere Dateien zu haben, um von der MTU zu profitieren. Vielen Dank!
Grs
1

Ich verwende auch -e "ssh Ciphers = arcfour", um den Durchsatz zu erhöhen.

ThorstenS
quelle
1
Benötigt ein "-o". Beispiel: "rsync -va -e" ssh -o Ciphers = arcfour "Quellenziel: / destination /"
Pete Ashdown
1

Wenn Sie nur alle Dateien von einem Ort an einen anderen kopieren möchten, ist tar / netcat die schnellste Option. Wenn Sie wissen, dass Ihre Dateien viele Leerzeichen (Nullen) enthalten, verwenden Sie die Option -i.

QUELLE: tar cvif - / pfad / zu / quelle | nc ZIEL PORTNUM ZIEL: cd / path / to / source && nc -l PORTNUM | tar xvif -

Wenn Sie wissen, dass Ihre Daten komprimierbar sind, verwenden Sie die Komprimierung für Ihre tar-Befehle -z -j -Ipixz

Ich bin ein Fan von pixz .. parallel xz, es bietet eine großartige Komprimierung und ich kann die Anzahl der CPUs, die ich habe, auf die Netzwerkbandbreite abstimmen. Wenn ich eine langsamere Bandbreite habe, verwende ich eine höhere Komprimierung, also warte ich mehr auf die CPU als auf das Netzwerk. Wenn ich ein schnelles Netzwerk habe, verwende ich eine sehr niedrige Komprimierung:

QUELLE: tar cvif - / pfad / zu / quelle | pixz -2 -p12 | nc DESTINATION PORTNUM # tar, ignoriere Nullen, Level 2 Pixz-Komprimierung mit 12 CPU-Kernen DESTINATION: nc -l PORTNUM | teer -Ipixz -xvif

Wenn Sie die Komprimierungsstufe und die Kerne je nach Dataset richtig einstellen, sollten Sie in der Lage sein, das Netzwerk nahe an der Sättigung zu halten und genügend Komprimierung vorzunehmen, damit der Engpass zur Festplatte wird (normalerweise die Schreibseite, wenn Lese- und Schreibplattensysteme vorhanden sind) das Gleiche).

Ich glaube, dass rsync Nullen überspringt, ähnlich wie tar dies mit dieser Option tut, und daher weniger Daten überträgt als NFS. NFS kann keine Annahmen über die Daten treffen und muss daher jedes Byte zusammen mit dem NFS-Protokoll-Overhead übertragen. Rsync hat einige Overhead ..

Netcat hat im Grunde genommen keine. Es sendet vollständige TCP-Pakete, die nur Daten enthalten, die Sie interessieren.

mit netcat müssen Sie wie mit scp immer alle Quelldaten senden. Sie können nicht wie mit rsync selektiv vorgehen, daher ist es nicht für inkrementelle Sicherungen oder ähnliches geeignet, aber zum Kopieren von Daten oder zum Archivieren.

user3186751
quelle
0

Haben Sie ein Dateisperr-Setup auf dem nfsshare? Sie könnten viel mehr Leistung erhalten, wenn dies deaktiviert wäre.

n8whnp
quelle
Wie kann ich herausfinden, ob es aktiviert ist oder nicht? Dies hier: docstore.mik.ua/orelly/networking_2ndEd/nfs/ch11_02.htm weist darauf hin, dass NFS v3 keine Dateisperrfunktionen besitzt.
Grs
-1

Ich gehe davon aus, dass die erhöhte Geschwindigkeit zumindest teilweise darauf zurückzuführen ist, dass "rsync src host: / path" einen lokalen Prozess auf dem Remote-Computer zum Senden / Empfangen gestartet hat, wodurch sich die E / A-Zahl halbiert.

Jimmy Selgen Nielsen
quelle