2008-11-03 5 views
7

Ich habe einen Webserver, der Cache-Dateien speichert und sie für 7 Tage hält. Die Dateinamen sind md5 Hashes, das heißt genau 32 Hex-Zeichen lang, und werden in einer Baumstruktur gehalten, die wie folgt aussieht:Umgang mit vielen temporären kleinen Dateien

00/ 
    00/ 
    00000ae9355e59a3d8a314a5470753d8 
    . 
    . 
00/ 
    01/ 

Sie bekommen die Idee.

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

find cache/ -mtime +7 -type f -delete 

läuft, die mehr als einen halben Tag dauert, um abzuschließen. Ich mache mir Sorgen über die Skalierbarkeit und die Auswirkungen auf die Leistung des Servers. Außerdem ist das Cache-Verzeichnis jetzt ein schwarzes Loch in meinem System und fängt die gelegentlichen 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:

  1. 7 Top-Verzeichnisse erstellen, eine für jeden Wochentag und leere ein Verzeichnis jeden Tag. Dies erhöht die Suchzeit für eine Cache-Datei um das 7-fache, macht es wirklich kompliziert, wenn eine Datei überschrieben wird, und ich bin mir 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?

Antwort

15

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

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

+0

Bugger :) Sie haben mich dazu geschlagen. +1 diese Antwort. –

+0

Stellen Sie sicher, dass Sie die Originaldatei und den Link entfernen. Sie wollen nicht viele tote Links dort, und es ist auch einfach, den Link zu entfernen und nicht die ursprüngliche Datei zu entfernen. –

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 dieser Datei basierend auf dem Hash schnell zu finden.

1

Reiserfs ist relativ effizient im Umgang mit kleinen Dateien. Hast du verschiedene Linux file systems getestet? 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.

1

Wie wäre es damit:

  • haben einen anderen Ordner namens, sagen wir, „ToDelete“
  • Wenn Sie ein neues Element hinzuzufügen, das heutige Datum und suchen Sie nach einem Unterordner in „ToDelete“, die einen Namen hat bekommen indikativ für das aktuelle Datum
  • Wenn es nicht vorhanden ist, erstellen Sie es
  • einen symbolischen Link zu dem Element hinzufügen Sie in der heutigen Ordner
  • erstellen einen cron-Job, der in „ToDelete“ in den Ordner geht, die erstellt haben, ist der Kor rect date und lösche alle verknüpften Ordner.
  • Löschen Sie den Ordner, der alle Links enthielt.
4

Angenommen, das ist ext2/3 Haben Sie versucht, in den indizierten Verzeichnissen hinzuzufügen? Wenn Sie eine große Anzahl von Dateien in einem bestimmten Verzeichnis haben, wird die Suche sehr langsam sein, um etwas zu löschen.
Verwenden Sie tune2fs -o dir_index, um die Option dir_index zu aktivieren.
Wenn Sie ein Dateisystem mounten, vergewissern Sie sich, dass Sie die Option noatime verwenden, die das Betriebssystem daran hindert, die Zugriffszeitinformationen für die Verzeichnisse zu aktualisieren (muss noch geändert werden).
Mit Blick auf den ursprünglichen Beitrag scheint es, als ob Sie nur 2 Ebenen der Indirektion zu den Dateien haben, 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 Aktualisierungen für das jeweilige individuelle Verzeichnis verringert werden.