Schnellere Synchronisierung eines riesigen Verzeichnisses, das nicht geändert wurde

11

Wir verwenden rsync, um Server zu sichern.

Leider ist das Netzwerk zu einigen Servern langsam.

Es dauert bis zu fünf Minuten, bis rsync feststellt, dass sich in großen Verzeichnissen nichts geändert hat. Diese riesigen Verzeichnisbäume enthalten viele kleine Dateien (ca. 80.000 Dateien).

Ich vermute, dass die rsync-Clients Daten für jede der 80k-Dateien senden.

Da das Netzwerk langsam ist, möchte ich vermeiden, 80.000-mal Informationen zu jeder Datei zu senden.

Gibt es eine Möglichkeit, rsync anzuweisen, eine Hash-Summe aus einem Unterverzeichnisbaum zu erstellen?

Auf diese Weise würde der rsync-Client nur wenige Bytes für einen riesigen Verzeichnisbaum senden.

Aktualisieren

Bisher ist meine Strategie zu verwenden rsync. Aber wenn hier ein anderes Werkzeug besser passt, kann ich wechseln. Beide (Server und Client) stehen unter meiner Kontrolle.

Update2

Es gibt 80k Dateien in einem Verzeichnis Baum . Jedes einzelne Verzeichnis enthält nicht mehr als 2k Dateien oder Unterverzeichnisse

Update3

Details zur Langsamkeit des Netzwerks:

time ssh einswp 'cd attachments/200 && ls -lLR' >/tmp/list
real    0m2.645s

Größe der tmp / list-Datei: 2MByte

time scp einswp:/tmp/list tmp/
real    0m2.821s

Fazit: scp hat die gleiche Geschwindigkeit (keine Überraschung)

time scp einswp:tmp/100MB tmp/
real    1m24.049s

Geschwindigkeit: 1,2 MB / s

guettli
quelle
1
Sie können sich über zsync informieren. Ich habe es nicht selbst verwendet, aber nach dem, was ich gelesen habe, werden die Metadaten auf der Serverseite vorab gerendert, und in Ihrem Fall werden möglicherweise nur die Übertragungen beschleunigt. Es könnte sich trotzdem lohnen, es zu testen. Darüber hinaus ist die einzige andere Lösung, die mir bekannt ist, die Synchronisation auf Blockebene in Echtzeit, die mit einigen San / Nas-Lösungen geliefert wird.
Aaron

Antworten:

33

Einige nicht verwandte Punkte:

80K sind viele Dateien.

80.000 Dateien in einem Verzeichnis? Kein Betriebssystem oder keine App bewältigt diese Situation standardmäßig sehr gut. Sie bemerken dieses Problem zufällig mit rsync.

Überprüfen Sie Ihre rsync-Version

Modernes rsync verarbeitet große Verzeichnisse viel besser als in der Vergangenheit. Stellen Sie sicher, dass Sie die neueste Version verwenden.

Sogar altes rsync verarbeitet große Verzeichnisse ziemlich gut über Links mit hoher Latenz ... aber 80k-Dateien sind nicht groß ... es ist riesig!

Die Speichernutzung von rsync ist jedoch direkt proportional zur Anzahl der Dateien in einem Baum. Große Verzeichnisse benötigen viel RAM. Die Langsamkeit kann auf einen Mangel an RAM auf beiden Seiten zurückzuführen sein. Führen Sie einen Testlauf durch, während Sie die Speichernutzung beobachten. Linux verwendet verbleibenden RAM-Speicher als Festplatten-Cache. Wenn Ihnen also der Arbeitsspeicher ausgeht, wird weniger Festplatten-Caching ausgeführt. Wenn Ihnen der Arbeitsspeicher ausgeht und das System Swap verwendet, ist die Leistung sehr schlecht.

Stellen Sie sicher, dass --checksum nicht verwendet wird

