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 rsync
grundsätzlich zu kopieren /srv/data
in /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 sync
alle 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 , sync
eine while
Schleife 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.
Antworten:
Nach einigen weiteren Untersuchungen scheint dieses Problem weniger mit dem Kernel zu
rsync
tun zu haben , sondern vielmehr mit der Interaktion zwischen CIFS und.Soweit ich das beurteilen kann, geschieht Folgendes: Wenn
rsync
die 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 derclose
Syscall 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
rsync
das Kopieren einer Datei abgeschlossen ist, der gesamte Festplattenpuffer über das Netzwerk entleert werden muss, bevorrsync
das Lesen der nächsten Datei fortgesetzt werden kann.Eine Problemumgehung besteht darin, die CIFS-Freigabe mit der Option
cache=none
bereitzustellen, 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
rsync
eine 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=none
definitiv hilft, wenn viele kleine Dateien übertragen werden (von 10 MB / s auf 80 MB / s), aber wenn große Dateien (1 GB +) übertragen werden, wirdcache=none
die Ü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.quelle
rsync
nicht lesen Sie die Datei in einem anderen Thread (eigentlich anderer Prozess) , weil es so gestaltet ist , dass eine Kopiersync
auf 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 blockiertclose()
.rsync
würde besser abschneiden, wenn Siersync
auf dem Draht, nicht CIFS verwenden.rsync
auf dem NAS nicht ausführen können , darin besteht,rsync
über das Netzwerk (wiersync -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.rsync
auf 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.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.