内存溢出(OOM)演练

通过注入进程不断消耗内存,模拟云服务器ECS发生OOM(即内存溢出)情况,测试业务进程是否会被终止、检测系统恢复能力、验证监控和告警机制的有效性等,并基于演练结果制定应对策略,确保生产环境发生OOM时系统能够迅速恢复正常运行,降低业务中断风险。

什么是OOM和OOM Killer

OOM(Out Of Memory)指在操作系统中出现可用内存不足,无法满足进程的内存申请需求的场景,可能会导致进程、系统不稳定。为应对此场景,Linux操作系统通过OOM Killer内核机制对各个进程评分(oom_score),优先终止优先级低,内存占用多的进程以释放内存,防止因系统内存耗尽而触发不可控的业务和系统崩溃。

实现原理

本方案使用云助手插件ACS-ECS-HighMemory,注入前计算需要分配的内存大小,然后启动trigger_oom注入进程,并以一定速率消耗内存,直至达到目标内存占用。发生OOM时,操作系统根据进程评分选择终止的进程,该评分由进程占用内存大小和该进程的oom_score_adj计算所得。因此,在故障注入时可以调整注入进程的oom_score_adj参数,使操作系统在OOM发生时选择终止业务进程或注入进程。oom_score_adj参数取值范围-1000到1000,默认值为0,值越高该进程越容易被终止,为-1000时表示禁止OOM Killer终止该进程。

使用指南

演练准备

请确保您的ECS实例已安装云助手Agent,并且云助手状态正常。具体操作,请参见查看云助手状态及异常状态处理

故障注入

  1. 登录ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 使用具有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(秒)。

  3. 检查故障注入是否成功。

    • 未发生OOM场景:

      • 执行top命令,系统已使用内存达到目标使用率,说明故障注入成功。

      • 在控制台实例监控或云监控中,若内存使用率达到目标使用率,说明故障注入成功。

        image

    • OOM场景:在系统日志中搜索与Out of memory相关的日志。

      dmesg -T | grep "Out of memory" 

      如下所示,表示ECS实例中已发生OOM,说明故障注入成功。并判断终止的进程是否为目标进程,如未杀死目标进程可调整score参数。

      image

故障恢复

如指定目标内存使用率,您可以使用以下方式,移除注入的故障。

  • 方法一(推荐):在ECS实例中执行故障恢复命令,查看内存使用率是否下降到故障注入前的水平。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params recover
  • 方法二:等待超时自动释放故障,系统默认在达到设置的内存使用率后,持续300秒后自动释放内存。

未指定目标内存使用率,会触发OOM场景,一般系统会自动恢复。建议对ECS执行重启,防止非预期的进程被意外终止。

演练案例

  1. 故障注入,预期占用90%内存,速率20 MB/s,持续时间120s。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,percent=90,rate=20,duartion=120

    回显类似如下所示时,说明故障注入成功。

    image

  2. 查看注入效果。

    使用top命令查看

    1. 执行top命令后,按M键按内存占用大小排序,然后按m键显示内存占用进度条。

      可以看到当前内存使用率为90.2%,注入进程trigger_oom占用内存84.4%。

      image

    2. 超时后,系统自动释放内存。内存回到演练前水平,注入进程退出。

      image

    在控制台实例详情监控查看

    image

    查看控制台实例详情,监控中的内存使用率图表,系统的内存使用率在注入后内存以一定速率上升,随后到达目标内存90%,持续120秒后内存使用率跌至注入前水平,演练恢复。

常见的OOM原因及解决方案