max dateien pro verzeichnis in ext4

16

Ich verwalte eine Anwendung, die einen Dateispeicher enthält, in dem alle Dateien mit den Dateinamen gespeichert sind, die ihren md5-Summen entsprechen. Alle Dateien werden in einem Verzeichnis gespeichert. Derzeit gibt es Tausende, aber bald sollten Millionen von Dateien auf dem Server sein. Auf dem aktuellen Server wird Ubuntu 11.10 auf einem ext4-Dateisystem ausgeführt.

Jemand sagte mir, dass es nicht ratsam ist, viele Dateien in ein Verzeichnis zu kopieren, da dies die Suchzeit und die Zuverlässigkeit erheblich erhöht (er hatte eine Geschichte über die maximalen Dateien, auf die ein einziges Verzeichnis verweisen kann, was zu einer großen verknüpften Liste führt). Stattdessen schlug er vor, Unterverzeichnisse mit zB Unterzeichenfolgen des Dateinamens anzulegen. Dies wird jedoch einige Dinge in meiner Anwendung umständlicher machen.

Trifft dies immer noch zu, oder haben moderne Dateisysteme (z. B. ext4) effizientere Möglichkeiten, damit umzugehen, und skalieren auf natürliche Weise? Wikipedia enthält einige Details zu Dateisystemen, sagt jedoch nichts über die maximale Anzahl von Dateien pro Verzeichnis oder die Suchzeiten aus.

Jeroen
quelle

Antworten:

8

Die ext3und neueren Dateisysteme unterstützen die Indexierung von B-Tree- Verzeichnissen. Dies lässt sich sehr gut skalieren, solange Sie nur nach Namen hinzufügen, löschen und darauf zugreifen. Ich würde jedoch weiterhin empfehlen, die Verzeichnisse aufzuteilen. Andernfalls erstellen Sie eine gefährliche Sprengfalle für Werkzeuge ( updatedb, ls, du, usw.) , die andere Operationen in Verzeichnissen durchführen , die die Luft sprengen kann , wenn das Verzeichnis zu viele Einträge hat.

David Schwartz
quelle
8

Der Kern des Problems ist das Durchsuchen des Verzeichnisknotens für die gewünschte Datei. Einige Dateisysteme machen das besser als andere. Einige skalieren in der Nähe der Milliarden, aber wenn Sie nur ... 20K-Dateien haben, ist der Zugriff auf diese Dateien deutlich schneller. Darüber hinaus verursachen große Dateizahlen Probleme für bestimmte Tools und machen das Sichern / Wiederherstellen möglicherweise zu einem viel schwierigeren Problem.

Zufällig bin ich in unserer eigenen Entwicklung auf genau das gleiche Problem gestoßen (md5sum als Dateiname, Skalierung davon). Was ich unseren Entwicklern empfohlen habe, ist, die Saite in Stücke zu hacken. Sie gingen mit Gruppen von 4 Spielern, aber auf dem Dateisystem, auf dem wir zu der Zeit waren, erwiesen sich sogar viele als problematisch in Bezug auf die Leistung, so dass sie sich für die ersten 6 Drillinge auf eine Dreiergruppe aufteilten und den Rest als der Dateiname im Terminalverzeichnis.

Gruppe von 4: 4976/d70b/180c/6142/c617/d0c8/9d0b/bd2b.txt
Gruppe von 3:497/6d7/0b1/80c/614/2c6/17d0c89d0bbd2b.txt

Dies hat den Vorteil, dass die Verzeichnisgrößen klein gehalten werden. Da MD5sum ziemlich zufällig ist, werden ausgeglichene Verzeichnisbäume erstellt. Es ist unwahrscheinlich, dass dieses letzte Verzeichnis jemals mehr als ein paar Dateien abruft. Und es war nicht so schwer, an unserem Code zu arbeiten. Wir arbeiten mit mehreren Millionen Dateiprojekten, daher war uns die Skalierung sehr wichtig.

sysadmin1138
quelle
4
Seien Sie vorsichtig, wenn ein Angreifer über die Rechenressourcen verfügt, kann er absichtlich schädliche Daten erstellen, die im selben Verzeichnis landen. Ein Angreifer mit vernünftigen Ressourcen und der heutigen Technologie könnte Hashes mit denselben ersten 9 Hexadezimalstellen (und damit Kollisionen in den ersten drei Verzeichnisebenen) mit einer Rate von etwa einer alle zehn Minuten erstellen. Und natürlich können heute vollständige MD5-Hashes generiert werden.
David Schwartz
5

Moderne Dateisysteme können sehr gut mit sehr großen Verzeichnissen umgehen, sogar mit Millionen von Dateien. Konventionelle Werkzeuge dagegen nicht. Zum Beispiel würde das Auflisten eines so großen Verzeichnisses mit "ls" ziemlich lange dauern, da es normalerweise das gesamte Verzeichnis lesen und sortieren würde (obwohl Sie ls -f verwenden können, um das Sortieren zu vermeiden). Es werden erst Dateien angezeigt, wenn alle gelesen wurden. Das Aufteilen der Namen hilft in einigen Fällen, aber nicht in allen Fällen (z. B. muss bei der rsync-Replikation möglicherweise immer noch der gesamte Namensbaum erfasst werden).

Skaperen
quelle
-1

Könnte ich stattdessen die Verwendung einer SQL-Datenbank vorschlagen? Dies würde wahrscheinlich diese wahrgenommene Schwäche in Ihrer Anwendung in eine Stärke verwandeln.

RedScourge
quelle