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 ...
quelle
homes/u/username, homes/j/joeblow,homes/s/somebody,...
?Antworten:
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.
quelle
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
ls
dauert das Ausführen eines einfachen Vorgangs lange, und Sie sehen nichts, bis alle Inodes gelesen und sortiert wurden. Tunls -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/
quelle
Stellen Sie zunächst sicher, dass für die ext3-Partition das
dir_index
Flag gesetzt ist.Wenn es fehlt, können Sie es aktivieren. Sie müssen das Dateisystem aushängen und dann Folgendes ausführen:
Hängen Sie dann das Dateisystem ein.
quelle
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.
quelle
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:
Und wenn Sie immer noch eine bessere Leistung benötigen, können Sie mehrere Ebenen erweitern:
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 -ld
Verzeichnis 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.quelle
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:
Also, probieren Sie es aus. Schlagen Sie vor, zuerst ein Backup zu erstellen.
quelle
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).
quelle
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.
quelle
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.
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.
quelle
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.
quelle