【问题标题】:How to catch OutOfMemory errors on Amazon EBS (Elastic BeanStalk)如何在 Amazon EBS (Elastic BeanStalk) 上捕获 OutOfMemory 错误
【发布时间】:2012-08-04 05:22:00
【问题描述】:

这是一个棘手的问题 - 我们有一个 Java Web 应用程序,部署在 Amazon ElasticBeanStalk 上的 Tomcat Web 服务器上。我们相信我们有内存泄漏 b/c 似乎 JVM 每天晚上都会因 OutOfMemory 异常而崩溃。 问题是崩溃后,EBS 会自动废弃旧的 EC2 实例并启动一个新实例。所有的日志和信息也会被废弃......

我现在正在开发一个自定义 CloudWatch 指标来监控 JVM 的内存(你会认为应该有一个准备好的......)但这不会帮助我生成堆转储

有没有人遇到过类似的问题并且知道如何在 EBS 上捕获这些错误?

【问题讨论】:

  • 我怎么感觉你的问题不太清楚。我们在 Amazon EBS 上也有我们的 tomcat 服务器,我已经看到过几次内存不足错误,但该错误仅使 tomcat 崩溃并且对 EC2 实例没有影响。将您的 EBS 实例视为普通服务器。 Tomcat 中的崩溃永远不会重新启动机器。
  • EBS 是弹性 beanstalk,而不是存储服务 (S3)。 EBS 的部分功能是自动负载平衡,您可以在其中定义根据当前流量自动启动和终止的最小和最大实例。实例的最小数量不能低于 1,因此如果您有一个正在运行的实例并且 tomcat 停止响应 HTTP 请求,那么 EBS 将自动终止 EC2 实例并启动一个新实例。这不是 EBS 最基本的功能吗???

标签: java out-of-memory amazon-ebs


【解决方案1】:

考虑像 Sumologic 这样的日志收集服务。您指定的日志文件将被收集并可供在线分析。因此,即使您的 EC2 实例被替换,您也可以进行取证以查看它们发生了什么

【讨论】:

    【解决方案2】:

    这听起来确实像是不寻常的 EC2(不是 EBS)实例行为。有趣的是,如果 Tomcat 倒下,那么机器实例就会受到影响(在停止或终止方面)。

    这是我建议诊断的:

    1. 读取正在运行的实例以检查/玩游戏
    2. 看一下“终止保护” - 是否设置为“启用” - 这可以解释问题的“报废”部分(如果报废意味着实例终止并被删除)。您可以使用 AWS 控制台在 EC2 实例的属性中找到它。
    3. 查看配置 Tomcat 服务器的 Java 内存设置。也许最大值比虚拟机大(Xmx)!?如果是这样,也许 Tomcat 实际上是在内存不足的情况下运行机器,这可以解释 EC2 对内存不足的一些响应。我假设您的意思是“停止”而不是“报废”,否则您怎么知道您遇到了内存不足错误?
    4. 如果您手动终止正在工作的实例上的 tomcat/java 进程,该实例是否仍可运行(或者您是否被启动而实例停止)?如果仅仅因为你停止了 tomcat 而发生了某些事情,这意味着某个监控过程正在启动并明确地关闭机器。
    5. 使用 -XX:-HeapDumpOnOutOfMemoryError 生成转储文件 - 这将帮助您找出泄漏的位置,并有望解决根本原因。

    祝你好运。希望对您有所帮助。

    【讨论】:

    • 嗨jowierun,很抱歉回复晚了。这是一个 EBS 问题,而不是 EC2(请参阅我对问题帖子的评论,EBS 的负载平衡是您所指的“一些监控过程”。它在 EC2 之上运行,但负责实例的“报废”并开始新的一)我们从来没有解决实例报废的问题,但我们确实通过用热点替换 openjdk 并升级到最新的 AWS SDK 来解决内存不足的问题。我将查看“终止保护”并手动杀死 tomcat
    猜你喜欢
    • 2017-01-12
    • 2013-06-12
    • 2014-12-30
    • 2016-02-06
    • 2014-09-15
    • 2013-06-14
    • 2013-06-08
    • 2018-10-13
    • 2019-01-10
    相关资源
    最近更新 更多