我有一个 Docker 容器在 1G RAM 的主机上运行(同一主机上还有其他容器运行)。这个 Docker 容器中的应用程序会解码一些图像,这可能会消耗大量内存。
有时,这个容器会退出。我怀疑这是由于内存不足,但不是很确定。我需要一种方法来找到根本原因。那么有没有办法知道这个容器的死亡发生了什么?
原文由 Li Bin 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个 Docker 容器在 1G RAM 的主机上运行(同一主机上还有其他容器运行)。这个 Docker 容器中的应用程序会解码一些图像,这可能会消耗大量内存。
有时,这个容器会退出。我怀疑这是由于内存不足,但不是很确定。我需要一种方法来找到根本原因。那么有没有办法知道这个容器的死亡发生了什么?
原文由 Li Bin 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以通过阅读日志来了解容器内的进程是否被 OOMkilled。 OOMkills 由内核启动,因此每次发生时都会在 /var/log/kern.log
中出现一堆行,例如:
python invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=995
oom_kill_process+0x22e/0x450
Memory cgroup out of memory: Kill process 31204 (python) score 1994 or sacrifice child
Killed process 31204 (python) total-vm:7350860kB, anon-rss:4182920kB, file-rss:2356kB, shmem-rss:0kB
原文由 styrofoam fly 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答614 阅读✓ 已解决
1 回答564 阅读
2 回答241 阅读✓ 已解决
其他人提到
docker logs $container_id
来查看应用程序的输出。这永远是我要检查的第一件事。接下来,您可以运行
docker inspect $container_id
来查看状态的详细信息,例如:重要的一行是“OOMKilled”,如果您超过容器内存限制并且 Docker 杀死您的应用程序,这将是正确的。您可能还想查找退出代码以查看它是否确定了您的应用退出的原因。
请注意,这仅表明 docker 本身是否会终止您的进程,并要求您在容器上设置内存限制。在 docker 之外,如果主机本身内存不足,Linux 内核可能会终止您的进程。发生这种情况时,Linux 通常会写入 /var/log 中的日志。使用 Windows 和 Mac 上的 Docker Desktop,您可以在 docker 设置中调整分配给嵌入式 Linux VM 的内存。