FastOOM通过监控系统可用内存和swap使用率等核心内存指标,并结合CPU使用率和系统负载等辅助指标来反映内存颠簸现象。在发生一定程度内存颠簸时,FastOOM将在用户空间采取相应措施,根据灵活配置杀死相关进程,避免系统陷入OOM前的响应慢或无响应状态。
背景信息
当系统剩余内存低于阈值时,业务申请内存时将进入内存回收流程。在系统发生OOM之前,常常会出现响应慢或无响应、CPU使用率过高、高负载以及IO Wait等问题,从而导致业务波动或长时间失联。传统的Linux内核OOM机制在处理内存溢出问题时,有时由于启动过晚而导致系统进入活锁状态(内核空间不断进行页面交换和回收,进而导致系统响应缓慢或完全无响应)。此外,内核内存不足处理策略的配置灵活性不足。启用FastOOM功能可实现灵活的配置处理策略,从而有效避免系统响应慢或无响应的情况。
使用限制
地域限制
本功能目前仅支持中国内地与中国香港。
操作系统限制
架构
操作系统
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用户,请确保阿里云账号(主账号)已将系统策略
AliyunECSReadOnlyAccess
和AliyunSysomFullAccess
授予RAM用户。已开通控制台权限。
首次登录操作系统控制台时,单击开通服务以开通控制台服务。
操作步骤
启用、修改或关闭FastOOM功能不会对您的业务产生影响。
节点级别FastOOM策略跟随自定义FastOOM功能的启用状态。
在启用FastOOM功能后,您可以根据实际需求选择是否启用Pod级别FastOOM策略。
启用FastOOM
访问操作系统控制台-组件管理。
为目标ECS实例安装SysOM。
返回组件管理页面,单击详情。
单击创建配置,配置FastOOM功能。
填写配置名称,勾选开启自定义FastOOM功能。
节点级别FastOOM策略
填写配置信息,单击确定。
说明节点级别FastOOM策略在内存突发超限(超过系统总内存)申请的场景中,可能无法及时在系统OOM发生前进行干预。因此,FastOOM配置的杀进程策略无法确保所匹配的进程不被内核OOM杀死。
如果不配置倾向于杀死或避免杀死进程的策略,FastOOM将采用与内核OOM相同的算法,根据进程占用的内存大小及其
oom_score_adj
值来选择需要杀死的进程。
配置
说明
示例
内存压力级别
表示节点处于何种内存压力程度时,触发杀死进程。目前,分为中内存压力和高内存压力两档。中内存压力意味着FastOOM会更快介入杀死进程。
离线业务,建议设置为高。
时延敏感的业务,建议设置为中。
无
OOM时是否杀死整个进程组
勾选开启后FastOOM将会杀死所选进程所属进程组的所有进程。
无
触发OOM时倾向于杀死的进程名
当满足FastOOM触发杀进程条件时,优先选取杀死的进程。您可以填写正则表达式,多个正则表达式通过
,
隔开。Java,^python
表示进程名中包含Java子串或以python开头的进程将被优先杀死。触发OOM时避免杀死的进程名
当满足FastOOM触发杀进程的条件时,可以通过设置避免杀死特定进程,从而确保匹配的进程不会被
FastOOM杀死。您可以填写正则表达式,多个正则表达式通过
,
隔开。.*sh$,mysql
表示进程名中以sh结尾和包含mysql子串的进程不会被用户态FastOOM杀死。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杀死。
在左侧导航栏,单击系统管理。
在已纳管页签中勾选要应用FastOOM功能的节点,单击变更组件。
选择已创建的SysOM组件配置,单击提交。
修改FastOOM
访问操作系统控制台-组件管理。
单击SysOM组件详情。
单击对应配置项操作列的修改。
修改配置项信息,单击确定。
关闭FastOOM
访问操作系统控制台-组件管理。
单击SysOM组件详情。
单击对应配置项操作列的修改。
说明如果您不再需要该配置项,找到需要删除的配置项,然后在操作列单击删除,确认提示信息后单击确定。如果选择该方案,则后续步骤无需执行。
关闭FastOOM。
关闭FastOOM功能
取消勾选开启自定义FastOOM功能,单击确定。
关闭Pod级别FastOOM功能
单击删除,再单击确定。
实践案例
节点级别FastOOM解决系统OOM前抖动
问题现象
实例的内存占用在某个时间点开始迅速增加,接近系统的总内存,但尚未超过系统总内存。由于未超过系统总内存,此时不会触发内核的OOM,处于near-OOM
状态。
通过操作系统控制台的系统概览可以观察到,在发生OOM事件的同时,用户态收包出现了延时,导致业务发生了抖动。
解决方案
开启节点级别的FastOOM功能,由于是较为敏感的业务,内存压力选择中。设置触发OOM时避免杀死的进程名,同时设置无关的日志程序优先杀死。
您可以通过操作系统控制台的系统概览功能查看FastOOM介入相关记录,如下图所示。
由于kube-rbac-proxy
和node_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级别的FastOOM功能,可以灵活的配置Pod容器中发生OOM时避免和优先杀死的进程。
例如,在集群中,通过名为test-alinux的DaemonSet,在每个节点上部署了相应的Pod。
设置Pod级别FastOOM策略。
为了匹配相应的Pod,Pod名称应填写为test-alinux(正则表达式将匹配在不同节点上的test-alinux-xxx的Pod),命名空间设置为default。
控制OOM时杀进程策略,将内存压力级别设置为高,触发用户态OOM的时机接近于内核OOM的时机。
配置优先杀死特定进程和避免杀死业务进程和Pod中的1号进程,从而避免Pod重启或影响业务。
配置下发到对应节点后,当Pod中容器内存使用超过容器的限制后发生OOM。您可以通过操作系统控制台的系统概览功能查看FastOOM介入相关记录,如下图所示。