由于长时间运行的进程的日志而导致 Docker 守护程序内存泄漏



我有以下设置:

  1. 在容器中运行的 Perl 服务并将日志写出到 STDERR
  2. logpout 将这些日志传送到远程服务器进行存档

在 600 MB RAM 机器中。

我还定期在以下位置截断日志:

/var/lib/docker/containers/CID/CID-json.log

按照此处的建议避免 100% 磁盘情况。

问题

Docker 守护程序开始时内存使用率较低,最初为 1%,运行容器 2 天后缓慢增加到 40%。

参考

Docker 守护程序内存泄漏在本期和本期中已经讨论过。但是它们现在都关闭了,说在提交时合并。我正在运行最新的 docker 主要版本(Docker 版本 1.4.0,内部版本 4595d4f),但仍然面临单调增加的内存使用问题。

编辑:我做了这个实验:只需在容器中运行一个bash进程,打印出很多行到STDERR,docker守护进程的内存使用速度非常快

docker 是否执行一些日志缓冲,即使清除了底层日志文件 (/var/lib/docker/containers/CID/CID-json.log)也不会释放内存?

显然没有办法清除日志。此提交能否解决长时间运行的任务的此问题?

我不知道为什么 docker 守护程序的内存使用量不断增加。如何调试此问题?

至少还有一个

与日志内存泄漏相关的未决问题:https://github.com/docker/docker/issues/9139

这可能不是您要找的,但我通常会在每天运行一段时间后运行 cron 作业以重新启动我的容器。这确保了容器始终有足够的 RAM,而且我通常会在创建容器时限制容器的最大 ram 使用量。

容器

只需几秒钟即可重新启动并提供数据,如果您没有运行高可用性服务并且可以承受几秒钟的停机时间,请考虑重新启动容器(假设您没有永久性卷)。

但是,如果您确实找到了问题的解决方案,请告诉我们。

  • docker rm $(docker ps -a -q)
  • docker rmi --force $(docker images -q)
  • docker system prune --force

需要成为根用户。

  • systemctl stop docker
  • rm -rf /var/lib/docker/aufs
  • apt-get autoclean
  • apt-get autoremove
  • systemctl start docker

最新更新