如何获取运行中Fargate ECS任务的内存转储以排查内存占用过高问题
获取运行中AWS Fargate ECS任务dotnet core应用内存转储方案
前置配置要求
- ECS任务定义需开启
executeCommand功能,对应任务执行角色需附加包含以下权限的策略:ssmmessages:CreateControlChannelssmmessages:CreateDataChannelssmmessages:OpenControlChannelssmmessages:OpenDataChannel
- 本地环境需安装AWS CLI v2及
session-manager-plugin插件 - 业务Docker镜像需预装dotnet-dump全局诊断工具,可在Dockerfile中添加如下构建逻辑:
# 安装dotnet全局诊断工具 RUN dotnet tool install -g dotnet-dump ENV PATH="$PATH:/root/.dotnet/tools"
注意:如果你的dotnet应用运行在非root用户下,需要确保对应用户拥有dotnet-dump的执行权限,以及转储文件存储路径的写入权限
生成内存转储操作步骤
- 提前记录目标Fargate任务所属集群名称、任务ID、对应容器名称
- 使用ECS Exec命令进入运行中的容器:
aws ecs execute-command --cluster <替换为你的集群名> --task <替换为目标任务ID> --container <替换为容器名> --command "/bin/sh" --interactive - 进入容器后执行以下命令获取dotnet应用的进程ID:
dotnet-dump ps - 对目标进程生成内存转储文件:
dotnet-dump collect -p <替换为上一步获取的进程ID> -o /tmp/ecs-fargate-mem-dump.dmp
提示:生成转储文件的过程会短暂占用额外内存,请尽量在内存占用未达到容器资源限制阈值时操作,避免任务被系统OOM终止
导出转储文件到本地
Fargate不支持直接从容器下载文件,可选择以下两种方案导出:
- 方案1:在容器内安装AWS CLI,将生成的
.dmp文件上传到有权限的S3存储桶,再从S3控制台/CLI下载到本地 - 方案2:通过会话管理的端口映射能力,使用nc等工具完成文件跨端传输
转储分析
下载到本地的转储文件可直接使用JetBrains dotMemory、Visual Studio等工具打开,和本地运行时的内存分析逻辑完全一致,可直接对比本地、线上的内存对象分布、GC根引用、未释放资源等数据,定位两地运行环境的内存差异原因
内容的提问来源于stack exchange,提问作者Subramanya Adiga
相关产品推荐
相关产品推荐

