通过注入进程不断消耗内存,模拟云服务器ECS发生OOM(即内存溢出)情况,测试业务进程是否会被终止、检测系统恢复能力、验证监控和告警机制的有效性等,并基于演练结果制定应对策略,确保生产环境发生OOM时系统能够迅速恢复正常运行,降低业务中断风险。
实现原理
本方案使用云助手插件ACS-ECS-HighMemory
,注入前计算需要分配的内存大小,然后启动trigger_oom
注入进程,并以一定速率消耗内存,直至达到目标内存占用。发生OOM时,操作系统根据进程评分选择终止的进程,该评分由进程占用内存大小和该进程的oom_score_adj
计算所得。因此,在故障注入时可以调整注入进程的oom_score_adj
参数,使操作系统在OOM发生时选择终止业务进程或注入进程。oom_score_adj
参数取值范围-1000到1000,默认值为0,值越高该进程越容易被终止,为-1000时表示禁止OOM Killer终止该进程。
使用指南
演练准备
请确保您的ECS实例已安装云助手Agent,并且云助手状态为正常。具体操作,请参见查看云助手状态及异常状态处理。
故障注入
登录ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
使用具有sudo访问权限的用户,运行云助手插件
ACS-ECS-HighMemory
。sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,[score=paramA],[percent=paramB],[rate=paramC],[duartion=paramD]
[]
内为可选故障注入参数,参数说明:score(可选):用于设置注入进程的
oom_score_adj
取值范围为 -1000到1000,通过设置该参数选择在OOM发生时终止注入进程或业务进程。若需终止业务进程,请为注入进程设置一个负值,如-100,如业务进程未被终止,请调小score值。percent(可选):系统总内存目标占用大小,不填该参数时默认触发OOM。
rate(可选):内存占用速率,单位为MB/s,默认为0表示无限制。
duartion(可选):达到目标占用内存后的持续时间,单位为秒,超时自动释放内存,默认为300(秒)。
检查故障注入是否成功。
未发生OOM场景:
执行
top
命令,系统已使用内存达到目标使用率,说明故障注入成功。在控制台实例监控或云监控中,若内存使用率达到目标使用率,说明故障注入成功。
OOM场景:在系统日志中搜索与
Out of memory
相关的日志。dmesg -T | grep "Out of memory"
如下所示,表示ECS实例中已发生OOM,说明故障注入成功。并判断终止的进程是否为目标进程,如未杀死目标进程可调整
score
参数。
故障恢复
如指定目标内存使用率,您可以使用以下方式,移除注入的故障。
方法一(推荐):在ECS实例中执行故障恢复命令,查看内存使用率是否下降到故障注入前的水平。
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params recover
方法二:等待超时自动释放故障,系统默认在达到设置的内存使用率后,持续300秒后自动释放内存。
未指定目标内存使用率,会触发OOM场景,一般系统会自动恢复。建议对ECS执行重启,防止非预期的进程被意外终止。
演练案例
故障注入,预期占用90%内存,速率20 MB/s,持续时间120s。
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,percent=90,rate=20,duartion=120
回显类似如下所示时,说明故障注入成功。
查看注入效果。
使用top命令查看
执行
top
命令后,按M
键按内存占用大小排序,然后按m
键显示内存占用进度条。可以看到当前内存使用率为90.2%,注入进程
trigger_oom
占用内存84.4%。超时后,系统自动释放内存。内存回到演练前水平,注入进程退出。
在控制台实例详情监控查看
查看控制台实例详情,监控中的内存使用率图表,系统的内存使用率在注入后内存以一定速率上升,随后到达目标内存90%,持续120秒后内存使用率跌至注入前水平,演练恢复。
常见的OOM原因及解决方案
内存占用较高会出现系统卡顿、内部服务响应速度变慢,您可以排查并分析内存过高原因并解决。具体操作,请参见如何处理系统内存使用率过高问题?。
出现OOM可能是因为实例本身可使用的内存太少或某一个资源被频繁申请导致系统资源耗尽等,您可以分析OOM出现的原因并解决。具体操作,请参见如何处理Linux实例中的OOM问题?。