Maximale Anzahl von Dateien in einem ext3-Verzeichnis bei akzeptabler Leistung?

25

Ich habe eine Anwendung, die in ein ext3-Verzeichnis schreibt, das im Laufe der Zeit auf ungefähr drei Millionen Dateien angewachsen ist. Unnötig zu erwähnen, dass das Lesen der Dateiliste dieses Verzeichnisses unerträglich langsam ist.

Ich beschuldige ext3 nicht. Die richtige Lösung wäre gewesen, den Anwendungscode in Unterverzeichnisse schreiben zu lassen, ./a/b/c/abc.extanstatt ihn nur zu verwenden ./abc.ext.

Ich wechsle zu einer solchen Unterverzeichnisstruktur und meine Frage lautet einfach: Wie viele Dateien sollte ich ungefähr in einem ext3-Verzeichnis speichern, ohne die Leistung zu beeinträchtigen? Was ist deine Erfahrung?

Oder mit anderen Worten; Angenommen, ich muss drei Millionen Dateien in der Struktur speichern. Wie viele Ebenen sollte die ./a/b/c/abc.extStruktur tief sein?

Offensichtlich ist dies eine Frage, die nicht genau beantwortet werden kann, aber ich suche nach einem Schätzwert für das Baseballstadion.

knorv
quelle

Antworten:

12

Vorausgesetzt, Sie haben eine Distribution, die diese dir_indexFunktion unterstützt, können Sie problemlos 200.000 Dateien in einem einzigen Verzeichnis haben. Ich würde es jedoch bei ungefähr 25.000 halten, um sicher zu gehen. dir_indexVersuchen Sie ohne es bei 5.000 zu halten.

Ignacio Vazquez-Abrams
quelle
10

Seien Sie SEHR vorsichtig bei der Auswahl des Verzeichnisses. "a / b / c" klingt für mich wie ein Rezept für eine Katastrophe ...

Machen Sie nicht einfach blindlings eine mehrere Verzeichnisse tiefe Struktur, sagen wir 100 Einträge in der ersten Ebene, 100 Einträge in der zweiten Ebene, 100 Einträge in der dritten. Ich war dort, habe das gemacht, habe die Jacke bekommen und musste sie umstrukturieren, als die Leistung mit ein paar Millionen Dateien in den Crapper ging. :-)

Wir haben einen Client, der das Layout "Mehrere Verzeichnisse" erstellt hat und am Ende nur ein bis fünf Dateien pro Verzeichnis abgelegt hat, und dies hat sie getötet. 3 bis 6 Stunden, um ein "du" in dieser Verzeichnisstruktur zu machen. Der Retter hier war SSD, sie wollten diesen Teil ihrer Anwendung nicht umschreiben, und eine SSD hat diese Zeit von Stunden auf Minuten verkürzt.

Das Problem ist, dass für jede Ebene der Verzeichnissuche Suchvorgänge erforderlich sind und diese extrem teuer sind. Die Größe des Verzeichnisses ist ebenfalls ein Faktor, daher ist es ein großer Gewinn, wenn es kleiner als größer ist.

Zur Beantwortung Ihrer Frage, wie viele Dateien pro Verzeichnis vorhanden sind, habe ich 1.000 als "optimal" bezeichnet, aber eine Leistung von 10.000 scheint in Ordnung zu sein.

Was ich also empfehlen würde, ist eine Ebene von Verzeichnissen, wobei jede Ebene ein Verzeichnis mit 2 Zeichen ist, das aus Groß- und Kleinbuchstaben und den Ziffern besteht, für ungefähr 3800 Verzeichnisse in der obersten Ebene. Sie können dann 14 Millionen Dateien in diesen Unterverzeichnissen mit 3800 Dateien oder etwa 1.000 Dateien pro Unterverzeichnis für 3 Millionen Dateien speichern.

Ich habe eine solche Änderung für einen anderen Kunden vorgenommen, und es hat einen großen Unterschied gemacht.

Sean Reifschneider
quelle
6

Ich würde vorschlagen, dass Sie versuchen, verschiedene Verzeichnisgrößen mit einem Benchmarking-Tool wie dem Poststempel zu testen , da es viele Variablen wie die Cachegröße (sowohl im Betriebssystem als auch im Festplattensubsystem) gibt, die von Ihrer jeweiligen Umgebung abhängen.

