nginx 的 LRU 快取清除策略在重新啟動後是否仍然有效?

nginx 的 LRU 快取清除策略在重新啟動後是否仍然有效?

在文檔中說“

max 設定快取中元素的最大數量;當快取溢出時,最近最少使用 (LRU) 元素將被刪除;

它在 nginx 或伺服器重新啟動後是否持續存在?

我想知道這是如何追蹤的?在記憶中?或可能使用檔案系統的上次存取時間戳記?

我找不到任何相關資訊。

如果無法確定 LRU 檔案(由於重新啟動),資訊如何

編輯:

我知道 nginx 快取載入器進程。如果沒有該進程,快取檔案根本不會持久。

根據文檔,此加載過程還包括元數據,但沒有更具體地說明元數據是什麼。

問題是,這個元資料是否還包括上次存取時間戳記。

但是:為了將其包含在內,必須先將其寫入。

我在文件上設定了 inotifywait 並請求了它。這是對快取檔案的 HTTP 請求的結果:

cache-filename OPEN 
cache-filename ACCESS 
cache-filename CLOSE_NOWRITE,CLOSE 

似乎沒有發生文件修改,這導致初步結論,LRU 資料沒有寫入磁碟,因此不是持久的。

但是:資料仍然可以寫入其他地方。稍後也可以透過另一個進程將其從 RAM 寫入磁碟(寫入快取檔案)。因此資料是持久的,只是不能保證磁碟上的資料是最新的。

這仍然沒有回答這個問題。

答案1

看來 nginx 可能會使用檔案的存取時間來指示 LRU 的內容。檢查一組伺服器的atime(其中一些伺服器由於其他磁碟使用情況而使用比其他伺服器更小的快取進行分區),看起來快取較小且LRU 壓力更大的伺服器沒有超過atime 測量的特定期限的檔案( -amin在查找)。我用來看到這個的命令是:

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

我們的一台伺服器的輸出:

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

如果這是正確的,那麼快取載入器可能會在重新啟動時讀取檔案的 atime,以便根據需要正確刪除 LRU 檔案。

答案2

這個文件http://czerasz.com/2015/03/30/nginx-caching-tutorial/描述有一個稱為“Cache loader”的進程。它僅運行一次(在啟動時)並將元資料載入到記憶體區域。它會迭代運行,直到加載所有鍵。

相關內容