Umgang mit vielen temporären kleinen Dateien

7

Ich habe einen Webserver, der Cache-Dateien speichert und sie für 7 Tage hält. Die Dateinamen sind MD5-Hashes, d. H. Genau 32 Hex-Zeichen lang, und werden in einer Baumstruktur gehalten, die wie folgt aussieht:

%Vor%

Sie bekommen die Idee.

Mein Problem ist, dass das Löschen alter Dateien sehr lange dauert. Ich habe einen täglichen cron Job, der läuft

%Vor%

was mehr als einen halben Tag in Anspruch nimmt. Ich mache mir Sorgen über die Skalierbarkeit und die Auswirkungen auf die Leistung des Servers. Darüber hinaus ist das Cache-Verzeichnis jetzt ein schwarzes Loch in meinem System und fängt gelegentlich die unschuldigen du oder find ein.

Die Standardlösung für den LRU-Cache ist eine Art Heap. Gibt es eine Möglichkeit, dies auf Dateisystemebene zu skalieren? Gibt es eine andere Möglichkeit, dies so zu implementieren, dass es einfacher zu verwalten ist?

Hier sind Ideen, die ich in Betracht gezogen habe:

  1. Erstellen Sie 7 oberste Verzeichnisse, eines für jeden Wochentag, und leeren Sie jeden Tag ein Verzeichnis. Dies erhöht die Suchzeit für eine Cachedatei um das 7-fache, macht es sehr kompliziert, wenn eine Datei überschrieben wird, und ich bin nicht sicher, was es mit der Löschzeit machen wird.
  2. Speichern Sie die Dateien als Blobs in einer MySQL-Tabelle mit Indizes für Name und Datum. Dies schien vielversprechend, aber in der Praxis war es immer viel langsamer als FS. Vielleicht mache ich es nicht richtig.

Irgendwelche Ideen?

    
itsadok 03.11.2008, 09:31
quelle

5 Antworten

15

Wenn Sie eine Datei speichern, erstellen Sie eine symbolische Verknüpfung zu einer zweiten Verzeichnisstruktur, die nach Datum, nicht nach Name organisiert ist.

Rufen Sie Ihre Dateien mit der Struktur "name" ab und löschen Sie sie mit der Struktur "date".

    
Tomalak 03.11.2008, 09:45
quelle
4

Angenommen, das ist ext2 / 3 Haben Sie versucht, die indizierten Verzeichnisse hinzuzufügen? Wenn Sie eine große Anzahl von Dateien in einem bestimmten Verzeichnis haben, wird die Suche sehr langsam, um etwas zu löschen Verwenden Sie tune2fs -o dir_index, um die Option dir_index zu aktivieren.
Stellen Sie beim Mounten eines Dateisystems sicher, dass die Option noatime verwendet wird, die das Betriebssystem daran hindert, die Zugriffszeitinformationen für die Verzeichnisse zu aktualisieren (muss noch geändert werden).
Wenn man sich den ursprünglichen Beitrag ansieht, scheint es, als hätten Sie nur zwei Ebenen der Indirektion zu den Dateien, was bedeutet, dass Sie eine große Anzahl von Dateien in den Blattverzeichnissen haben können. Wenn es mehr als eine Million Einträge in diesen gibt, werden Sie feststellen, dass Suchen und Änderungen furchtbar langsam sind. Eine Alternative besteht darin, eine tiefere Hierarchie von Verzeichnissen zu verwenden, wodurch die Anzahl der Elemente in einem bestimmten Verzeichnis reduziert wird, wodurch die Kosten für die Suche und die Aktualisierung des jeweiligen einzelnen Verzeichnisses reduziert werden.

    
Petesh 03.11.2008 10:13
quelle
1

Reiserfs ist relativ effizient im Umgang mit kleinen Dateien. Hast du verschiedene Linux Dateisysteme ausprobiert? Ich bin mir nicht sicher über die Leistung beim Löschen - Sie können die Formatierung (mkfs) als Ersatz für das Löschen einzelner Dateien betrachten. Beispielsweise können Sie für jeden Wochentag ein anderes Dateisystem (cache1, cache2, ...) erstellen.

    
gimel 03.11.2008 09:42
quelle
1

Wie wäre es damit:

  • Haben Sie einen anderen Ordner namens "ToDelete"
  • Wenn Sie ein neues Element hinzufügen, rufen Sie das heutige Datum ab und suchen Sie nach einem Unterordner in "Löschen", dessen Name das aktuelle Datum angibt
  • Wenn es nicht dort ist, erstelle es
  • Fügen Sie einen symbolischen Link zu dem Element hinzu, das Sie im heutigen Ordner erstellt haben
  • Erstellen Sie einen Cron-Job, der in den Ordner "ToDelete" mit dem richtigen Datum wechselt, und löschen Sie alle verknüpften Ordner.
  • Löschen Sie den Ordner, der alle Links enthielt.
OJ. 03.11.2008 09:47
quelle
0

Wie wäre es mit einer Tabelle in Ihrer Datenbank, die den Hash als Schlüssel verwendet? Das andere Feld wäre dann der Name der Datei. Auf diese Weise kann die Datei datumsbezogen zum schnellen Löschen gespeichert werden, und die Datenbank kann verwendet werden, um den Speicherort der Datei basierend auf dem Hash schnell zu finden.

    
David Arno 03.11.2008 09:35
quelle

Tags und Links