Wie wirkt sich die Anzahl der Unterverzeichnisse auf die Lese- / Schreibleistung des Laufwerks unter Linux aus?

11

Ich habe ein EXT3-formatiertes Laufwerk auf einem Linux CentOS-Server. Dies ist ein Web-App-Datenlaufwerk und enthält ein Verzeichnis für jedes Benutzerkonto (es gibt 25.000 Benutzer). Jeder Ordner enthält Dateien, die dieser Benutzer hochgeladen hat. Insgesamt verfügt dieses Laufwerk über rund 250 GB Daten.

Beeinflusst die Strukturierung des Laufwerks mit all diesen Verzeichnissen die Lese- / Schreibleistung des Laufwerks? Hat dies Auswirkungen auf einen anderen Leistungsaspekt, den ich nicht kenne?

Gibt es irgendetwas an sich Falsches oder Schlechtes daran, Dinge auf diese Weise zu strukturieren? Vielleicht nur die falsche Wahl des Dateisystems?

Ich habe kürzlich versucht, zwei Datenlaufwerke zusammenzuführen, und festgestellt, dass EXT3 auf 32.000 Unterverzeichnisse beschränkt ist. Das hat mich gefragt, warum. Es scheint albern, dass ich es so erstellt habe, wenn man bedenkt, dass jede Datei eine eindeutige ID hat, die einer ID in der Datenbank entspricht. Leider ...

T. Brian Jones
quelle
4
Gibt es einen Grund, warum Sie so etwas nicht tun können homes/u/username, homes/j/joeblow,homes/s/somebody,...?
Zoredache
1
Diese von @Zoredache aufgelistete Gruppierungsmethode wurde früher immer verwendet (auf viel kleineren Computern mit einer großen Anzahl von Benutzern).
Brian Knoblauch
@ Zoredache Das sieht aus wie B-Tree-Hashing für arme Männer. Dies ist jedoch langsamer, da es nicht im Kernel-Speicher ausgeführt wird und etwas mehr Festplattenlesevorgänge benötigt und möglicherweise nicht gut ausbalanciert ist. Der Baum von ext3 und ext4 ist besser. Siehe auch: ext2.sourceforge.net/2005-ols/paper-html/node3.html
Mircea Vutcovici
Sie sollten eine Antwort markieren ...
ewwhite

Antworten:

7

Auf diese Weise können Sie die Optionen in Ihrer Umgebung einfach selbst testen und die Ergebnisse vergleichen. Ja, die Leistung wirkt sich negativ aus, wenn die Anzahl der Verzeichnisse zunimmt. Ja, andere Dateisysteme können helfen, diese Hindernisse zu umgehen oder die Auswirkungen zu verringern.

Das XFS-Dateisystem ist für diese Art von Verzeichnisstruktur besser geeignet . ext4 ist heutzutage wahrscheinlich in Ordnung. Der Zugriff und die Vorgänge im Verzeichnis werden einfach langsamer, wenn die Anzahl der Unterverzeichnisse und Dateien zunimmt. Dies ist unter ext3 sehr ausgeprägt und unter XFS weniger.

ewwhite
quelle
XFS ist definitiv das Dateisystem für diese Struktur, da es Millionen von Unterverzeichnissen unterstützt und die Leistung nicht wie bei EXT3 beeinträchtigt zu sein scheint, wo die Auswirkungen erheblich sind ... basierend auf einem Diagramm, das ich gesehen habe und das ich jetzt nicht finden kann.
T. Brian Jones
6

Die Antwort ist nicht so einfach wie die Wahl des Dateisystems. Vernünftige Dateisysteme verwenden vor langer Zeit keine linearen Listen mehr für Verzeichnisse, was bedeutet, dass die Anzahl der Einträge in einem Verzeichnis keinen Einfluss auf die Dateizugriffszeit hat.

außer wenn es so ist.

