SysOM FastOOM功能使用说明

更新时间:
复制为 MD 格式

系统在发生OOM 之前,通常会长时间陷入内存回收和磁盘换页,表现为 CPU 使用率持续升高、IO Wait 居高不下、系统响应极度缓慢,甚至完全无响应,业务也会在这一阶段出现波动或失联。传统 Linux 内核的 OOM Killer 通常介入较晚,很多时候系统已接近卡死,难以及时恢复可用性。用户态 FastOOM 则会在 OOM 发生前主动介入,一旦检测到系统进入颠簸趋势,便可在用户空间按照预设策略及时终止相关进程,有效缩短故障窗口,避免业务长时间处于不可用状态。

使用限制

  • 地域限制

    本功能目前仅支持中国内地与中国香港。

  • 操作系统限制

    架构

    操作系统

    x86架构

    • Rocky Linux 9.5

    • Rocky Linux 9.1

    • Ubuntu 20.04

    • Alibaba Cloud Linux 3 容器优化版

    • Rocky Linux 8.8

    • Ubuntu 22.04

    • Alibaba Cloud Linux 3 Pro

    • Alibaba Cloud Linux 2/3

    • CentOS 7.6及更高版本,或CentOS 8

    • Anolis OS 7/8

    • Ubuntu 24.04

    ARM架构

    • Alibaba Cloud Linux 3 Pro

    • Alibaba Cloud Linux 3

前提条件

  • 如果您使用RAM用户,请确保阿里云账号(主账号)已将系统策略AliyunECSReadOnlyAccessAliyunSysomFullAccess授予RAM用户

  • 已开通控制台权限。

    首次登录操作系统控制台时,单击开通服务以开通控制台服务。

操作步骤

说明
  • 启用、修改或关闭FastOOM功能不会对您的业务产生影响。

  • 节点级别FastOOM策略跟随自定义FastOOM功能的启用状态。

  • 在启用FastOOM功能后,您可以根据实际需求选择是否启用Pod级别FastOOM策略。

启用FastOOM

  1. 访问操作系统控制台-组件管理

  2. 为目标ECS实例安装SysOM

  3. 返回组件管理页面,单击详情

  4. 单击创建配置,配置FastOOM功能。

    填写配置名称,勾选开启自定义FastOOM功能

    节点级别FastOOM策略

    填写配置信息,单击确定。可通过正则表达式匹配验证框验证所填写表达式是否可以正确匹配目标:

    例如,在左侧输入框中输入正则表达式.*sh$,右侧输入测试字符串bash,匹配成功后右侧显示绿色勾号。

    配置说明如下:

    配置

    说明

    示例

    开启节点级别FastOOM功能

    勾选后开启节点级别FastOOM。开启后节点级别FastOOM会监控节点内存压力,达到接近OOM状态时,根据下面配置杀死相关进程。

    内存压力级别

    表示节点处于何种内存压力程度时,触发杀死进程。目前,分为中内存压力、高内存压力以及自动三个选项。中内存压力意味着FastOOM会更快介入杀死进程。"自动"表示使用Alinux内核自研特性自动避免内存回收导致系统夯机。

    • 离线业务,建议设置为高。

    • 时延敏感的业务,建议设置为中。

    OOM时是否杀死整个进程组

    勾选开启后FastOOM将会杀死所选进程所属进程组的所有进程。

    触发OOM时倾向于杀死的进程名

    当满足FastOOM触发杀进程条件时,优先选取杀死的进程。您可以填写正则表达式,多个正则表达式通过,隔开。

    Java,^python表示进程名中包含Java子串或以python开头的进程将被优先杀死。

    触发OOM时避免杀死的进程名

    当满足FastOOM触发杀进程的条件时,可以通过设置避免杀死特定进程,从而确保匹配的进程不会被

    FastOOM杀死。您可以填写正则表达式,多个正则表达式通过,隔开。

    .*sh$,mysql表示进程名中以sh结尾和包含mysql子串的进程不会被用户态FastOOM杀死。

    说明
    • 节点级别FastOOM策略在内存突发超限(超过系统总内存)申请的场景中,可能无法及时在系统OOM发生前进行干预。因此,FastOOM配置的杀进程策略无法确保所匹配的进程不被内核OOM杀死。

    • 如果不配置倾向于杀死或避免杀死进程的策略,FastOOM将采用与内核OOM相同的算法,根据进程占用的内存大小及其oom_score_adj值来选择需要杀死的进程。

    • 节点级FastOOM选用"自动"内存压力选项后,会启动Alinux内核级别FastOOM,若对应的内核版本不支持,则回退至内存压力中(用户态FastOOM);(目前该选项支持内核范围:Alinux内核版本大于5.10.134-017,使用cgroupV1)。

    Pod级别FastOOM策略

    单击+,填写配置信息后单击确定

    说明

    若需要创建多个Pod级别FastOOM策略,继续单击+并填写配置信息即可。

    说明

    每个节点中通过Pod名称正则表达式匹配的Pod最多10个,超过10个则不会生效。

    配置

    说明

    示例

    Pod名称

    需要应用Pod级别FastOOM功能的Pod名称,可以通过填写正则表达式匹配。建议应用于常态运行,生命周期较长的Pod中。

    sysom匹配名称中包含sysom子串的Pod。

    命名空间

    需要匹配的Pod所在的命名空间。

    内存压力级别

    表示节点处于何种内存压力程度时,触发杀进程,目前分为中内存压力, 高内存压力两档。中内存压力意味着FastOOM会更快介入进行杀进程,离线业务建议设置为高,对时延敏感的业务建议设置为中。

    OOM时是否杀死整个进程组

    勾选开启后将会杀死所选进程所属进程组的所有进程。

    触发OOM时倾向于杀死的进程名

    当满足FastOOM触发杀进程条件时,在Pod中优先选取杀死的进程;可以填写正则表达式,多个正则表达式可通过,隔开。

    Java,^python表示进程名中包含Java子串或以python开头则被优先杀死。

    触发OOM时避免杀死的进程名

    当满足FastOOM触发杀进程条件时,在Pod中避免杀死的进程,设置后可以确保匹配的进程不会被FastOOM杀死;可以填写正则表达式,多个正则表达式可通过','隔开。

    .*sh$,mysql表示进程名中以sh结尾和包含mysql子串的进程不会被FastOOM杀死。

  5. 在左侧导航栏,单击系统管理。在已纳管页签中勾选要应用FastOOM功能的节点,单击变更组件

  6. 选择已创建的SysOM组件配置,单击提交

