![](/img/trans.png)
[英]How to detect when a Docker container reaches its configured memory limit
[英]What happens when docker container running JVM reaches memory limit?
比方说,一个 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
之后我们应该为容器留多少内存? 1. 当 JVM 达到 max_mem 限制时会发生什么?
它必须崩溃。 如果您有实时恢复或在 docker-swarm 或 kubernetes 上,它会迅速启动另一个容器。
2. 当容器达到 mem_limit 时会发生什么?
它必须报告并崩溃。 答案和上面一样。
3.它是否重新启动有或没有OOM错误日志消息?
它给出了 OOM 错误。 问题1,错误日志在容器内,需要登录死容器查看日志。 问题2,错误日志来自docker,docker日志必须显示。 Docker 日志也会显示您的容器日志。
4. 在哪里可以看到这些日志?
在上面的问题中回答
5. max_mem 之后我们应该为容器留多少内存?
为您的应用程序进行内存模型设计,并添加一个缓冲区并根据此限制您的容器。 如果您的容器因 OOM 而不断崩溃,请确保修复您的应用程序代码
6. 线程如何影响内存限制?
线程是一个运行器,它使用内存或磁盘中的资源。 线程的数量阻塞内存并不是因为它们数量太多,而是因为它们在创建时携带的内存中的本机数据。
希望我已经回答了你的问题。
查看文档,似乎有一个 memswap_limit 选项,所以我认为可以安全地假设将使用交换。 它可能会崩溃,因为 jvm 擅长于此,但我想它只会运行缓慢。
线程本身不会变慢,但它本质上会因交换而导致读/写速度变慢而成为瓶颈。
你的 max mem 问题是一个很难回答的问题,而不会搞砸它。 你可能会发现有人推荐 10-20% 的空间,但你真的应该试着找到你自己的最佳点。
注意:14gb ram 对于单个容器来说已经很多了。 如果可能,您应该考虑在多个容器上分配工作负载。 Docker run 允许您使用 --scale arg 扩展容器,并且诸如 kubernetes 之类的编排平台可以为您管理该过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.