Lässt Linux gleichzeitig mit lokalen Festplattenlesevorgängen in das Netzwerkdateisystem schreiben

17

Zusammenfassung

Wie kann Linux so konfiguriert werden, dass es gleichzeitig von einer lokalen Festplatte / einem lokalen Dateisystem liest und auf eine Netzwerkfreigabe schreibt, anstatt zu lesen, während keine Daten über das Netzwerk übertragen werden, und diese Daten dann über das Netzwerk zu senden, während sich die lokale Festplatte befindet? untätig?

Es ist viel schneller, gleichzeitig zu lesen und zu schreiben, anstatt nur eine Operation und dann die andere abwechselnd auszuführen.

Einzelheiten

Ich verschiebe eine große Datenmenge von lokalen Festplatten auf einem Linux-Computer auf ein NAS-Gerät.

Ich verwende rsyncgrundsätzlich zu kopieren /srv/datain /mnt/nas, das ein CIFS montieren.

Es fing gut an, mit 100 MB / s zu lesen und mit 100 MB / s (Grenze des Gigabit-Netzwerks) auf den NAS zu schreiben, wobei sowohl gelesen als auch geschrieben wurde.

Ein paar Stunden später stelle ich jedoch fest, dass gerade von der lokalen Festplatte gelesen wird und der Lesevorgang abgebrochen wird, während auf den NAS geschrieben wird. Wenn dann keine Daten mehr auf den NAS geschrieben werden müssen, wird der Lesevorgang von der Festplatte fortgesetzt nochmal. Das Netzwerk ist inaktiv, während die Festplatte gelesen wird, und die Festplatte ist inaktiv, während das Netzwerk verwendet wird.

Es erübrigt sich zu erwähnen, dass das Lesen von 200 MB und das anschließende Schreiben von 200 MB viel länger dauert als das gleichzeitige Lesen und Schreiben von 200 MB.

Wie kann ich den Kernel so konfigurieren, dass er das frühere Lese- und Schreibverhalten beibehält, anstatt zwischen Lesen und Schreiben zu wechseln und jeweils nur einen Vorgang auszuführen?

Einige Beobachtungen: Wenn die lokale Festplatte mit 100 + MB / s liest, scheint alles parallel zu laufen, aber sobald die Festplatte langsamer wird (aus irgendeinem Grund nur noch 20 MB / s), ist dies der Zeitpunkt für das Lesen / Schreiben Umschaltung scheint zu passieren.

Ich kann auch syncalle paar Sekunden manuell ausführen , damit die Schreibvorgänge parallel zu den Lesevorgängen ablaufen (obwohl dies offensichtlich bei reduzierten Geschwindigkeiten der Fall ist). Es scheint jedoch nicht die richtige Lösung zu sein , synceine whileSchleife zu erstellen, die alle fünf Sekunden ausgeführt wird.

Der Kernel scheint etwa 1 GB Daten zwischenzuspeichern und sie dann so schnell wie möglich über das Netzwerk auszuspeichern. Das ist in Ordnung. Ich verstehe nur nicht, warum die langsame Festplatte nicht mehr gelesen werden muss, während die Daten über das Internet gesendet werden Netzwerk.

Bösartig
quelle
1
Die meisten Unix-Tools sind in diesem Sinne absolut nicht für Bandbreite optimiert, nicht für Rsync, nicht einmal für einen einfachen CP. Es handelt sich um Single-Threaded-Apps, die blockierende E / A verwenden.
Peter sagt, dass er Monica
1
Etwa 100 MB / s sind auch das, was Sie von modernen, gebräuchlichen Festplatten mit 7200 U / min bei rein sequentieller Auslastung erwarten können. Wenn Sie mit der Suche beginnen, z. B. um Metadaten zu aktualisieren oder wenn das Dateisystem fragmentiert ist, kommt es zu einem Ausfall, da Sie dann an IOPS gebunden sind.
ein
Kann man rsync auf dem NAS installieren?
Jasen

Antworten:

27

Nach einigen weiteren Untersuchungen scheint dieses Problem weniger mit dem Kernel zu rsynctun zu haben , sondern vielmehr mit der Interaktion zwischen CIFS und.

Soweit ich das beurteilen kann, geschieht Folgendes: Wenn rsyncdie Zieldatei geschlossen wird, sorgt CIFS (und möglicherweise ein beliebiges Netzwerkdateisystem) dafür, dass die Datei vollständig gelöscht und auf die Remote-Festplatte geschrieben wird, bevor der closeSyscall zurückkehrt. Damit wird sichergestellt, dass nach dem erfolgreichen Abschluss des Schließvorgangs die Datei vollständig gespeichert wurde und kein Risiko für weitere Fehler besteht, die zu Datenverlust führen können.

Wenn dies nicht geschehen wäre, könnte eine Anwendung eine Datei schließen und den Speichervorgang für erfolgreich halten. Später (möglicherweise aufgrund eines Netzwerkproblems) könnten die Daten dann doch nicht geschrieben werden Es ist zu spät für die Anwendung, etwas dagegen zu unternehmen, beispielsweise den Benutzer zu fragen, ob er die Datei stattdessen an einem anderen Ort speichern möchte.

