Ich habe einen Verzeichnisbaum, der viele kleine Dateien und eine kleine Anzahl größerer Dateien enthält. Die durchschnittliche Größe einer Datei beträgt ungefähr 1 Kilobyte. Der Baum enthält 210158 Dateien und Verzeichnisse (diese Nummer wurde durch Ausführen ermittelt find | wc -l
).
Ein kleiner Prozentsatz der Dateien wird mehrmals pro Woche hinzugefügt, gelöscht oder neu geschrieben. Dies gilt sowohl für kleine Dateien als auch für (wenige) größere Dateien.
Die Dateisysteme, die ich ausprobiert habe (ext4, btrfs), haben einige Probleme mit der Positionierung von Dateien auf der Festplatte. Über einen längeren Zeitraum werden die physischen Positionen von Dateien auf der Festplatte (rotierende Medien, keine Solid-State-Festplatten) immer zufälliger verteilt. Die negative Konsequenz dieser zufälligen Verteilung ist, dass das Dateisystem langsamer wird (z. B. 4-mal langsamer als ein frisches Dateisystem).
Gibt es ein Linux-Dateisystem (oder eine Methode zur Dateisystemwartung), das nicht unter diesem Leistungsabfall leidet und in der Lage ist, ein stabiles Leistungsprofil auf einem rotierenden Medium aufrechtzuerhalten? Das Dateisystem kann unter Fuse ausgeführt werden, es muss jedoch zuverlässig sein.
Antworten:
Performance
Ich habe einen kleinen Benchmark ( Quelle ) geschrieben, um herauszufinden, welches Dateisystem mit hunderttausenden kleiner Dateien am besten funktioniert:
lösche alle Dateien
Synchronisiere und lösche den Cache nach jedem Schritt
Ergebnisse (durchschnittliche Zeit in Sekunden, niedriger = besser):
Ergebnis:
Während Ext4 insgesamt eine gute Leistung zeigte, war ReiserFS beim Lesen von sequentiellen Dateien extrem schnell. Es stellte sich heraus, dass XFS mit vielen kleinen Dateien langsam ist - Sie sollten es für diesen Anwendungsfall nicht verwenden.
Fragmentierungsproblem
Die einzige Möglichkeit, zu verhindern, dass Dateisysteme Dateien über das Laufwerk verteilen, besteht darin, die Partition so groß zu halten, wie sie wirklich benötigt wird. Achten Sie jedoch darauf, die Partition nicht zu klein zu machen, um eine Fragmentierung der Dateien zu verhindern. Die Verwendung von LVM kann sehr hilfreich sein.
Weitere Lektüre
Das Arch Wiki hat einige großartige Artikel, die sich mit der Leistung des Dateisystems befassen:
https://wiki.archlinux.org/index.php/Beginner%27s_Guide#Filesystem_types
https://wiki.archlinux.org/index.php/Maximizing_Performance#Storage_devices
quelle
Ich benutze ReiserFS für diese Aufgabe, es ist speziell für den Umgang mit vielen kleinen Dateien gemacht. Es gibt einen leicht zu lesenden Text im funtoo Wiki.
quelle
Die Leistung von ext4 sinkt nach 1-2 Millionen Dateien in einem Verzeichnis. Siehe diese Seite http://genomewiki.ucsc.edu/index.php/File_system_performance, erstellt von Hiram Clawson an der UCSC
quelle
XFS ist bekannt dafür, dass es in solchen Situationen sehr gut funktioniert. Dies ist ein Teil des Grundes, warum wir es bei meiner Arbeit für unsere Mail-Stores verwenden (die Hunderttausende von Dateien in einem Verzeichnis enthalten können). Es hat eine bessere Fehlertoleranz als ReiserFS, wird viel häufiger verwendet und ist im Allgemeinen ein sehr ausgereiftes Dateisystem.
Darüber hinaus unterstützt XFS die Onlinedefragmentierung. Es wird jedoch eine Technik mit verzögerter Zuweisung verwendet, die zunächst zu einer geringeren Fragmentierung (im Vergleich zu anderen Dateisystemen) führt.
quelle
syslogd
Muster.) Zum Beispiel habe ich an meiner Seite bei einem XFS-über-MD-Setup gerade festgestellt, dass das Entfernen einer 1,5-GB-Datei 4,75 Minuten (!) Dauerte, während das Festplattenlaufwerk mit einer Schreibrate von 100 Transaktionen / s begrenzt war von mehr als 2 MB / s. Dies wirkt sich auch stark auf die Leistung anderer paralleler E / A-Vorgänge auf demselben Laufwerk aus, da das Laufwerk bereits ausgelastet ist. Ich habe so etwas noch nie in einem anderen FS gesehen (oder in Benchmarks getestet).