Tatsächlich bleibt jede Operation schnell und effizient, unabhängig von der Anzahl der Einträge. Einige Aufgaben erfordern jedoch eine wachsende Anzahl von Operationen. Offensichtlich lsdauert das Ausführen eines einfachen Vorgangs lange, und Sie sehen nichts, bis alle Inodes gelesen und sortiert wurden. Tun ls -U(unsortiert) hilft ein wenig, weil Sie sehen können, dass es nicht tot ist, aber die Zeit nicht wahrnehmbar verkürzt. Weniger offensichtlich ist, dass jede Wildcard-Erweiterung jeden Dateinamen überprüfen muss, und es scheint, dass in den meisten Fällen auch der gesamte Inode gelesen werden muss.

Kurz gesagt: Wenn Sie sicher sein können, dass keine Anwendung (einschließlich Shell-Zugriff) jemals einen Wildard verwenden wird, können Sie riesige Verzeichnisse ohne Reue erhalten. Wenn jedoch einige Platzhalter im Code lauern, sollten Sie die Verzeichnisse besser unter jeweils tausend Einträgen halten.

bearbeiten :

Alle modernen Dateisysteme verwenden gute Datenstrukturen für große Verzeichnisse, sodass eine einzelne Operation, die den Inode einer bestimmten Datei finden muss, selbst in riesigen Verzeichnissen recht schnell ist.

Die meisten Anwendungen führen jedoch nicht nur Einzeloperationen aus. Die meisten von ihnen führen entweder ein vollständiges Verzeichnis oder einen Platzhalterabgleich durch. Diese sind auf jeden Fall langsam, da alle Einträge gelesen werden müssen.

Beispiel: Nehmen wir an, Sie haben ein Verzeichnis mit einer Million Dateien mit den Namen 'foo-000000.txt' bis 'foo-999999.txt' und eine einzige 'natalieportman.jpeg'. Diese werden schnell sein:

  • ls -l foo-123456.txt
  • open "foo-123456.txt"
  • delete "foo-123456.txt"
  • create "bar-000000.txt"
  • open "natalieportman.jpeg"
  • create "big_report.pdf"

diese werden scheitern, aber auch schnell scheitern:

  • ls -l bar-654321.txt
  • open bar-654321.txt
  • delete bar-654321.txt

Diese werden langsam sein, selbst wenn sie nur sehr wenige Ergebnisse liefern. Selbst diejenigen, die fehlschlagen, schlagen fehl, nachdem alle Einträge gescannt wurden:

  • ls
  • ls foo-1234*.txt
  • delete *.jpeg
  • move natalie* /home/emptydir/
  • move *.tiff /home/seriousphotos/
Javier
quelle
5

Stellen Sie zunächst sicher, dass für die ext3-Partition das dir_indexFlag gesetzt ist.

sudo dumpe2fs /dev/sdaX |grep --color dir_index

Wenn es fehlt, können Sie es aktivieren. Sie müssen das Dateisystem aushängen und dann Folgendes ausführen:

sudo tune2fs -O dir_index /dev/sdaX
sudo e2fsck -Df /dev/sdaX

Hängen Sie dann das Dateisystem ein.

Mircea Vutcovici
quelle
2

Es macht keinen Unterschied, bis Sie das ext3 32.000 Namen pro Verzeichnislimit erreicht haben. Ein Upgrade auf ext4 kann dies ebenso umgehen wie die anderen Vorteile von ext4.

psusi
quelle
2

Je mehr Einträge (Dateien und Verzeichnisse) Sie in einem einzelnen Verzeichnis haben, desto langsamer wird der Zugriff. Dies gilt für jedes Dateisystem, obwohl einige schlechter sind als andere.

Eine bessere Lösung besteht darin, eine Verzeichnishierarchie wie folgt zu erstellen:

/users/a/aaron/
/users/a/andrew/
/users/b/betty/
/users/b/brian/

Und wenn Sie immer noch eine bessere Leistung benötigen, können Sie mehrere Ebenen erweitern:

/users/a/a/aaron
/users/a/n/anna
/users/a/n/andrew

Die meisten Mailsysteme verwenden diesen Trick mit ihren Mail-Warteschlangendateien.