--checksum(oder -c) erfordert das Lesen jedes einzelnen Blocks jeder Datei. Sie können wahrscheinlich mit dem Standardverhalten auskommen, nur die Änderungszeiten zu lesen (im Inode gespeichert).

Teilen Sie den Job in kleine Stapel auf.

Es gibt einige Projekte wie Gigasync, die "die Arbeitslast durch Verwendung von Perl zur Rekursion des Verzeichnisbaums aufteilen und kleinere Listen von Dateien erstellen, die mit rsync übertragen werden sollen".

Der zusätzliche Verzeichnis-Scan wird einen hohen Overhead bedeuten, aber vielleicht ist es ein Nettogewinn.

OS-Standardeinstellungen werden für diese Situation nicht vorgenommen.

Wenn Sie Linux / FreeBSD / etc mit allen Standardeinstellungen verwenden, ist die Leistung für alle Ihre Anwendungen schrecklich. Die Standardeinstellungen setzen kleinere Verzeichnisse voraus, um RAM nicht für übergroße Caches zu verschwenden.

Optimieren Sie Ihr Dateisystem, um große Verzeichnisse besser verarbeiten zu können: Verlangsamen große Ordnergrößen die E / A-Leistung?

Schauen Sie sich den "Namei Cache" an

BSD-ähnliche Betriebssysteme verfügen über einen Cache, der das Nachschlagen eines Namens für den Inode beschleunigt (den "namei" -Cache "). Für jedes Verzeichnis gibt es einen namei-Cache. Wenn er zu klein ist, ist dies mehr ein Hindernis als eine Optimierung. Da rsync für jede Datei ein lstat () ausführt, wird für jede der 80.000 Dateien auf den Inode zugegriffen. Dies kann Ihren Cache sprengen. Erfahren Sie, wie Sie die Leistung des Dateiverzeichnisses auf Ihrem System optimieren.

Betrachten Sie ein anderes Dateisystem

XFS wurde für größere Verzeichnisse entwickelt. Siehe Dateisystem große Anzahl von Dateien in einem einzelnen Verzeichnis

Vielleicht sind 5 Minuten das Beste, was Sie tun können.

Berechnen Sie, wie viele Plattenblöcke gelesen werden, und berechnen Sie, wie schnell die Hardware so viele Blöcke lesen kann.

Vielleicht sind Ihre Erwartungen zu hoch. Überlegen Sie, wie viele Festplattenblöcke gelesen werden müssen, um eine Rsync ohne geänderte Dateien durchzuführen: Jeder Server muss das Verzeichnis lesen und einen Inode pro Datei lesen. Nehmen wir an, es wird nichts zwischengespeichert, da 80.000 Dateien wahrscheinlich Ihren Cache gesprengt haben. Nehmen wir an, es sind 80.000 Blöcke, um die Mathematik einfach zu halten. Das sind ungefähr 40 Millionen Daten, die in wenigen Sekunden lesbar sein sollten. Wenn jedoch zwischen den einzelnen Blöcken eine Festplattensuche erforderlich ist, kann dies viel länger dauern.

Sie müssen also ungefähr 80.000 Plattenblöcke lesen. Wie schnell kann Ihre Festplatte das? Wenn man bedenkt, dass dies eine zufällige E / A ist und kein langer linearer Lesevorgang, können 5 Minuten ziemlich gut sein. Das ist 1 / (80000/600) oder eine alle 7,5 ms gelesene Festplatte. Ist das schnell oder langsam für Ihre Festplatte? Das hängt vom Modell ab.

Benchmark gegen etwas Ähnliches

Eine andere Art, darüber nachzudenken, ist diese. Wenn sich keine Dateien geändert haben, ls -Llrwird dieselbe Festplattenaktivität ausgeführt, es werden jedoch niemals Dateidaten (nur Metadaten) gelesen. Die Zeit, ls -Llrdie zum Laufen benötigt wird, ist Ihre Obergrenze.

  • Ist rsync (ohne geänderte Dateien) deutlich langsamer als ls -Llr? Dann können die Optionen, die Sie für rsync verwenden, verbessert werden. Möglicherweise -cist aktiviert oder ein anderes Flag, das mehr als nur Verzeichnisse und Metadaten (Inode-Daten) liest.

  • Ist rsync (ohne geänderte Dateien) fast so schnell wie ls -Llr? Dann haben Sie rsync so gut wie möglich eingestellt. Sie müssen das Betriebssystem optimieren, RAM hinzufügen, schnellere Laufwerke erhalten, Dateisysteme ändern usw.

Sprich mit deinen Entwicklern

80k Dateien sind nur schlechtes Design. Sehr wenige Dateisysteme und Systemtools können sehr gut mit so großen Verzeichnissen umgehen. Wenn die Dateinamen abcdefg.txt sind, sollten Sie sie in abdc / abcdefg.txt speichern (beachten Sie die Wiederholung). Dies unterteilt die Verzeichnisse in kleinere, erfordert jedoch keine große Änderung des Codes.

Auch .... erwägen Sie die Verwendung einer Datenbank. Wenn Sie 80.000 Dateien in einem Verzeichnis haben, arbeiten Ihre Entwickler möglicherweise daran, dass sie wirklich eine Datenbank wollen. MariaDB oder MySQL oder PostgreSQL wären eine viel bessere Option zum Speichern großer Datenmengen.

Hey, was ist los mit 5 Minuten?

Schließlich sind 5 Minuten wirklich so schlecht? Wenn Sie dieses Backup einmal am Tag ausführen, sind 5 Minuten nicht viel Zeit. Ja, ich liebe Geschwindigkeit. Wenn jedoch 5 Minuten für Ihre Kunden "gut genug" sind, ist es für Sie gut genug. Wenn Sie kein schriftliches SLA haben, können Sie eine informelle Diskussion mit Ihren Benutzern führen, um herauszufinden, wie schnell die Backups voraussichtlich dauern.

Ich gehe davon aus, dass Sie diese Frage nicht gestellt haben, wenn die Leistung nicht verbessert werden musste. Wenn Ihre Kunden jedoch mit 5 Minuten zufrieden sind, erklären Sie den Sieg und fahren Sie mit anderen Projekten fort, die Ihre Bemühungen erfordern.

Update: Nach einigen Diskussionen haben wir festgestellt, dass der Engpass das Netzwerk ist. Ich werde 2 Dinge empfehlen, bevor ich aufgebe :-).

  • Versuchen Sie, durch Komprimierung mehr Bandbreite aus dem Rohr zu drücken. Die Komprimierung erfordert jedoch mehr CPU. Wenn Ihre CPU überlastet ist, kann dies die Leistung beeinträchtigen. Versuchen Sie rsync mit und ohne -zund konfigurieren Sie Ihren SSH mit und ohne Komprimierung. Zeit alle 4 Kombinationen, um zu sehen, ob eine von ihnen signifikant besser abschneidet als andere.
  • Beobachten Sie den Netzwerkverkehr, um festzustellen, ob Pausen vorliegen. Wenn es Pausen gibt, können Sie herausfinden, was sie verursacht, und dort optimieren. Wenn rsync immer sendet, sind Sie wirklich an Ihrem Limit. Sie haben folgende Möglichkeiten:
    • ein schnelleres Netzwerk
    • etwas anderes als rsync
    • Bewegen Sie die Quelle und das Ziel näher zusammen. Wenn Sie das nicht können, können Sie dann mit einem lokalen Computer synchronisieren und dann mit dem tatsächlichen Ziel synchronisieren? Dies kann Vorteile haben, wenn das System während der ersten Synchronisierung heruntergefahren werden muss.
TomOnTime
quelle
80K ist eine Menge von Dateien .: Es gibt 80k Dateien in einem Verzeichnis Baum . Jedes einzelne Verzeichnis enthält nicht mehr als 2k Dateien / Unterverzeichnisse.
Guettli
Überprüfen Sie Ihre rsync-Version: erledigt. Stellen Sie sicher, dass --checksum nicht verwendet wird: erledigt. Teilen Sie den Job in kleine Gruppen auf: Vielen Dank, ich werde mir Gigasync ansehen. Für diese Situation werden keine Standardeinstellungen für das Betriebssystem vorgenommen: Fertig (der Engpass ist das Netzwerk, nicht das Betriebssystem). Schauen Sie sich den "Namei-Cache" an: Fertig (es ist net, nicht OS). Stellen Sie sich ein anderes Dateisystem vor: wieder net, nicht OS. Vielleicht sind 5 Minuten das Beste, was Sie tun können: Ich denke, es könnte viel schneller sein. Sprechen Sie mit Ihren Entwicklern (verwenden Sie DB): Dies wäre eine riesige Veränderung. Vielleicht würde ein Dateisystem mit besserer Backup-Unterstützung das Problem lösen.
Guettli
2k Dateien pro Verzeichnis sind viel besser. Danke für das Update. Sie hatten nicht erwähnt, dass das Netzwerk langsam war. Ist es niedrige Bandbreite, hohe Latenz oder beides? rsync funktioniert normalerweise gut bei Verbindungen mit hoher Latenz (es wurde von jemandem entwickelt, der an seiner Promotion aus Australien im Umgang mit Computern in den USA arbeitet). Versuchen Sie, das "ls -lLR" über ssh und die Zeit zu machen, wie lange es dauert, das Ergebnis zu übertragen. "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list". Stellen Sie sicher, dass die Liste / tmp / auf dem lokalen Host erstellt wird.
TomOnTime
Ja, das Netzwerk ist langsam. Es ist schade.
Guettli
Wie langsam? Wie lange dauert es, wenn Sie eine 100M-Datei mit "scp" kopieren? Was ist die Ausgabe von "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list"?
TomOnTime
2

