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

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 hat dieses Laufwerk rund 250 GB Daten dazu.

Ist die Strukturierung des Laufwerks mit all diesen Verzeichnissen die Laufwerk Lese- / Schreibleistung beeinflussen? Ist es Auswirkungen auf einige andere Leistung Aspekt Ich bin nicht bewusst?

Gibt es etwas an sich falsch oder schlecht mit der Strukturierung von Dingen auf diese Weise? Vielleicht nur die falsche Wahl des Dateisystems?

Ich habe vor kurzem versucht, zwei Datenlaufwerke zu verschmelzen und erkannte, dass EXT3 auf 32.000 Unterverzeichnisse beschränkt ist. Das hat mich gefragt, warum. Es scheint albern, dass ich es so gebaut habe, wenn man bedenkt, dass jede Datei eine eindeutige ID hat, die einer ID in der Datenbank entspricht. Leider …

10 Solutions collect form web for “Wie wirkt sich die Anzahl der Unterverzeichnisse auf die Lese- / Schreibleistung auf Linux aus?”

Dies ist leicht zu testen, die Optionen für sich selbst, in Ihrer Umgebung und vergleichen Sie die Ergebnisse. Ja, es gibt einen negativen Einfluss auf die Leistung, da die Anzahl der Verzeichnisse zunimmt. Ja, andere Dateisysteme können helfen, diese Barrieren zu umgehen oder die Auswirkungen zu reduzieren.

Das XFS-Dateisystem ist für diese Art von Verzeichnisstruktur besser. Ext4 ist wohl heute gut so. Der Zugriff und die Operationen im Verzeichnis werden einfach verlangsamt, wenn die Anzahl der Unterverzeichnisse und Dateien erhöht wird. Das ist sehr ausgeprägt unter ext3 und nicht so sehr auf XFS.

Die Antwort ist nicht so einfach wie die Wahl des Dateisystems. Sane Dateisysteme gestoppt mit linearen Listen für Verzeichnisse vor langer Zeit, was bedeutet, dass die Anzahl der Einträge in einem Verzeichnis nicht beeinflusst Dateizugriffszeit ….

Außer wenn es tut

In der Tat, jede Operation bleibt schnell und effizient, egal die Anzahl der Einträge, aber einige Aufgaben mit einer wachsenden Anzahl von Operationen. Offensichtlich tut es eine einfache ls dauert eine lange Zeit, und Sie sehen nichts, bis alle Inodes gelesen und sortiert wurden. ls -U du ls -U (unsortiert) hilft, hilft ein wenig, weil du sehen kannst, dass es nicht tot ist, aber nicht die Zeit spürbar reduziert. Weniger offensichtlich ist, dass jede Wildcard-Erweiterung jeden Dateinamen überprüfen muss, und es scheint, dass in den meisten Fällen der ganze Inode auch gelesen werden muss.

Kurz gesagt: Wenn Sie sicher sein können, dass keine Anwendung (einschließlich Shell-Zugang) jemals irgendwelche Wildard verwenden wird, dann können Sie riesige Verzeichnisse ohne Reue bekommen. Aber wenn es irgendwelche Wildcards geben könnte, die im Code lauern, halten Sie immer Verzeichnisse unterhalb von tausend Einträgen jeweils.

Bearbeiten :

Alle modernen Dateisysteme nutzen gute Datenstrukturen für große Verzeichnisse, so dass eine einzige Operation, die den Inode einer bestimmten Datei finden muss, auch bei humongous Verzeichnissen ziemlich schnell sein wird.

Aber die meisten Anwendungen machen nicht nur Einzeloperationen. Die meisten von ihnen werden entweder ein vollständiges Verzeichnis oder ein Wildcard-Matching. Die sind langsam, egal was, denn sie beinhalten das Lesen aller Einträge.

Zum Beispiel: Lasst uns sagen, du hast ein Verzeichnis mit einer Million Dateien namens 'foo-000000.txt' durch 'foo-999999.txt' und eine einzelne '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:

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