Außerdem habe ich festgestellt, dass bei einigen Dateisystemen der Zugriff auf dieses Verzeichnis nur langsam ist, wenn in der Vergangenheit viele Einträge in einem Verzeichnis vorhanden waren. Führen Sie ein ls -ldVerzeichnis aus, um die Größe des Verzeichniseintrags selbst anzuzeigen. Wenn es mehrere MB oder mehr sind und das Verzeichnis relativ leer ist, erhalten Sie möglicherweise eine schlechte Leistung. Benennen Sie das Verzeichnis aus dem Weg, erstellen Sie ein neues mit demselben Namen, denselben Berechtigungen und demselben Besitz und verschieben Sie dann den Inhalt Ihres alten Verzeichnisses in das neue. Ich habe diesen Trick oft verwendet, um Mailserver, die vom Dateisystem verlangsamt wurden, erheblich zu beschleunigen.

tylerl
quelle
2

Ich habe kürzlich einen Speicherserver entwickelt, der Zehntausende von Dateien und Hunderttausende von Verzeichnissen erstellen musste. Ich habe XFS mit ext4 und reiserfs verglichen. Ich fand, dass ext4 in meinem Fall etwas schneller als XFS war. Reiser war interessant, hatte aber Einschränkungen, die fallen gelassen wurden. Ich fand auch, dass ext4 deutlich schneller war als ext3.

Wenn Sie viele Dateien pro Verzeichnis erhalten, beginnt die Dateiöffnungszeit zu leiden. Datei-E / A nicht. Die Löschzeit der Datei leidet ebenfalls. Bei ext4 ist es jedoch nicht zu langsam. Es ist jedoch unter ext3 ziemlich auffällig. XFS und ext4 sind hier ziemlich schnell.

Als ich mir XFS das letzte Mal angesehen und die Vor- und Nachteile der Verwendung von XFS gegenüber ext4 abgewogen habe, habe ich Berichte über Datenverluste mit XFS gefunden. Ich bin mir nicht sicher, ob dies immer noch ein Problem ist oder ob es jemals war, aber es hat mich nervös genug gemacht, um klar zu steuern. Da ext4 die Standard-fs in Ubuntu ist, hat es sich leicht gegen XFS durchgesetzt.

Zusätzlich zu dem Vorschlag von tylerl, der aus Managementsicht hilfreich ist, schlage ich vor, dass Sie ein Upgrade auf ext4 durchführen können. Das Limit pro Verzeichnis beträgt 64000 Einträge mit ext4

Ein weiterer Vorteil ist, dass die fsck-Zeit wesentlich schneller ist. Ich hatte noch nie Probleme mit Korruption.

Das Schöne an ext4 ist, dass Sie ein ext3-Volume an ext4 mounten können, um es auszuprobieren. Siehe: Migrieren eines Live-Systems von ext3 zu ext4-Dateisystem

Ein Zitat von diesem Link:

Wenn Sie nicht von den Einschränkungen von ext3 betroffen sind und nicht bereit sind, Risiken einzugehen, lohnt es sich möglicherweise nicht. Auf der anderen Seite kann Ihr System nach erfolgreichem Abschluss des Migrationsvorgangs schneller ausgeführt werden, verkürzte Dateisystemprüfungen durchlaufen und die Zuverlässigkeit ohne negative Auswirkungen erhöhen.

Also, probieren Sie es aus. Schlagen Sie vor, zuerst ein Backup zu erstellen.

Matt
quelle
1

Es wird definitiv einige Konsequenzen daraus geben. Das primäre wird IO Lesen / Schreiben sein. Darüber hinaus ist es nur eine sehr beängstigende Art, mit dieser Art von Daten umzugehen (in dieser Größenordnung).

