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 in find)。我用来查看此内容的命令是:

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

如果这是正确的,那么缓存加载器可能会在重新启动时读取文件的访问时间,以根据需要正确删除 LRU 文件。

答案2

这个文件http://czerasz.com/2015/03/30/nginx-caching-tutorial/描述了一个称为“Cache loader”的进程。它只运行一次(启动时),并将元数据加载到内存区域中。它会迭代运行,直到所有键都加载完毕。

相关内容