Diese Anforderung bedeutet, dass jedes Mal, wenn rsyncdas Kopieren einer Datei abgeschlossen ist, der gesamte Festplattenpuffer über das Netzwerk entleert werden muss, bevor rsyncdas Lesen der nächsten Datei fortgesetzt werden kann.

Eine Problemumgehung besteht darin, die CIFS-Freigabe mit der Option cache=nonebereitzustellen, mit der diese Funktion deaktiviert wird und alle E / A-Vorgänge direkt zum Server geleitet werden. Dies beseitigt das Problem und ermöglicht die parallele Ausführung von Lese- und Schreibvorgängen. Ein Nachteil dieser Lösung ist jedoch, dass die Leistung etwas geringer ist. In meinem Fall sinkt die Netzwerkübertragungsgeschwindigkeit von 110 MB / s auf 80 MB / s.

Dies kann bedeuten, dass beim Kopieren großer Dateien die Leistung möglicherweise durch das abwechselnde Lese- / Schreibverhalten verbessert wird. Bei vielen kleineren Dateien führt das Deaktivieren des Caches bei jedem Schließen einer Datei zu weniger Cache-Löschvorgängen, sodass die Leistung dort möglicherweise steigt.

Es scheint, dass rsynceine Option zum Schließen der Datei-Handles in einem anderen Thread erforderlich ist, damit die nächste Datei gelesen werden kann, während die letzte noch geleert wird.

BEARBEITEN: Ich habe bestätigt, dass dies cache=nonedefinitiv hilft, wenn viele kleine Dateien übertragen werden (von 10 MB / s auf 80 MB / s), aber wenn große Dateien (1 GB +) übertragen werden, wird cache=nonedie Übertragung von 110 MB / s auf die gleichen 80 MB / s gesenkt. Dies deutet darauf hin, dass es bei der langsamen Übertragung von vielen kleinen Dateien weniger um die Suche nach dem Quelldatenträger geht, sondern vielmehr darum, dass alle kleinen Dateien so viele Cache-Räumungen erhalten.

Bösartig
quelle
2
Das ist ein sehr interessantes Problem, und danke für das Posten der Erklärung. rsyncnicht lesen Sie die Datei in einem anderen Thread (eigentlich anderer Prozess) , weil es so gestaltet ist , dass eine Kopie rsyncauf jeder Seite des Netzes ausgeführt wird , wenn auch in Ihrem Fall beiden Kopien auf der gleichen Seite sind (und das Dateisystem versteckt ich die Tatsache, dass es ein Netzwerk gibt). Ich denke, es hilft nicht, weil der Reader-Prozess die Pipe sehr, sehr schnell füllt, während der Writer-Prozess einen blockiert close(). rsyncwürde besser abschneiden, wenn Sie rsyncauf dem Draht, nicht CIFS verwenden.
Celada
1
Ich würde mir vorstellen, dass eine andere Lösung, die Sie rsyncauf dem NAS nicht ausführen können , darin besteht, rsyncüber das Netzwerk (wie rsync -a files localhost:/dest/path) zu arbeiten und gleichzeitig künstlich einen riesigen Puffer (wie mindestens mehrere Megabyte) in die Netzwerkverbindungen einzufügen. Ich bin mir nicht sicher, wie der beste Hack dafür aussehen würde.
Celada
@ Celada: Danke! Ja, ich stelle mir vor, rsyncauf der NAS-Box selbst zu laufen, würde das Problem ebenfalls umgehen. Etwas komplexer (seltsame NAS-Berechtigungen, das Löschen von Symlinks usw.), aber wenn ich ein wenig mehr Daten zum Kopieren hätte, lohnt sich meiner Meinung nach die Zeitinvestition dafür.
Malvineous
2
Möglicherweise ohne Bezug zu Ihrem Fall: Ich hatte vor einigen Jahren ein ähnliches Problem beim Schreiben der Ausgabe dump(8)auf ein NAS, das über NFS bereitgestellt wurde. Zu der Zeit stellte ich fest, dass das Problem die CPU auf dem NAS maximal beansprucht, da der NFS-Server und eine Firewall auf dem NAS zusammenwirken (die Box war nicht gerootet und die Firewall konnte nicht vollständig deaktiviert werden) das Webinterface). Das Problem ging weg, als wir den NAS durch einen alten PC ersetzten. FWIW.
Satō Katsura
@SatoKatsura: Auf jeden Fall eine Möglichkeit für ältere NAS-Geräte, obwohl ich mir in diesem Fall vorstelle, dass Sie eine langsamere Gesamtübertragung sehen würden als eine solche mit Bursts? Mein NAS ist ein Dual-Core-Atom (~ 2 GHz), der bei einer maximalen CPU-Auslastung von 30% eine Gigabit-Netzwerkkarte ohne Jumbo-Frames nutzt.
Malvineous