我需要了解为什么 docker 容器在处理过程中被杀死。
简短的背景:
我们正在 RH 机器上运行性能测试。 (机器有 64GB RAM,16 个 CPU)运行 20 小时左右后,容器将被内核杀死。
我们在容器内运行java,它的堆限制为20GB。 (将文件索引到 elasticsearch 是一个繁重的过程。)
我们还使用 ps-eF 监控 docker 内的内存消耗,并使用 Glowroot 监控堆大小。
最大堆大小进程被终止前为 6.7GB。
ps-eF表明RSS是 16977356 (1.7GB)
dmesg 输出是:
[Mon Nov 12 08:44:10 2018] [ pid ] uid tgid total_vm rss nr_ptes swapents oom_score_adj name
[Mon Nov 12 08:44:11 2018] [ 3406] 0 3406 7811475 4240564 8512 0 0 java
[Mon Nov 12 08:44:11 2018] Out of memory: Kill process 3406 (java) score 264 or sacrifice child
[Mon Nov 12 08:44:11 2018] Killed process 3406 (java) total-vm:31245900kB, anon-rss:16962256kB, file-rss:0kB, shmem-rss:0kB
如果我理解正确的话总虚拟机代表所有处理和使用的RAM匿名RSS通过被杀死的进程。这意味着我的机器应该有 25GB 的可用内存。
答案1
记忆
了解内存不足的风险
重要的是不要让正在运行的容器消耗过多的主机内存。在 Linux 主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出 OOME(内存不足异常),并开始终止进程以释放内存。任何进程都会被杀掉,包括Docker和其他重要应用程序。如果错误的进程被终止,这可能会导致整个系统崩溃。
(...)
限制容器对内存的访问
-m or --memory= The maximum amount of memory the container can use. If you set this option, the minimum allowed value is 4m (4 megabyte).
资料来源:
https://docs.docker.com/config/containers/resource_constraints/#memory