OK, nicht so groß, aber ich muss etwas verwenden, bei dem ungefähr 60.000 Dateien mit einer durchschnittlichen Größe von 30 KB in einem einzigen Verzeichnis gespeichert sind (dies ist eine Voraussetzung, damit ich nicht einfach in Unterverzeichnisse mit einer geringeren Anzahl von Dateien aufbrechen kann).
Auf die Dateien wird nach dem Zufallsprinzip zugegriffen, aber sobald sie erstellt wurden, werden keine Schreibvorgänge auf dasselbe Dateisystem ausgeführt. Ich verwende derzeit Ext3, finde es aber sehr langsam. Irgendwelche Vorschläge?
Antworten:
Sie sollten XFS in Betracht ziehen. Es unterstützt eine sehr große Anzahl von Dateien sowohl auf Dateisystem- als auch auf Verzeichnisebene, und die Leistung bleibt auch bei einer großen Anzahl von Einträgen aufgrund der Datenstrukturen des B + -Baums relativ konstant.
In ihrem Wiki gibt es eine Seite mit einer Vielzahl von Artikeln und Veröffentlichungen, die das Design detailliert beschreiben. Ich empfehle Ihnen, es auszuprobieren und mit Ihrer aktuellen Lösung zu vergleichen.
quelle
Eine Milliarde Dateien unter Linux
Der Autor dieses Artikels befasst sich mit einigen Leistungsproblemen bei Dateisystemen mit großen Dateien und vergleicht die Leistung verschiedener Dateisysteme ext3, ext4 und XFS. Dies wird als Diashow zur Verfügung gestellt. http://events.linuxfoundation.org/slides/2010/linuxcon2010_wheeler.pdf
quelle
Viele Dateien in einem Verzeichnis auf ext3 wurden auf der Schwestersite stackoverflow.com ausführlich besprochen
Meiner Meinung nach sind 60 000 Dateien in einem Verzeichnis auf ext3 alles andere als ideal, aber abhängig von Ihren anderen Anforderungen kann es gut genug sein.
quelle
OKAY. Ich habe einige vorläufige Tests mit ReiserFS, XFS, JFS, Ext3 (dir_hash aktiviert) und Ext4dev (2.6.26 Kernel) durchgeführt. Mein erster Eindruck war, dass alle schnell genug waren (auf meiner bulligen Workstation) - es stellte sich heraus, dass die entfernte Produktionsmaschine einen ziemlich langsamen Prozessor hat.
Ich habe bei ReiserFS schon beim ersten Testen eine gewisse Verrücktheit erlebt, so dass dies ausgeschlossen war. JFS hat anscheinend 33% weniger CPU-Anforderungen als alle anderen und testet dies daher auf dem Remote-Server. Wenn es gut genug funktioniert, werde ich das verwenden.
quelle
Ich schreibe eine Anwendung, die auch viele, viele Dateien speichert, obwohl meine größer sind und ich 10 Millionen davon habe, die ich auf mehrere Verzeichnisse aufteilen werde.
ext3 ist hauptsächlich wegen der Standardimplementierung für verknüpfte Listen langsam. Wenn Sie also viele Dateien in einem Verzeichnis haben, bedeutet dies, dass das Öffnen oder Erstellen eines anderen Verzeichnisses immer langsamer wird. Es gibt einen so genannten htree-Index für ext3, der angeblich die Dinge erheblich verbessert. Es ist jedoch nur bei der Dateisystemerstellung verfügbar. Siehe hier: http://lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/
Da Sie das Dateisystem sowieso neu erstellen müssen und aufgrund der Einschränkungen von ext3, ist meine Empfehlung, dass Sie sich mit ext4 (oder XFS) befassen. Ich denke ext4 ist ein bisschen schneller mit kleineren Dateien und hat schnellere Neuerstellungen. Soweit mir bekannt ist, ist der Htree-Index auf ext4 voreingestellt. Ich habe keine wirklichen Erfahrungen mit JFS oder Reiser, aber ich habe schon gehört, dass die Leute das empfehlen.
In Wirklichkeit würde ich wahrscheinlich mehrere Dateisysteme testen. Probieren Sie ext4, xfs & jfs aus und finden Sie heraus, welches die beste Gesamtleistung bietet.
Ein Entwickler hat mir gesagt, dass der Anwendungscode schneller ausgeführt werden kann, indem er nicht "stat + open" aufruft, sondern "open + fstat". Der erste ist deutlich langsamer als der zweite. Ich bin mir nicht sicher, ob Sie die Kontrolle oder den Einfluss darauf haben.
Siehe meinen Beitrag hier auf stackoverflow. Speichern und Zugreifen auf bis zu 10 Millionen Dateien unter Linux. Dort finden Sie einige sehr nützliche Antworten und Links.
quelle
Die Verwendung von tune2fs zum Aktivieren von dir_index kann hilfreich sein. So überprüfen Sie, ob es aktiviert ist:
Wenn es nicht aktiviert ist:
Aber ich habe das Gefühl, dass Sie möglicherweise den falschen Weg einschlagen ... warum nicht einen flachen Index generieren und einen Code verwenden, um darauf basierend zufällig eine Auswahl zu treffen. Sie können dann Unterverzeichnisse für eine optimierte Baumstruktur verwenden.
quelle
/dev/sad1
absicht, kopier- / pastafehler zu vermeiden?ext3 und niedriger unterstützen bis zu 32768 Dateien pro Verzeichnis. ext4 unterstützt bis zu 65536 in der tatsächlichen Anzahl von Dateien, ermöglicht Ihnen jedoch, mehr zu haben (es speichert sie einfach nicht im Verzeichnis, was für die meisten Benutzerzwecke keine Rolle spielt).
Die Art und Weise, wie Verzeichnisse auf ext * -Dateisystemen gespeichert werden, ist im Wesentlichen eine große Liste. Auf den moderneren Dateisystemen (Reiser, XFS, JFS) werden sie als B-Bäume gespeichert, die für große Mengen viel effizienter sind.
quelle
Sie können Datei-Inodes anstelle von Dateinamen speichern: Der Zugriff auf Inode-Nummern sollte wesentlich schneller sein als das Auflösen von Dateinamen
quelle
Sie wollen nicht so viele Dateien in einem Verzeichnis stopfen, sondern eine Art Struktur. Auch wenn es so einfach ist, Unterverzeichnisse zu haben, die mit dem ersten Zeichen der Datei beginnen, können Sie Ihre Zugriffszeiten verbessern. Ein anderer alberner Trick, den ich gerne benutze, ist, das System zu zwingen, seinen Cache mit Metainformationen zu aktualisieren. In einem Fenster wird slabtop ausgeführt und in einem anderen wird updatedb ausgeführt, und Sie werden feststellen, dass dem Zwischenspeichern viel Speicher zugewiesen wird. Auf diese Weise geht es viel schneller.
quelle
Sie haben die Art der Daten in diesen Dateien nicht angegeben. Aber aus den Klängen sollte man eine Art Datenbank mit Indexierung für die schnelle Suche verwenden.
quelle
Das Dateisystem ist wahrscheinlich nicht der ideale Speicher für solche Anforderungen. Eine Art Datenbankspeicher ist besser. Wenn Sie dennoch nicht helfen können, versuchen Sie, Dateien in mehrere Verzeichnisse aufzuteilen, und verwenden Sie unionfs, um diese Verzeichnisse in einem einzelnen Verzeichnis bereitzustellen (zu binden), in dem alle Dateien angezeigt werden sollen. Ich habe diese Technik überhaupt nicht zum Beschleunigen verwendet, aber es ist einen Versuch wert.
quelle