NGINX max_size 和 keys_zone,无法在缓存键区域中分配节点

NGINX max_size 和 keys_zone,无法在缓存键区域中分配节点

我们有一个非常动态且流量很大的应用程序,并且正在使用 NGINX 缓存动态 URL。我们希望缓存这些 URL 以应对重复请求。

我们在扩展时遇到过几次问题,当我们达到最大条目数时,keys_zone服务器开始抛出 500 错误,并且服务器对从未请求过的新 URL/文件做出空白响应。请参阅Nginx:尽管有足够的空间,但“缓存键区域中没有内存”以供参考

错误示例:

[crit] 30568#0: ngx_slab_alloc() failed: no memory in cache keys zone "PAGES"`
[alert] 27697#27697: could not allocate node in cache keys zone "PAGES"

我们的缓存:

proxy_cache_path /usr/share/nginx/cache levels=1:1:2 keys_zone=PAGES:50m inactive=7d max_size=900m;

扩大keys_zone大小或重新启动可以暂时解决问题。但我们希望维护一个固定的缓存,清除旧的未使用条目,而不是扩大 keys_zone 以支持我们可以服务的每个文件/URL。

如果有人了解 NGINX 内部工作原理,请问:

  1. 我理解我们在 中创建的键过多keys_zone。如果我们将 做得max_size足够小,它会停止在 中创建新条目keys_zone,而是覆盖现有条目吗?
  2. inactive参数是否与 有关系keys_zone?由于我们的非活动集很长,这会保留 中的条目吗keys_zone
  3. 有没有办法keys_zone无需重新启动 NGINX 即可清除记录?

答案1

所有文件都是这里

答案:

  1. 不,缓存管理器负责这个

特殊的“缓存管理器”进程监视由 max_size 参数设置的最大缓存大小。当超过此大小时,它将删除最近最少使用的数据。数据在由 manager_files、manager_threshold 和 manager_sleep 参数 (1.11.5) 配置的迭代中删除。在一次迭代期间,不会删除超过 manager_files 个项目(默认情况下为 100 个)。一次迭代的持续时间受 manager_threshold 参数限制(默认情况下为 200 毫秒)。在迭代之间,将进行由 manager_sleep 参数配置的暂停(默认情况下为 50 毫秒)。

  1. 是的

在 inactive 参数指定的时间内未访问的缓存数据将从缓存中删除,无论其新鲜度如何。默认情况下,inactive 设置为 10 分钟。

  1. 我猜删除缓存文件会解决问题,但不建议这样做。推荐的方法是根据您的需要配置 nginx

您应该稍微尝试一下该指令的不同参数,proxy_cache_path直到它满足您的需求。

建议:

  1. inactive=7d可能太高了,会长时间保存不必要的缓存。也许您的用例需要它,但请注意默认值为 10 分钟。

  2. 如果在“缓存管理器”运行期间创建了超过 100 个新键,那么它将无法跟上,你应该更改manager_filesand manager_threshold/ormanager_sleep参数

相关内容