我正在运行一个 Ubuntu 18.04 服务器,上面运行着 Docker (v20.10.12) 容器。我一次运行大约 5 个容器,它们通常消耗大约 1.5GB 内存,而我的服务器有 8GB 内存可用。这 5 个容器中的一个每 18-24 小时就会泄漏一次内存,它会消耗所有剩余内存并占用大约 4-5GB 的交换空间,这使我的 CPU 和磁盘使用率飙升至 100%,进而导致 OOM 终止程序生成并开始剔除进程,其中一个是 dockerd。
在 dockerd 被终止后,我无法找到发生内存泄漏的容器的日志,因为文件系统中只有 dockerd 重新启动后生成的容器的日志。因此,如果没有日志,我完全不知道容器中到底发生了什么,而这正是我想要找到的。
我找出了哪个容器泄漏了grep VmPeak /proc/{PID}/status
,并得到了 PID docker inspect -f '{{.State.Pid}}' {CONTAINER_ID}
,其中列出了一个案例中 ~11GB 的峰值内存使用量。但是,当我进入/var/lib/docker/containers/
并检查所有文件夹时,在实际的 OOM 杀手刷卡和 dockerd 重新启动时间之前,没有任何日志。还尝试查看var/log/syslog
,它只向我显示了 OOM 杀手正在执行其操作,dockerd 因各种网络和防火墙错误而崩溃。如果我错了,我应该深入研究系统日志,请告诉我。
我不一定需要获取这些日志,如果能帮助我设置其他解决方案,将日志保存在其他地方,以便下次崩溃时我可以查看它们,这也将非常有帮助,并且可能解决问题。但这与当前的问题无关,因此我理解是否会被忽视。