Öffentliches Zertifikat
quelle
Wäre es weniger beängstigend, alle Dateien im selben Verzeichnis abzulegen?
T. Brian Jones
Ich nehme an, es hängt von Ihrer Definition von beängstigend ab. Die Tatsache, dass Sie eine DB verwenden, um all dies zu koordinieren, scheint weniger beängstigend. Ich würde sicherlich versuchen, zumindest die Verzeichnisstruktur auf eine Alternative zu reduzieren? Dh, basierend auf Datum, Gruppierung usw.
Publiccert
Sie sind nach Benutzer gruppiert. Gibt es Beispiele für andere Möglichkeiten, wie Sie große Dateisysteme wie dieses für eine Web-App strukturiert gesehen haben?
T. Brian Jones
Die meisten Systeme, auf die ich gestoßen bin, verwenden EXT3 leider nicht. Ich denke, das könnte Ihre erste Hürde sein.
Publiccert
Falsch. Sobald eine Datei geöffnet und ein offenes Handle erhalten wurde, ist die E / A für die Datei nicht mehr betroffen. Die Öffnungszeit der Datei ist jedoch betroffen.
Matt
1

In der Vergangenheit habe ich XFS verwendet, um die Grenzen von Ext3 mit Erfolg zu umgehen.

Die erste Auflistung der Inhalte des Dateisystems dauert eine Weile, bis das System alle Verzeichnis- / Dateiinformationen gelesen hat. Zusätzliche Operationen sind schneller, da die Informationen im Kernel jetzt zwischengespeichert sind.

Ich habe gesehen, wie Administratoren regelmäßig 'find / somepath 2> & 1> / dev / null' in cron ausführen, um den Cache aktiv zu halten, was zu einer besseren Leistung führt.

David
quelle
1

Ich habe einige Fragen und mögliche Engpässe.

Ist dies ein CentOS 5 oder 6 System? Denn in 6 haben wir ein unglaubliches Tool namens blktrace, das sich ideal zur Messung der Auswirkungen in solchen Situationen eignet.

https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch06s03.html

Wir können dann die Ausgabe mit btt analysieren und herausfinden, wo der Engpass liegt, Anwendung, Dateisystem, Scheduler, Speicher - bei welcher Komponente die E / A die meiste Zeit verbringt.

Wenn Sie nun theoretisch zu Ihrer Frage kommen, erhöht sich offensichtlich die Anzahl der Inodes. Wenn Sie weiterhin neue oder vorhandene Dateien oder Verzeichnisse in Verzeichnissen erstellen oder darauf zugreifen, erhöht sich die Zugriffszeit. Der Kernel muss eine größere Dateisystemhierarchie durchlaufen, und dies ist ohne Zweifel ein Overhead.

Ein weiterer zu beachtender Punkt ist, dass mit zunehmender Anzahl von Verzeichnissen die Inode- und Dentry-Cache-Nutzung zunimmt, was bedeutet, dass mehr RAM verbraucht wird. Dies fällt unter den Plattenspeicher. Wenn Ihrem Server also der Arbeitsspeicher ausgeht, ist dies ein weiterer Gesichtspunkt.

Als ich von einem Beispiel aus der realen Welt sprach, habe ich kürzlich gesehen, dass das Erstellen eines Unterverzeichnisses auf einem stark verschachtelten ext3 fs ungefähr 20 Sekunden dauert, während es auf ext4 ungefähr 4 Sekunden dauert. Dies liegt daran, wie die Blockzuordnung in verschiedenen Dateisystemen strukturiert ist. Wenn Sie XFS oder ext4 verwenden, ist es unnötig zu erwähnen, dass Sie eine Leistungssteigerung erhalten, wie gering diese auch sein mag.

Wenn Sie also nur nach der richtigen Wahl des Dateisystems fragen, ist ext3 etwas veraltet. Das ist alles, was ich ohne weitere Daten und Benchmark anbieten kann.

Soham Chakraborty
quelle
0

Es ist keine Option unter CentOS 5 und nicht sicher, inwieweit es eine Option unter CentOS 6 ist, aber ich habe das Gefühl, dass eine B-Baum- oder B * -Baum-basierte Lösung, dh BTRFS, eine konsistente, wenn nicht wesentlich bessere Leistung in Ihrem speziellen Bereich bieten würde Szenario, wenn nur man es mit gutem Gewissen mit seinen wertvollen Daten betrauen könnte (würde ich immer noch nicht).

Aber wenn Sie es sich leisten können, können Sie es testen.

Bojan Markovic
quelle