Wie speichere und diene ich am effizientesten über 1.000.000 kleine gziped-Dateien auf einem Linux-Webserver?

10

Ich habe große statische Inhalte, die ich über einen Linux-basierten Webserver bereitstellen muss. Es handelt sich um einen Satz von über einer Million kleinen GZIP-Dateien. 90% der Dateien sind kleiner als 1 KB und die restlichen Dateien sind höchstens 50 KB groß. In Zukunft könnte dies auf über 10 Millionen gzip-Dateien anwachsen.

Sollte ich diesen Inhalt in eine Dateistruktur einfügen oder sollte ich in Betracht ziehen, all diesen Inhalt in eine Datenbank aufzunehmen? Wenn es sich um eine Dateistruktur handelt, kann ich große Verzeichnisse verwenden oder sollte ich kleinere Verzeichnisse in Betracht ziehen?

Mir wurde gesagt, dass eine Dateistruktur für die Zustellung schneller sein würde, aber auf der anderen Seite weiß ich, dass die Dateien viel Speicherplatz auf der Festplatte beanspruchen, da Dateiblöcke mehr als 1 KB groß sind.

Was ist die beste Strategie hinsichtlich der Lieferleistung?

AKTUALISIEREN

Für die Aufzeichnungen habe ich einen Test unter Windows 7 mit einer halben Million Dateien durchgeführt:

Geben Sie hier die Bildbeschreibung ein

Jérôme Verstrynge
quelle

Antworten:

6

Ich würde vermuten, dass eine FS-Struktur schneller wäre, aber Sie benötigen eine gute Verzeichnisstruktur, um Verzeichnisse mit einer sehr großen Anzahl von Dateien zu vermeiden.

Ich würde mir keine Sorgen um verlorenen Speicherplatz machen. Bei einer Blockgröße von 16 KB verlieren Sie beispielsweise im schlimmsten Fall 15 GB Speicherplatz, wenn Sie für jede einzelne Datei einen zusätzlichen Block benötigen. Bei den heutigen Festplattengrößen ist das nichts und Sie können die Parameter Ihres Dateisystems an Ihre spezifischen Anforderungen anpassen.

Sven
quelle
5

Wenn Sie die Option Dateistruktur auswählen, können Sie die Partitions-E / A-Leistung zumindest bis zu einem gewissen Grad verbessern, indem Sie die Partition mit noatime + nodiratime bereitstellen, sofern Sie diese nicht benötigen. Sie sind überhaupt nicht wirklich wichtig, deshalb empfehle ich das. Möglicherweise können Sie auch ein Solid-State-Laufwerk verwenden.

Ode
quelle
4

Ich denke, die richtige Antwort hängt davon ab, wie die Dateien indiziert werden ... was bestimmt, wann eine bestimmte Datei für die Zustellung ausgewählt wird.

Wenn Sie bereits eine Datenbankabfrage durchführen, um Ihren Dateinamen zu ermitteln, ist es möglicherweise besser, die Datei genau dort im Datenbankdatensatz zu belassen. Möglicherweise erzielen Sie die besten Ergebnisse, wenn Sie einige Paging-Einstellungen in Ihrer Datenbank von anpassen Wenn Sie die Dateien auswählen und dann in der Datenbank speichern (z. B. größere Seiten, um alle Blob-Datensätze zu berücksichtigen), können Sie das Dateisystem möglicherweise noch besser verwenden.

Die Datenbankoption hat eine etwas bessere Chance, da bei einer Million Datensätzen wahrscheinlich nicht jede Datei gleich wahrscheinlich abgefragt wird. Wenn Sie sich in einer Situation befinden, in der eine Datei möglicherweise mehrmals hintereinander oder fast hintereinander abgefragt wird, kann die Datenbank als De-facto-Cache für kürzlich abgerufene Dateien fungieren. In diesem Fall wird häufig das Dateiergebnis angezeigt bereits in den Speicher geladen. Möglicherweise müssen Sie die Interna Ihres Datenbankmoduls sorgfältig optimieren, um das gewünschte Verhalten zu erzielen.

Aber die Hauptsache, die Sie meiner Antwort entziehen sollten, ist, dass Sie nicht wirklich wissen, was am besten funktioniert, bis Sie es mit einigen repräsentativen Testdaten versuchen und die Ergebnisse messen.

Joel Coel
quelle
1

Mit modernen Dateisystemen sollte dies kein großes Problem sein. Ich habe XFS mit 1 Milliarde Dateien im selben Verzeichnis getestet und bin mir ziemlich sicher, dass ext4 auch gut funktioniert (solange das Dateisystem selbst nicht zu groß ist). Haben Sie genügend Speicher, um die Verzeichniseinträge zwischenzuspeichern. Ein größerer Prozessor-Cache hilft auch sehr.

Wazoox
quelle
2
EXT-Dateisysteme kommen mit einer hohen Anzahl von Dateien im selben Verzeichnis nicht sehr gut zurecht. vor allem nicht mit Standardeinstellungen für directory_index. Ich habe XFS nicht mit einer so hohen Dateizahl im selben Verzeichnis getestet, aber ich bin mir ziemlich sicher, dass EXT mit nichts in der Nähe von 1 Milliarde im selben Verzeichnis funktioniert.
Hrvoje Špoljar
1
Ich habe gehört, dass reiserfs gut für kleine Dateien ist, aber dann habe ich auch gehört, dass der Typ, der die Software wartet, im Gefängnis ist (!), So dass die nahe Zukunft von reiserfs ziemlich ungewiss ist. Ich persönlich würde mich für EXT4 und XFS als zweite Wahl entscheiden. Ist XFS nicht am besten für große Dateien geeignet?
Öde
Früher war es so, aber wenn Sie einen neuen Kernel (3.0 und höher) verwenden, funktioniert dies auch für kleine Dateien.
Wazoox