让我们说,一个Docker容器在具有16G RAM,2个核心CPU的服务器中在其中运行JVM,以下是容器的内存限制:
mem_limit: 14G
max_mem: 13G
threads: 1
max_pool_size: 20
max_mem
是JVM使用的最大堆大小,mem_limit
是容器使用的最大内存。我正在尝试了解以下内容:
max_mem
限制时会发生什么?mem_limit
时会发生什么?max_mem
之后,我们应该为容器保留多少内存?答案 0 :(得分:1)
1。 JVM达到max_mem限制时会发生什么?
它必须崩溃。如果您有实时还原,docker-swarm或kubernetes上,它将迅速启动另一个容器。
2。容器达到mem_limit会发生什么?
它必须报告并崩溃。答案与上面相同。
3。它会在有无OOM错误日志消息的情况下重新启动吗?
它显示OOM错误。问题1,错误日志位于容器内,因此您需要登录到失效的容器中并查看日志。问题2,错误日志来自docker,docker日志必须显示它。 Docker日志还将显示您的容器日志。
4。我们在哪里可以看到这些日志?
回答上述问题
5。在max_mem之后,我们应该为容器保留多少内存?
为您的应用程序进行内存模型设计,并添加一个缓冲区并据此限制您的容器。如果您的容器由于OOM而继续崩溃,请确保您已修复应用程序代码
6。线程如何影响内存限制?
线程是运行程序,它使用内存或磁盘中的资源。线程的数量之所以会阻塞内存,并不是因为它们的数量很大,而是因为内存中的本机数据在创建时会随身携带。
希望我回答了您的问题。
答案 1 :(得分:0)
看一下文档,似乎有一个memswap_limit选项,所以我确定可以安全地假定将使用swap。它可能会崩溃,因为jvm擅长于此,但我想它运行得很慢。
线程本身不会减慢速度,但是由于交换的原因,它会因读写速度慢而成为瓶颈。
您的max mem问题是一个很难回答的问题,而且一点也不弄乱。您可能会发现有人建议您留出10-20%的净空,但您应该真正尝试找到自己的最佳位置。
注意:对于单个容器,14gb的内存很大。如果可能,您应该考虑将工作负荷分配到多个容器中。 Docker run允许您使用--scale arg扩展容器,编排平台(如kubernetes)可以为您管理过程。