求助:AWS环境下内存达80%时自动触发HeapDump脚本
解决AWS环境下内存使用率达80%时自动生成HeapDump的问题
先帮你修正现有脚本里的内存使用率计算逻辑,补充完整触发逻辑,再讲AWS环境下怎么让这个脚本自动运行起来。
一、修正并完善内存检测+HeapDump触发脚本
你的现有脚本在内存使用率计算上存在硬编码问题(固定用512M作为总内存),而且逻辑不完整。下面是修正后的完整脚本:
#!/bin/bash # 内存使用率阈值(按需求设置为80%) MEMORY_THRESHOLD=80 # 替换为你实际的HeapDump生成脚本路径 HEAPDUMP_SCRIPT="/path/to/your/heapdump-generator.sh" # 计算当前内存使用率(已使用内存/总内存 * 100,取整数) USED_MEM=$(free -m | awk 'NR==2 {print $3}') TOTAL_MEM=$(free -m | awk 'NR==2 {print $2}') # 避免总内存获取失败导致的除以0错误 if [ "$TOTAL_MEM" -eq 0 ]; then echo "[ERROR] 无法获取实例总内存信息" exit 1 fi MEMORY_USAGE=$(( (USED_MEM * 100) / TOTAL_MEM )) echo "当前内存使用率: ${MEMORY_USAGE}%" # 触发HeapDump逻辑 if [ "$MEMORY_USAGE" -ge "$MEMORY_THRESHOLD" ]; then echo "内存使用率超过阈值,开始生成HeapDump..." # 执行HeapDump脚本 bash "$HEAPDUMP_SCRIPT" if [ $? -eq 0 ]; then echo "HeapDump生成成功" else echo "[ERROR] HeapDump生成失败" fi else echo "内存使用率未超过阈值,无需操作" fi
脚本说明
- 采用
已使用内存/总内存的方式计算使用率,适配任意内存规格的EC2实例 - 增加了异常判断,避免脚本因内存信息获取失败而报错
- 引入可配置的脚本路径变量,方便你替换为自己的HeapDump生成逻辑
- 增加执行日志输出,便于后续排查问题
二、AWS环境下的自动触发方案
在AWS上,有两种常用方式实现自动触发,你可以根据实例规模选择:
1. Cron定时检测(适合单台EC2实例)
如果服务仅运行在单台EC2上,直接用Cron定时执行检测脚本即可:
- 将脚本保存为
/opt/check-memory-heapdump.sh,并赋予执行权限:chmod +x /opt/check-memory-heapdump.sh - 编辑Cron任务:
crontab -e - 添加以下内容(每分钟执行一次检查,日志输出到指定文件):
* * * * * /opt/check-memory-heapdump.sh >> /var/log/memory-heapdump.log 2>&1
2. CloudWatch告警+SSM Run Command(适合多实例批量管理)
如果服务运行在多台EC2,或想通过AWS控制台集中管理,推荐这个方案:
- 步骤1:确保EC2实例安装SSM Agent:AWS官方AMI默认自带,自定义镜像需手动安装,实例才能接收SSM命令
- 步骤2:配置CloudWatch Agent采集内存指标:默认CloudWatch没有内存使用率指标,需要安装CloudWatch Agent并配置采集
MemoryUtilization指标 - 步骤3:创建CloudWatch告警:在CloudWatch控制台创建告警,选择
MemoryUtilization指标,设置阈值为80%;告警动作选择SSM Run Command,指定执行你的内存检测脚本(或直接执行HeapDump脚本),并选择目标实例 - 步骤4:验证触发逻辑:当实例内存使用率超过80%时,CloudWatch会触发告警,SSM自动在目标实例上执行脚本生成HeapDump
注意事项
- 确保HeapDump脚本有足够权限生成文件,且实例磁盘空间充足(HeapDump文件体积通常较大)
- 使用CloudWatch方案时,需为EC2实例的IAM角色配置SSM Run Command和CloudWatch Agent的相关权限
- 可根据实际需求调整Cron执行频率或CloudWatch告警的评估周期
内容的提问来源于stack exchange,提问作者Ricky Vijay
相关产品推荐
相关产品推荐

