Docker是否没有正确报告内存使用情况?

6

在使用docker进行一些长时间测试(没有内存限制的docker 1.5和1.6)时,在centos 7 / rhel 7操作系统上观察运行容器的systemd-cgtop统计数据,我发现了似乎非常高的内存使用率。通常情况下,非容器化状态下运行的特定应用程序只使用大约200-300兆字节的内存。在一个为期3天的时间段内,我看到systemd-cgtop报告我的容器使用了13G的内存。虽然我不是专业的Linux管理员,但我开始深入研究这个问题,这让我想到了以下文章:

https://unix.stackexchange.com/questions/34795/correctly-determining-memory-usage-in-linux

http://corlewsolutions.com/articles/article-6-understanding-the-free-command-in-ubuntu-and-linux

基本上我理解的是,要确定系统单元内的实际可用内存,需要查看“free -m”中的-/+缓存/缓冲区:而不是顶部行,因为我还注意到“free -m”中的顶部行会随着使用的内存增加而不断增加,并且不断显示减少的可用内存量,就像我通过systemd-cgtop观察到的那样。如果我观察-/+缓存/缓冲区:行,我将看到实际使用/可用的稳定内存量。此外,如果我在主机上观察top中的实际进程,我可以看到进程本身仅使用不到1%的内存(32G的0.8%)。
我有点困惑这里发生了什么。如果我为容器设置500-1000M的内存限制(我认为由于交换空间而变为两倍),即使进程本身没有使用那么多内存,我的进程是否最终会在达到内存限制时停止?如果有人对前者有任何反馈,那将是很好的。谢谢!
2个回答

1
我在CentOS 7中使用了一段时间的docker,对此感到困惑。查看github的问题链接,似乎这个版本中的docker stats有些误导。

https://github.com/docker/docker/issues/10824

所以我只是忽略了从 docker stats 获取的内存使用情况。


0
一年过去了,但我在这里添加一个答案,以供其他有兴趣的人参考。如果您设置了内存限制,我认为它不会被杀死,除非它无法回收未使用的内存。cgroups指标和因此docker统计数据显示页面缓存+RES。您可以查看cgroups详细指标以查看其细分。我遇到了类似的问题,当我测试内存限制时,发现容器没有被杀死。相反,内存被回收并重复使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接