修改FastOOM

  1. 访问操作系统控制台-组件管理

  2. 单击SysOM组件详情

  3. 单击对应配置项操作列的修改

    配置列表以表格形式展示所有已创建的配置项,包含名称及关联节点数。

  4. 修改配置项信息,单击确定

关闭FastOOM

  1. 访问操作系统控制台-组件管理

  2. 单击SysOM组件详情

  3. 单击对应配置项操作列的修改

    配置列表展示所有配置项名称及关联节点数。

    说明

    如果您不再需要该配置项,找到需要删除的配置项,然后在操作列单击删除,确认提示信息后单击确定。如果选择该方案,则后续步骤无需执行。

  4. 关闭FastOOM。

    • 关闭FastOOM功能

      取消勾选开启自定义FastOOM功能,单击确定

    • 关闭Pod级别FastOOM功能

      单击删除,再单击确定

实践案例

节点级别FastOOM解决系统OOM前抖动

系统在发生OOM之前经常会出现CPU利用率高,系统负载高,IO Wait高甚至夯机等问题,引起业务抖动或长时间失联。特别是内存使用总量接近触发内核OOM时,问题尤为严重。下面以该问题为例,介绍如何通过配置节点级别用户态OOM功能,解决该问题。

问题现象

实例的内存占用在某个时间点开始迅速增加,接近系统的总内存,但尚未超过系统总内存。由于未超过系统总内存,此时不会触发内核的OOM,处于near-OOM状态。

通过top命令可以看到系统的CPU sys利用率和iowait利用率和系统负载都持续都飙高,kswapd0线程占用非常高的CPU进行内存回收。

top - 15:52:05 up 9 days,  5:02,  0 users,  load average: 27.02, 9.73, 3.86
Tasks: 192 total,   2 running, 138 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.2 us, 43.0 sy,  0.0 ni,  0.5 id, 55.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7650272 total,   124224 free,  7399088 used,   126960 buff/cache
KiB Swap:        0 total,        0 free,        0 used.    45000 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   82 root      20   0       0      0      0 R  56.8  0.0   5:44.74 kswapd0
 3078 root      20   0  767676  25400      0 S  14.1  0.3  18:13.97 kube-proxy
 4731 root      20   0  231612  13952      0 R   2.0  0.2 161:01.80 AliYunDunMonito
