繁体   English   中英

当运行 JVM 的 docker 容器达到内存限制时会发生什么?

[英]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是容器使用的最大内存。 我试图理解以下事情:

  1. 当 JVM 达到max_mem限制时会发生什么?
  2. 当容器达到mem_limit时会发生什么?
  3. 它是否会在有或没有 OOM 错误日志消息的情况下重新启动? 我们在哪里可以看到这些日志?
  4. max_mem之后我们应该为容器留多少内存?
  5. 线程如何影响内存限制?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM