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 :-).
- 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
-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.
- 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.