4039635 65532   20   0  736560  10292      0 S   2.0  0.1   0:00.90 kube-rbac-proxy
 3462 root      20   0  735260  15652      0 S   1.4  0.2  18:35.64 node-cache
 4361 root      20   0 1300652  86524      0 S   1.4  1.1  39:08.82 ilogtail
4039689 root    20   0 2218752  57740   2084 D   1.4  0.8   0:01.77 unity-mon
 2138 root      20   0 1303484  67668      0 D   1.1  0.9 216:42.64 kubelet
 2483 root      20   0 2438684  10476      0 S   1.1  0.1  65:04.99 argusagent
 3078 root      20   0  767676  25400      0 S   1.1  0.3  18:13.39 kube-proxy
 3908 root      20   0  147952  34328      0 S   1.1  0.4  41:06.41 AliYunDun

通过操作系统控制台的系统概览可以观察到,在发生OOM事件的同时,用户态收包出现了延时,导致业务发生了抖动。

异常事件列表中记录了一条网络用户态发生收包延时的关注级别事件,以及一条显示系统内存使用达7.62 GB、剩余仅112.48 MB节点OOM劳机预测及检测危险级别事件。

解决方案

针对上述场景,使用Alibaba Cloud Linux控制台的FastOOM功能,可以有效预防系统陷入near-OOM的夯机问题。通过上述的组件配置页面开启节点级别的FastOOM功能,由于业务是时延较为敏感的业务,内存压力选择中,且设置业务程序(以python启动,进程名包含python子串)为避免被OOM进程且设置无关的日志程序优先杀死。

此处触发FastOOM时倾向于杀死的进程名配置为logcollect

开启后,当节点内存水位处于near-OOM状态时,用户态提前介入,根据配置杀死了如下进程,从而释放了部分内存避免系统进入了夯机状态。您可以通过操作系统控制台的系统概览功能查看FastOOM介入相关记录。

该记录显示FastOOM杀死了kube-rbac-proxy(内存占用8 MiB)、node_exporter(内存占用8 MiB)、unity-mon(内存占用50 MiB)和logcollect(内存占用1024 MiB)。

由于kube-rbac-proxynode_exporter等进程oom_score_adj被设置为接近999,FastOOM会匹配内核策略优先杀死这些进程,然而,杀死这些进程后释放的内存量较少,系统仍然处于near-OOM状态。FastOOM杀死了配置优先杀死的logcollect进程,避免系统进入near-OOM的抖动状态。

Pod级别FastOOM杀死进程策略

问题现象

内核提供了唯一接口/proc/<PID>/oom_score_adj来控制内核OOM Killer选取杀死进程的策略。若设置为-1000,表示完全豁免该进程(不会被 OOM Killer 杀死);若设置为1000,表示优先杀死该进程。在Kubernetes环境中,如果要控制Pod中运行多个业务场景的OOM策略,需要修改Pod中特定进程的oom_score_adj,对于短生命周期的守护进程,修改oom_score_adj的难度较高。

解决方案

操作系统控制台提供较为灵活的Pod级别的OOM杀进程策略配置,可以灵活配置Pod中容器内发生OOM时,避免和优先杀死的进程。

  1. 例如,在集群中,通过名为test-alinuxDaemonSet,在每个节点上部署了相应的Pod。

    DaemonSet详情页显示命名空间为default,当前有3Pod均处于Running状态,部署在不同节点上。

  2. 设置Pod级别FastOOM策略。

    • 为了匹配相应的Pod,Pod名称应填写为test-alinux(正则表达式将匹配在不同节点上的test-alinux-xxxPod),命名空间设置为default。

    • 控制OOM时杀进程策略,将内存压力级别设置为高,触发用户态OOM的时机接近于内核OOM的时机。

    • 配置优先杀死特定进程和避免杀死业务进程和Pod中的1号进程,从而避免Pod重启或影响业务。

    在配置中,触发FastOOM时倾向于杀死的进程名填写为malloc触发FastOOM时避免杀死的进程名填写为unity,sh

  3. 配置下发到对应节点后,当Pod中容器内存使用超过容器的限制后发生OOM。您可以通过操作系统控制台的系统概览功能查看FastOOM介入相关记录。

    历史健康详情中记录了一条节点用户态OOM事件,FastOOM杀死了malloc进程(内存占用399 MiB)和test-malloc进程(内存占用418 MiB)。