You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Fargate 1.3.0的ECS上输出Java堆转储至持久化存储

在Fargate 1.3.0中处理Java应用OOM HeapDump持久化到S3的方案

一、排查你的FluentBit配置错误

你的FluentBit配置存在拼写错误和路径匹配问题,修正要点如下:

1. 拼写错误修正

原配置的多处拼写错误会直接导致FluentBit无法正常运行:

  • Pefresh_Interfal → Refresh_Interval
  • regsion → region
  • delivery_strysteam → delivery_stream

2. 路径与挂载问题

FluentBit的Path必须指向主容器与Sidecar共享存储卷中的HeapDump输出路径,而非通用的/logs/*。你需要:

  • 在Fargate任务定义中添加emptyDir类型的共享卷(Fargate 1.3.0支持该类型卷)
  • 主容器将该卷挂载到指定目录(比如/shared),并通过JVM参数指定HeapDump输出路径:-XX:HeapDumpPath=/shared/heapdump-$(date +%Y%m%d%H%M%S).hprof
  • Sidecar容器同样挂载该共享卷,FluentBit的Path配置改为/shared/*.hprof

修正后的FluentBit配置示例

[INPUT]
    Name tail
    Path /shared/*.hprof
    Refresh_Interval 5
    Tag jvm-heapdump

[OUTPUT]
    Name firehose
    Match jvm-heapdump
    region ap-northeast-1
    delivery_stream XXX

3. 权限补充

确保Fargate任务执行角色拥有以下权限:

  • firehose:PutRecord和firehose:PutRecordBatch(用于向Kinesis Firehose写入数据)
  • 共享卷的读写权限(任务定义中需配置正确的挂载点权限)

二、替代方案:主容器内直接上传HeapDump到S3

如果Sidecar模式配置复杂,可直接在主容器中通过JVM触发脚本上传HeapDump到S3,步骤如下:

1. 准备上传脚本

在主容器镜像中添加脚本(比如/app/upload-heapdump.sh),内容如下:

#!/bin/bash
HEAPDUMP_PATH=$1
aws s3 cp $HEAPDUMP_PATH s3://your-target-bucket/heapdumps/

给脚本添加执行权限:chmod +x /app/upload-heapdump.sh

2. 配置JVM参数

在SpringBoot应用的启动参数中添加:

-XX:OnOutOfMemoryError="sh /app/upload-heapdump.sh /shared/heapdump.hprof" -XX:HeapDumpPath=/shared/heapdump.hprof

(同样需要挂载emptyDir卷到/shared目录)

3. 权限配置

给Fargate任务执行角色添加s3:PutObject权限,允许上传到目标S3桶。

优势

  • 无需额外Sidecar容器,减少资源占用
  • 逻辑直接,避免Sidecar配置错误

三、其他注意事项

  • HeapDump文件可能较大,需确保Fargate任务的磁盘空间足够(Fargate 1.3.0默认任务存储为20GB,需根据应用内存大小调整)
  • 若使用Firehose转S3,需确保Firehose配置了正确的S3目标桶,且桶有足够存储容量
  • 测试OOM场景时,可编写简单的内存溢出代码触发,验证HeapDump是否正常生成并上传

内容的提问来源于stack exchange,提问作者YutaSaito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:46:01