Dateisystem große Anzahl von Dateien in einem einzigen Verzeichnis


29

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?


3
Warum müssen sie in einem Verzeichnis sein?
Kyle Brandt

1
Ich bin auch an einer aktuellen Antwort auf die ursprüngliche Frage interessiert, da es genügend Verbesserungen in xfs und ext4 gibt.

Antworten:


15

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.


Laut den Folien in @ nelaars Antwort wäre ext4 xfs für diese Aufgabe überlegen.
Mulllhausen

13

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

Zeit, mkfs auszuführen Zeit, um 1M 50kb-Dateien zu erstellen Reparaturzeit des Dateisystems 1m Dateien entfernen


2
Wir bevorzugen wirklich, dass Antworten Inhalte enthalten, die nicht auf Inhalte verweisen. Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
user9517 unterstützt GoFundMonica

@Iain Ich hoffe, das ist besser, als einfach das PDF herunterzuladen, würde Ihnen die gleichen Infos geben.
Nelaaro

19
Wow, das sind einige außergewöhnlich schwer zu lesende Grafiken. ~
ThorSummoner


5

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.


5

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.


3

Die Verwendung von tune2fs zum Aktivieren von dir_index kann hilfreich sein. So überprüfen Sie, ob es aktiviert ist:

sudo tune2fs -l /dev/sda1 | grep dir_index

Wenn es nicht aktiviert ist:

sudo umount /dev/sda1   
sudo tune2fs -O dir_index /dev/sad1
sudo e2fsck -D /dev/sda1
sudo mount /dev/sda1

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.


1
war die /dev/sad1absicht, kopier- / pastafehler zu vermeiden?
Anwar

2

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.


2
Das Unterstützen dieser Anzahl von Dateien in einem Verzeichnis ist nicht dasselbe wie das Ausführen mit einer angemessenen Geschwindigkeit. Ich weiß noch nicht, ob ext4 besser ist, aber ext3 verlangsamt sich erheblich, wenn es mehr als ein paar tausend Dateien in einem Verzeichnis hat, auch wenn dir_index aktiviert ist (es hilft, beseitigt das Problem aber nicht vollständig).
cas

1

Sie können Datei-Inodes anstelle von Dateinamen speichern: Der Zugriff auf Inode-Nummern sollte wesentlich schneller sein als das Auflösen von Dateinamen


Sag es mir jetzt. Wie öffnet man eine Datei nach Inode-Nummer?
Matt

1
@Matt, es sieht so aus, als hätte sich die Frage geändert, nachdem ich geantwortet habe. Oder ich war vor 1,5 Jahren viel dümmer :)))
kolypto

0

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.


-1

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.


-1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.