如何在不影响ECS服务的情况下捕获JVM退出堆转储?

时间:2019-03-09 20:52:02

标签: amazon-ecs

我基于JVM的应用程序在Amazon ECS上运行。在某些无法在测试环境中重现的条件下,它因OutOfMemoryError崩溃。我想捕获JVM堆转储(使用HeapDumpOnOutOfMemoryError)以查看发生了什么。但是有一个问题-因为我的应用程序使用大量内存,堆转储会花费很长时间,而ECS会杀死其中的容器,因为运行状况检查会失败。我最终得到了一个无法使用的,被截断的转储文件。

我可以通过更改运行状况检查配置来获得正确的堆转储,但它可能会影响ECS服务,因为如果没有良好的运行状况检查,群集可能会运行无响应的实例。

我正在寻找一种方法,它将使我能够自动捕获堆转储,并且对生产集群的影响最小。

2 个答案:

答案 0 :(得分:0)

我的发现方式:

  1. 准备一份与ECS服务(Service2)完全相同的副本,但以下各项除外:
    • 运行状况检查设置(禁用运行状况检查)
    • HeapDumpOnOutOfMemoryError JVM选项(启用它)
    • 节点数(设置为1)
  2. 让Service2与现有Service1一起处理生产流量(例如,通过将流量转发到Service1和Service2的负载平衡器路由HTTP流量)
  3. 等待,直到运行Service2的ECS任务的节点产生JVM堆转储
  4. 将Service2缩减到零节点

答案 1 :(得分:0)

这是在Fargate实例还是EC2周围?

无论哪种情况,您都可以在同一群集中添加EC2实例,并且即使任务失败,该节点也能够登录到主机并获取堆转储。