【问题标题】:Docker running out of memoryDocker 内存不足
【发布时间】:2018-04-09 13:02:53
【问题描述】:

我有一些 Docker 容器 在 AWS EC2 实例上运行。容器正在运行 Java Spring Boot 应用程序。间歇性地,(到目前为止每隔几周),Docker 似乎内存不足。有时,我什至无法通过 SSH 连接回实例。

我已尝试查看每个容器中的应用程序日志文件,以了解是哪个容器导致了问题,但我找不到任何与内存相关的错误。在 Docker 日志文件中,我只能看到错误提示:

当错误发生时,docker-containerd 无法分配内存。

如何进一步解决此问题?

【问题讨论】:

  • 您是否正确地将 JVM 限制为 Docker 容器的内存限制?
  • 我在运行时没有任何内存限制,但我读到的越多,我想我也需要。
  • 这意味着您的 JVM 取决于 JVM 的版本将获取 docker 主机的内存限制,而不是错误的 docker 容器的内存限制......请参阅blogs.oracle.com/developers/… ...所以你需要设置合适的 JVM 参数来限制内存到 Docker 容器的限制。这样做会让你有机会在本地测试容器并观察 JVM 信息(Spring Boot 有指标等/内存信息;所以你也错过了监控 docker 容器内的 JVM)

标签: spring-boot docker amazon-ec2


【解决方案1】:

如果您的代码存在一些设计问题,Java 程序会“众所周知”占用内存。首先,尝试配置最大堆内存,看看效果如何。

既然你说了,

有时我什至无法通过 SSH 连接回实例。

我也会尝试限制 Docker 容器的内存使用:

Limit a container's resources

如果您的 Java 程序因内存不足而崩溃,那么我会分析应用程序并查看内存究竟在哪里被占用。

【讨论】:

  • 谢谢乔安娜。我将在这两个地方配置内存。希望那时我至少可以看到哪个容器在吹气。我还将看看是否可以找到一些实用程序,将容器内存/CPU 定期记录到 AWS Cloudwatch,以便我可以尝试了解问题何时发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2021-12-20
相关资源
最近更新 更多