Nein, das ist mit rsync nicht möglich und in anderer Hinsicht ziemlich ineffizient:

Normalerweise werden rsyncnur Änderungsdaten und Dateigrößen verglichen. Ihr Ansatz würde es zwingen, den Inhalt aller Dateien zweimal (auf dem lokalen und dem Remote-System) zu lesen und zu überprüfen , um geänderte Verzeichnisse zu finden.

Sven
quelle
1
AFAIK rsync überprüft Zeit und Größe. Wenn beide übereinstimmen, wird die Datei nicht erneut übertragen (zumindest in den Standardeinstellungen). Es würde ausreichen, den Hash der Tupel (Dateiname, Größe, Zeit) zu senden. Der Inhalt muss nicht überprüft werden.
Guettli
Ja, Sie haben Recht, aber rsyncdas tun Sie trotzdem nicht.
Sven
1

Für die Synchronisierung einer großen Anzahl von Dateien (bei denen sich wenig geändert hat) lohnt es sich auch, noatimedie Quell- und Zielpartitionen festzulegen. Dies spart Schreibzugriffszeiten auf die Festplatte für jede unveränderte Datei.

Andy Beverley
quelle
Ja, die Option noatime ist sinnvoll. Wir benutzen es seit einigen Jahren. Ich denke, eine Alternative zu rsync wird benötigt.
Guettli
1

Verwenden Sie rsync im Daemon-Modus auf Serverseite, um den Listungs- / Prüfsummenprozess zu beschleunigen:

Beachten Sie, dass es nicht verschlüsselt ist, aber möglicherweise getunnelt werden kann, ohne die Verbesserung der Listungsleistung zu verlieren.

Auch wenn rsync eher Komprimierung als ssh ausführt, sollte dies die Leistung verbessern.

Gringo Suave
quelle