【发布时间】:2015-02-22 01:30:15
【问题描述】:
我有以下设置:
- Perl 服务在容器中运行并将日志写入
STDERR - logspout 将这些日志发送到远程服务器进行归档
在 600 MB RAM 的机器上。
我还定期截断日志:
/var/lib/docker/containers/CID/CID-json.log
按照here 的建议避免 100% 磁盘情况。
问题
Docker 守护进程从低内存使用开始,最初为 1%,在容器运行 2 天后缓慢增加到 40%。
参考
Docker 守护进程内存泄漏已在 this issue 和 this issue 中讨论过。但是他们现在都关闭了,说在提交时合并。我正在运行 最新的主要版本 docker(Docker 版本 1.4.0,构建 4595d4f),但仍然面临内存使用量单调增加的问题。
编辑:我做了这个实验:只需在容器中运行一个 bash 进程,打印出很多行到 STDERR,docker daemon 进程的内存使用加速非常快
docker 是否会做一些log buffering 并且即使底层日志文件 (/var/lib/docker/containers/CID/CID-json.log) 被清除也不释放内存?
显然有no way 来清除日志。 this commit 会为长时间运行的任务解决这个问题吗?
我不知道为什么 docker daemon 的内存使用量不断增加。如何调试此问题?
【问题讨论】:
-
至少尝试将应用程序的输出发送到 /dev/null 或日志文件,而不是发送到 STDOUT/STDERR。看看这是否能解决你的问题。然后,您可以查明日志记录是否会导致内存消耗。
-
您如何测量内存使用情况?在我的系统上,我立即获得 330MB 的 VmSize,但 RSS 为 14MB。 RSS 不太适合这种讨论,因为它会根据机器正在做什么而上下波动。
-
我使用 linux top 命令测量了内存使用情况。 docker 守护进程从低内存使用开始,它会慢慢加速,这可以在运行 bash docker 容器并将大量文本回显到 stdout 的几分钟内看到。内存加速最终导致OOM崩溃
-
我用
yes试过了;我可以让 Docker 使用大量 CPU,但不会增加内存。也许我使用了不同的选项——你在docker run上使用了-dti中的哪一个?也许发布一个完整的最小复制?
标签: memory docker lxc dockerfile