【问题标题】:Nginx content caching causing Docker memory spikeNginx 内容缓存导致 Docker 内存峰值
【发布时间】:2016-12-08 21:02:46
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 这可能是文件系统缓存吗?当您从容器中运行它时,free 会说什么(注意 -/+ buffers/cache 行)?
  • 当我在-/+ buffers/cache 行的“空闲”列下运行free 时,可用内存减少得非常缓慢——这与我预期的差不多。在Mem: 行上,在“缓存”列下,该值正在迅速增加。也就是说,操作系统正在将每个完整的页面缓存在内存中,但是如果应用程序进程需要内存,操作系统的页面缓存会根据需要清空吗?

标签: caching memory nginx docker


【解决方案1】:

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

如果您按照我的回答对容器的内存使用设置了限制,您应该会看到容器正在回收内存。希望对您有所帮助,虽然已经 2 个月了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多