Diese werden langsam sein, auch wenn sie sehr wenige Ergebnisse zurückgeben; Auch diejenigen, die scheitern, scheitern nach dem Scannen alle Einträge:

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

dir_index sicher, dass die ext3-Partition das dir_index Flag gesetzt hat.

 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 ausführen:

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

Dann montiere das Dateisystem.

Es macht keinen Unterschied, bis du die ext3 32.000 Namen pro Verzeichnisgrenze getroffen hast. Das Upgrade auf ext4 kann das umgehen, ebenso wie die anderen Vorteile, die ext4 hat.

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

Eine bessere Lösung ist, eine Verzeichnis-Hierarchie zu erstellen, wie folgt:

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

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

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

Die meisten Mail-Systeme verwenden diesen Trick mit ihren Mail-Warteschlangen-Dateien.

Auch habe ich festgestellt, dass mit einigen Dateisystemen, nur in der Vergangenheit viele Einträge in einem Verzeichnis haben, dass Verzeichnis Verzeichnis langsam. Machen Sie ein ls -ld im Verzeichnis, um die Größe des Verzeichniseintrags selbst zu sehen. Wenn es mehrere MB oder mehr und das Verzeichnis ist relativ leer, dann können Sie immer schlechte Leistung. Benennen Sie das Verzeichnis aus dem Weg, erstellen Sie ein neues mit dem gleichen Namen und Berechtigungen und Besitz, und verschieben Sie dann den Inhalt Ihres alten Verzeichnisses in das neue. Ich habe diesen Trick schon oft benutzt, um Mailserver signifikant zu beschleunigen, die durch das Dateisystem verlangsamt worden waren.

Ich habe vor kurzem einen Speicherserver entwickelt, der benötigt wurde, um zig Millionen Dateien und Hunderte von Tausenden von Verzeichnissen zu erstellen. Ich verglich XFS mit ext4 und reiserfs. Ich fand, dass in meinem Fall ext4 etwas schneller als XFS war. Reiser war interessant, hatte aber Einschränkungen, so dass es fallen gelassen wurde. Ich fand auch ext4 deutlich schneller als ext3.

Wenn du viele Dateien pro Verzeichnis bekommst, beginnt die Datei offene Zeit zu leiden. Datei I / O nicht. Die Löschzeit der Datei leidet ebenfalls. Allerdings ist es nicht zu langsam auf ext4. Es ist sehr bemerkenswert unter ext3 aber XFS und ext4 sind ziemlich schnell auf diesem.

Als ich zuletzt bei XFS angeschaut habe und die Vor- und Nachteile der Verwendung von XFS über ext4 abwägen, fand ich Berichte über Datenverlust bei XFS. Ich bin mir nicht sicher, dass das noch ein Problem ist oder wenn es jemals war, aber es machte mich nervös genug, um klar zu lenken. Als ext4 ist die Standard-fs in Ubuntu es gewann leicht über XFS.

Also, zusätzlich zu tylerls Vorschlag, der aus der Management-Perspektive helfen wird, schlage ich vor, dass Sie auf ext4 upgraden können. Die pro Verzeichnisgrenze beträgt 64000 Einträge mit ext4

Ein weiterer Vorteil ist die fsck Zeit ist wesentlich schneller. Ich hatte noch keine Probleme mit Korruption.

Die schöne Sache über ext4 ist, dass man ein ext3-Volume an ext4 montieren kann, um es auszuprobieren. Siehe: Migration eines Live-Systems von ext3 auf ext4 Dateisystem

Ein Zitat aus diesem Link:

Wenn Sie nicht von den Einschränkungen von ext3 betroffen sind und nicht bereit sind, Risiken einzugehen, kann es sich nicht lohnen. Auf der anderen Seite kann bei erfolgreichem Abschluss des Migrationsvorgangs Ihr System schneller ausführen, verkürzte Dateisystemprüfungen durchführen und die Zuverlässigkeit ohne negative Auswirkungen erhöhen.

Also geh vor und versuche es. Schlagen Sie sich zuerst vor.

