OOM Killer(Out of Memory Killer)是Linux内核在系统内存严重不足时,强行释放进程内存的一种机制。本文介绍Alibaba Cloud Linux操作系统出现OOM Killer的可能原因,并提供多种解决方案。
问题现象
Alibaba Cloud Linux操作系统在实例全局内存或实例内cgroup的内存不足时,会先触发内存回收机制释放内存,并将这部分被释放的内存分配给其他进程。如果内存回收机制不能处理系统内存不足的情况,则系统会触发OOM
Killer强制释放进程占用的内存。触发OOM Killer的部分日志信息示例如下:
565 [六 9月 11 12:24:42 2021] test invoked oom-killer: gfp_mask=0x62****(GFP_HIGHUSER_MOVABLE|__GFP_ZERO), nodemask=(null), order=0, oom_score_adj=0
566 [六 9月 11 12:24:42 2021] test cpuset=/ mems_allowed=0
567 [六 9月 11 12:24:42 2021] CPU: 1 PID: 29748 Comm: test Kdump: loaded Not tainted 4.19.91-24.1.al7.x86_64 #1
568 [六 9月 11 12:24:42 2021] Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS e62**** 04/01/2014
可能原因
系统出现OOM Killer表示内存不足,内存不足可以分为实例全局内存不足和实例内cgroup的内存不足。目前常见的出现OOM Killer的原因有以下几种:
原因类型 | 场景示例 |
---|---|
cgroup内存使用达到上限 | 如下日志记录的出现OOM Killer场景示例中,进程test所在的cgroup /mm_test 发生了OOM Killer。 原因:cgroup /mm_test 的内存使用率达到上限(200 MB)。
|
父cgroup内存使用达到上限 | 如下日志记录的出现OOM Killer场景示例中,进程test属于cgroup /mm_test/2 ,而发生OOM Killer的cgroup为/mm_test 。 原因:cgroup /mm_test/2 的内存使用率没有达到上限,但父cgroup /mm_test 的内存使用率达到上限(200 MB)。
|
系统全局内存的使用率过高 | 如下日志记录的出现OOM Killer场景示例中,limit of host 表示实例的全局内存出现了不足。在日志记录的数据中,空闲内存(free )已经低于了内存最低水位线(low )。 原因:由于实例的空闲内存低于内存最低水位线,无法通过内存回收机制解决内存不足的问题,因此触发了OOM Killer。 |
内存节点(Node)的内存不足 | 如下日志记录的出现OOM Killer场景示例中,部分日志记录说明:
原因:在NUMA存储模式下,操作系统可能存在多个内存节点(可运行cat /proc/buddyinfo命令查看相关资源信息)。如果通过cpuset.mems 参数指定cgroup只能使用特定内存节点的内存,则可能导致实例在具备充足的空闲内存的情况下,仍出现OOM Killer的情况。
|
内存碎片化时伙伴系统内存不足 | 如下日志记录的出现OOM Killer场景示例中,部分日志记录分析说明:
原因:操作系统的内存在进行内存分配的过程中,如果伙伴系统的内存不足,则系统会通过OOM Killer释放内存,并将内存提供至伙伴系统。 |
解决方案
阿里云提供了以下解决方案,您可以结合实际情况,排查并解决问题:
方案序号 | 方案说明 |
---|---|
方案一 |
建议您自行评估实例内当前占用内存的进程情况,及时清理不需要的进程,以释放内存。如果您的业务所需的内存较大,当前实例规格不满足您对内存的需求,可以升配实例以提升实例的内存容量。更多信息,请参见升降配方式概述。在升配实例后,您还需要根据内存实际的提升情况,手动调整cgroup的内存上限。 调整cgroup内存上限的命令说明如下:
其中,value为您为cgroup设置的内存上限。
|
方案二 | 检查实例内是否存在内存泄漏的情况。重点检查项:
|
方案三 | 内存节点(Node)的内存不足导致的OOM Killer,您需要重新配置cpuset.mems 接口的值,使cgroup能够合理使用内存节点的内存。配置cpuset.mems 的命令说明如下:
|
方案四 | 内存碎片化时导致的OOM Killer,建议您定期在业务空闲时间段,进行内存整理。开启内存整理功能的命令为:
|