Im Dokument heißt es:
max legt die maximale Anzahl von Elementen im Cache fest; bei einem Cache-Überlauf werden die am wenigsten kürzlich verwendeten (LRU) Elemente entfernt;
Bleibt es auch nach Neustarts von Nginx oder dem Server bestehen?
Ich frage mich, wie dies verfolgt wird? Im Speicher? Oder vielleicht mithilfe des letzten Zugriffszeitstempels des Dateisystems?
Ich kann dazu keine Informationen finden.
Wie ist die Info, wenn die LRU-Datei nicht ermittelt werden kann (aufgrund eines Neustarts)
Bearbeiten:
Ich bin mir des Cache-Loader-Prozesses von Nginx bewusst. Ohne diesen Prozess wären die Cache-Dateien überhaupt nicht persistent.
Gemäß der Dokumentation umfasst dieser Ladevorgang auch die Metadaten, ohne nähere Angaben dazu zu machen, um welche Metadaten es sich handelt.
Die Frage ist, ob diese Metadaten auch den Zeitstempel des letzten Zugriffs enthalten.
Allerdings: Damit es enthalten sein kann, muss es erst einmal geschrieben werden.
Ich habe ein inotifywait für eine Datei eingerichtet und es angefordert. Das ist das Ergebnis der HTTP-Anforderung an eine Cache-Datei:
cache-filename OPEN
cache-filename ACCESS
cache-filename CLOSE_NOWRITE,CLOSE
Da es scheinbar zu keiner Veränderung der Datei kommt, lässt sich zunächst davon ausgehen, dass die LRU-Daten nicht auf die Platte geschrieben werden und somit nicht persistent sind.
Aber: Die Daten könnten trotzdem woanders hingeschrieben werden. Sie könnten auch später von einem anderen Prozess vom RAM auf die Festplatte (in die Cache-Dateien) geschrieben werden. Die Daten sind also persistent, es besteht nur keine Garantie, dass sie auf der Festplatte aktuell sind.
Damit bleibt die Frage immer noch unbeantwortet.
Antwort1
Es scheint, dass nginx die Zugriffszeit auf die Datei verwendet, um anzugeben, was LRU sein soll. Bei der Überprüfung der atime auf einer Flotte von Servern, von denen einige aufgrund anderer Festplattennutzung mit kleineren Caches partitioniert sind als andere, scheint es, dass Server mit kleineren Caches und höherem LRU-Druck keine Dateien über einem bestimmten Alter haben, gemessen mit atime (-amin in find). Der Befehl, mit dem ich dies festgestellt habe, lautet:
for i in `seq 1000 100 4000`; do
echo -n "Files accessed more than $i minutes ago: "
find /opt/nginx-cache/data -type f -amin +$i | wc -l
done
Und die Ausgabe von einem unserer Server:
Files accessed more than 1000 minutes ago: 52154
Files accessed more than 1100 minutes ago: 40582
Files accessed more than 1200 minutes ago: 25527
Files accessed more than 1300 minutes ago: 19567
Files accessed more than 1400 minutes ago: 13384
Files accessed more than 1500 minutes ago: 7683
Files accessed more than 1600 minutes ago: 4597
Files accessed more than 1700 minutes ago: 3038
Files accessed more than 1800 minutes ago: 1916
Files accessed more than 1900 minutes ago: 1251
Files accessed more than 2000 minutes ago: 837
Files accessed more than 2100 minutes ago: 585
Files accessed more than 2200 minutes ago: 459
Files accessed more than 2300 minutes ago: 365
Files accessed more than 2400 minutes ago: 258
Files accessed more than 2500 minutes ago: 101
Files accessed more than 2600 minutes ago: 8
Files accessed more than 2700 minutes ago: 0
Files accessed more than 2800 minutes ago: 0
Files accessed more than 2900 minutes ago: 0
Files accessed more than 3000 minutes ago: 0
Wenn dies korrekt ist, liest der Cache Loader wahrscheinlich den Atime der Dateien beim Neustart, um die LRU-Dateien nach Bedarf korrekt zu löschen.
Antwort2
Dieses Dokumenthttp://czerasz.com/2015/03/30/nginx-caching-tutorial/beschreibt, dass es einen Prozess namens „Cache Loader“ gibt. Dieser wird nur einmal (beim Start) ausgeführt und lädt die Metadaten in die Speicherzone. Er wird in Iterationen ausgeführt, bis alle Schlüssel geladen sind.