Es gibt definitiv einige Konsequenzen dafür. Die primäre wird IO lesen / schreibt. Darüber hinaus ist es nur ein sehr beängstigender Umgang mit dieser Art von Daten (auf dieser Skala).

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

Die erste Auflistung der Dateisysteminhalte dauert eine Weile, bis das System alle Verzeichnis- / Dateiinformationen gelesen hat. Ergänzende Operationen werden schneller, da der Kernel jetzt die Informationen zwischengespeichert hat.

Ich habe gesehen, Admins laufen 'find / somepath 2> & 1> / dev / null' in cron auf einer regelmäßigen Basis zu halten den Cache aktiv, was zu einer besseren Leistung.

Ich habe einige Fragen und einige mögliche Engpassbefunde.

Erstens ist das ein CentOS 5 oder 6 System? Denn in 6 haben wir ein unglaubliches Werkzeug namens blktrace, das ideal ist, um den Einfluss in dieser Art von Situationen zu messen.

 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 dort bekommen, wo der Engpass ist, Anwendung, Dateisystem, Scheduler, Speicher – bei welcher Komponente die IO die meiste Zeit verbringt.

Nun, theoretisch zu Ihrer Frage kommen, wird es offensichtlich erhöhen die Anzahl der Inodes und wie Sie erstellen oder den Zugriff auf neue oder vorhandene Dateien oder Verzeichnisse in Verzeichnissen, wird die Zugriffszeit erhöhen. Der Kernel muss eine umfangreichere Dateisystemhierarchie durchqueren und damit ohne Zweifel ein Overhead sein.

Ein weiterer Punkt zu beachten ist, dass, wie Sie die Anzahl der Verzeichnisse zu erhöhen, wird die Inode-und Dentry-Cache-Nutzung klettern Sinne Verbrauch von mehr RAM. Dies kommt unter Brammen-Speicher, so dass, wenn Ihr Server läuft niedrig auf Speicher, das ist ein weiterer Punkt des Denkens.

Apropos ein echtes Weltbeispiel, habe ich vor kurzem gesehen, dass auf einem sehr verschachtelten ext3 fs, die Schaffung eines Subdir für das erste Mal dauert etwa 20 Sekunden, während auf ext4 dauert es etwa 4 Sekunden. Das liegt daran, wie die Bausteinzuordnung in unterschiedlichen Dateisystemen strukturiert ist. Wenn du XFS oder ext4 einsetzst, ist es unnötig zu sagen, dass du etwas Performance-Boost bekommst, aber minimal ist es vielleicht.

Also, wenn Sie nur fragen, was ist die richtige Wahl des Dateisystems, ist ext3 ein bisschen veraltet. Das ist alles, was ich ohne weitere Daten und Benchmark anbieten kann.

Es ist nicht eine Option auf CentOS 5, und nicht sicher, wie viel es eine Option auf CentOS 6 ist, aber ich habe ein Bauchgefühl, dass ein B-Baum oder B * Baum-basierte Lösung dh BTRFS würde eine konsistente, wenn nicht deutlich bessere Leistung in Ihrem bestimmten bieten Szenario, wenn man nur eins mit den kostbaren Daten mit einem klaren Gewissen anvertrauen könnte (ich würde es immer noch nicht).

Aber wenn du es dir leisten kannst, kannst du es testen.

  • Ssh Verzögerung beim Anschließen
  • VFS: file-max limit 1231582 erreicht
  • BIND 9s nsupdate dyndns update gibt: "tsig verify failure (BADKEY)"
  • LSI-RAID-Controller-Fehler beim DB-Import - Wie kann man Fehler beheben?
  • E-Mails mit Postfix werden als Spam markiert
  • Tuning Amazon Linux Worker Tier
  • Was sind typische NFS-Lese- / Schreibraten
  • Wie bringe ich einen Daemon-process ins Vordergrund?
  • Erhalten Error: "Kein Leerzeichen auf dem Gerät" für einen bestimmten filenamen
  • Wie man eine vollständige dataträger-data (mehr als eine Partition) mit dd kloniert
  • Sicherung von schwerem Solr / MySQL server
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.