Meine persönliche Faustregel lautet, eine Verzeichnisgröße von <= 20.000 Dateien anzustreben, obwohl ich mit bis zu 100.000 Dateien / Verzeichnis eine relativ anständige Leistung erzielt habe.

David Gelhar
quelle
3

Ich habe alle Dateien in Ordnern wie:

Uploads / [Datum] / [Stunde] /yo.png

und keine Leistungsprobleme haben.

Amy B
quelle
4
Und wie viele Dateien erhalten Sie pro Stunde?
Cascabel
2

Ich kann auf einem ziemlich leistungsfähigen Server mit viel Speicher unter einer anständigen Last bestätigen, dass 70.000 Dateien allerlei Chaos anrichten können. Ich habe einen Cache-Ordner mit 70.000 Dateien entfernt und Apache hat damit begonnen, neue Instanzen zu erzeugen, bis die maximale Größe 255 erreicht war und das System den gesamten freien Speicher verwendet hat (16 GB, obwohl die virtuelle Instanz möglicherweise niedriger war). In beiden Fällen ist es wahrscheinlich sehr umsichtig, den Wert unter 25.000 zu halten

jriskin
quelle
1

Meiner Erfahrung nach besteht der beste Ansatz darin, die Dateistruktur nicht im Voraus zu überarbeiten. Wie in mindestens einer anderen Antwort erwähnt, gibt es Dateisystemerweiterungen, die sich mit dem Leistungsproblem befassen.

Das Problem, auf das ich häufiger gestoßen bin, ist die Benutzerfreundlichkeit im administrativen Bereich. Die geringste Menge an Arbeit, die Sie tun können, um die Anzahl der Dateien in einem Verzeichnis zu verringern, ist wahrscheinlich der Ansatz, den Sie gerade benötigen.

sqrt (3_000_000) == 1732

Ein paar tausend Dateien in einem einzigen Verzeichnis klingen für mich vernünftig. Sei dein eigener Richter für deine eigene Situation. Um dies zu erreichen, versuchen Sie, die Dateien in eine einzelne Ebene von Hash-Verzeichnissen aufzuteilen, sodass die durchschnittliche Anzahl der Dateien pro Verzeichnis in etwa der Anzahl der Verzeichnisse entspricht.

Angesichts Ihrem Beispiel hierfür wäre ./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext, ....

Die Verbreitung von Dateien hängt stark von den tatsächlichen Dateinamen ab. Stellen Sie sich vor, Sie wenden diese Technik auf ein Verzeichnis mit jeweils einer Million Dateien an foobar???.txt. Es gibt Möglichkeiten, eine gleichmäßigere Verteilung zu erzielen, wie das Hashing basierend auf dem Wert einer bestimmten Anzahl von Bits aus der MD5-Summe jedes Dateinamens.

Sam Rodgers
quelle
1

Hmm, ich habe diesen Artikel kürzlich gelesen . Im Wesentlichen nutzen Sie die Verteilung Ihres bevorzugten Hashing-Algorithmus. Ich habe angefangen, mit den Zahlen zu spielen, eine mit MySQL signierte INT hat einen Maximalwert von 2147483647. Sie können auch die gewünschte Anzahl von Dateien pro Verzeichnis und Anzahl von Unterverzeichnissen variieren, um die endgültige Anzahl von Unterverzeichnissen / Dateien festzulegen. Aufteilung pro Verzeichnis für einen bestimmten Datensatz, aber es ist schwierig, empirische Belege für optimale Verzeichnis- / Dateiorganisationen zu finden. Dieser Artikel gibt einen Einblick in Leistungsunterschiede zwischen Dateisystemen (einige interessante Metriken), aber nichts über optimale Organisationen.

quickshiftin
quelle
0

Ich denke, Sie denken zu viel darüber nach. Wenn Sie sich sogar für eine einzelne zusätzliche Verzeichnisebene entschieden hätten und die Dinge gleichmäßig ausgleichen könnten, hätten Sie 1732 * -Verzeichnisse und 1732 Dateien pro Verzeichnis.

Wenn Sie nicht vorhaben, zig Milliarden von Dateien zu benötigen, könnten Sie so ziemlich eine Zahl zwischen 1000 und 100.000 auswählen und gute Ergebnisse erzielen.

* Quadratwurzel von 3 Millionen.

Eric Seppanen
quelle