caching - Nginx 内容缓存导致 Docker 内存峰值

标签 caching memory nginx docker

我正在尝试使用 Docker 内部的 Nginx 设置代理内容缓存,但我的容器遇到内存问题。实际的 Nginx 实现工作正常(页面被缓存并按预期提供),但是一旦页面开始被缓存,我的容器内存(用“docker stats”测量)就会增长得非常快。

根据 Nginx 文档 ( https://www.nginx.com/blog/nginx-caching-guide/ ),我预计每缓存 8,000 个页面会增加 1MB 左右,但增长幅度要大得多 - 每 8000 个页面可能会增加 40MB 左右。此外,当在我的容器内运行“top”时,nginx 进程内存看起来很正常 - 几 MB - 而我的容器内存却在飙升。

似乎存储在特定目录中的缓存页面本身正在占用内存?情况不应该是这样,因为只有缓存键应该位于内存中。我想我已经测试了大约 25,000 个页面被缓存 - 容器内存永远不会下降。此外,如果我只是在关闭缓存的情况下代理请求,则不会出现容器内存峰值。

我正在运行一个非常基本的 nginx 配置设置 - 几乎在 Nginx 文档链接中详细介绍了这些内容。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g
             inactive=60m use_temp_path=off;
server {
    ...
    location / {
        proxy_cache my_cache;
        proxy_pass http://my_upstream;
    }
}

经过测试的 Docker 镜像 - 官方 nginx 镜像,安装了 nginx 的 alpine:3.4,安装了 nginx 的 centos:7

测试的 Docker 版本:Docker for Mac 1.12.1、Docker 1.11.2(在 Kubernetes 上)

Grafana dashboard showing memory growth

最佳答案

哇,我对我的应用程序(不是 nginx)做了几乎相同的事情(检查 docker 统计信息,然后使用 graphana 与 cadvisor 和 influxDB 来绘制增长情况)。我同意您的结论,即页面缓存有助于内存的增加。 在深入研究该容器的 cgroups 指标后,我解决了自己的问题:https://stackoverflow.com/a/41687155/6919159

如果您按照我的回答中所述设置容器的内存使用限制,您应该会看到容器回收内存。希望它能有所帮助,尽管已经过去两个月了!

关于caching - Nginx 内容缓存导致 Docker 内存峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41048742/

相关文章:

node.js - 使用多个 Docker 容器 VS 标准 Node 集群时的性能和可靠性

caching - 某些 Google CDN 资源的有效期很短

android - 如何在 Glide 中缓存图像

python - 在 GPU 上运行时使用 TensorFlow 内存 : why does it look like not all memory is used?

c++ - 关于STL列表中插入元素的一个问题

memory - 大数据集上的逻辑回归

nginx - 如何更改 NGINX 中 LUA 的日志消息格式?

ruby-on-rails - Rails 如何生成 View 缓存键?

objective-c - 在没有新获取的情况下更新 NSFetchedResultsController 的结果

ruby-on-rails - Rails6 + Nginx + Passenger + ActionCable = websocket 关闭