Docker 容器在性能测试期间被杀死

Docker 容器在性能测试期间被杀死

我需要了解为什么 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

相关内容