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
quelle
Antworten:
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 -Llr
wird dieselbe Festplattenaktivität ausgeführt, es werden jedoch niemals Dateidaten (nur Metadaten) gelesen. Die Zeit,ls -Llr
die 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-c
ist 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 :-).
-z
und konfigurieren Sie Ihren SSH mit und ohne Komprimierung. Zeit alle 4 Kombinationen, um zu sehen, ob eine von ihnen signifikant besser abschneidet als andere.quelle
Nein, das ist mit rsync nicht möglich und in anderer Hinsicht ziemlich ineffizient:
Normalerweise werden
rsync
nur Ä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.quelle
rsync
das tun Sie trotzdem nicht.Für die Synchronisierung einer großen Anzahl von Dateien (bei denen sich wenig geändert hat) lohnt es sich auch,
noatime
die Quell- und Zielpartitionen festzulegen. Dies spart Schreibzugriffszeiten auf die Festplatte für jede unveränderte Datei.quelle
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.
quelle