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:
Irgendwelche Ideen?
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.
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.
Wie wäre es damit:
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.
Tags und Links linux caching filesystems