【Linux】关于OOM(Out of Memory)相关的介绍及处理方法

关于OOM(Out of Memory)相关的介绍及处理方法

OOM(Out-of-Memory)机制是内核的一部分,用于处理内存消耗过度的情况。OOM机制的责任是选择一个或多个高内存消耗的进程,并终止它们以释放内存。

在Linux中,进程的OOM Score决定了在出现内存不足的情况下,进程是最可能被终止的。OOM Score越高的进程被终止的可能性也就越大。

你不应该直接修改一个进程的OOM Score。通常,你可以通过以下方式来影响OOM的行为:

  1. 调整系统级别的内存限制(例如sysctl调整vm.overcommit_memory限制)
  2. 调整内存使用(例如在应用程序代码中管理内存,或使用可调整的进程或容器限制)
  3. 调整OOM Score的全局设置(例如修改/proc/sys/vm/oom_score_adj值,该值影响所有进程)

在任何情况下,请小心谨慎地处理OOM设置并确保它们符合您的实际需求。

可以使用sysctl来调整Linux系统中的vm.overcommit_memory设置。这个设置控制Linux内核如何处理内存过度分配的情况。

修改vm.overcommit_memory限制

以下是在Linux中使用sysctl修改vm.overcommit_memory设置的步骤:

  1. 确认当前的vm.overcommit_memory设置。在终端中运行以下命令:

    sysctl vm.overcommit_memory
    

    如果您需要提权才能运行此命令,请在命令前添加sudo。

  2. 根据输出结果判断您是否需要修改内存设置。vm.overcommit_memory有以下三个值可供选择:

    • 0:表示内核将检查是否有足够的可用内存来满足进程的需要,如果没有足够的内存,内核将杀死进程并释放内存。
    • 1:表示内核将允许进程分配所有它们请求的虚拟内存,并且不会检查物理内存是否足够。当物理内存不足时,进程可能会因无可用内存而崩溃。
    • 2:表示内核将允许进程分配所有它们请求的虚拟内存,但会检查交换空间和物理内存是否足够。如果两者都不足,内核将杀死进程并释放内存。
  3. 修改vm.overcommit_memory设置。在命令行中输入以下命令并为需要的值(0到2)进行替换:

    sudo sysctl vm.overcommit_memory=<value>
    

    例如,如果您想将值设置为2,可以运行以下命令:

    sudo sysctl vm.overcommit_memory=2
    
  4. 如果您希望永久保存修改的值,可以将它们添加到/etc/sysctl.conf文件中。在文件的末尾添加以下行:

    vm.overcommit_memory = <value>
    

    请替换为所需设置的值(0到2)。

注意事项:请注意操作系统版本和内核版本是否支持您设置的值。另外,请谨慎地进行内存设置的更改,以免出现不可预料的行为。

调整内存使用

1.在应用程序代码中管理内存:应用程序可以使用一些技术来管理内存,例如手动释放内存、使用内存池和内存重用等。可以帮助应用程序避免过度使用内存,从而减少出现OOM问题的概率。

2.使用可调整的进程或容器限制:可以使用可调整的进程或容器限制来限制进程或容器可以使用的内存量。这些限制可以根据需要进行调整,并可用于避免过度使用内存和OOM问题。

3.升级硬件:如果出现频繁的OOM问题,则可以考虑升级系统硬件,例如增加内存容量。这将提高系统的内存容量,并减少OOM问题的发生。

调整OOM Score的全局设置

OOM Score是Linux系统中用来确定进程优先级的指标,可以通过更改该值来调整系统中进程的优先级。以下是调整OOM Score全局设置的步骤:

  1. 打开/etc/sysctl.conf文件:
sudo vim /etc/sysctl.conf
  1. 在文件末尾添加以下行:
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
vm.oom_kill_allocating_task = 0
  1. 解释一下这三个参数的意义:
  • vm.overcommit_memory:表示系统内存充足性检查机制。0表示表示系统将会检查并根据需要减少内存使用,1表示系统将允许分配超出系统内存总量的内存(即虚拟内存),2表示所有的内存请求都分配,而不管交换空间是否够用。
  • vm.overcommit_ratio:表示当开启vm.overcommit_memory时,向应用层分配物理内存与虚拟内存的比例。默认值为50%,所以将该值调整为80%可以给应用层更多的物理内存。
  • vm.oom_kill_allocating_task:表示当系统出现OOM(out of memory)时,是否杀掉正在分配内存的任务以释放内存。将该值设置为0可以让系统直接杀掉已存在的进程,而不是正在分配内存的进程。
  1. 保存并退出文件,重启系统(或者执行以下命令使设置生效):
sudo sysctl -p

这样,系统中的所有进程都将根据新的设置来调整优先级,从而更好地管理内存使用。需要注意的是,调整系统优先级具有一定的风险,请在操作前仔细评估并备份数据。

临时修改oom_score_adj值

例如临时修改ssh进程oom_score_adj值

cat /proc/1589/oom_score_adj
-1000
# 覆盖原值
echo 0 > /proc/1589/oom_score_adj

涉及到的文件

panic_on_oom

用来控制当内存不足时该如何做。

/proc/sys/vm/panic_on_oom

  • 值为0:内存不足时,启动 OOM killer。

  • 值为1:内存不足时,有可能会触发 kernel panic(系统重启),也有可能启动 OOM killer。

  • 值为2:内存不足时,表示强制触发 kernel panic,内核崩溃GG(系统重启)。

oom_kill_allocating_task

用来决定触发OOM时先杀掉哪种进程

/proc/sys/vm/oom_kill_allocating_task

  • 值为0:会 kill 掉得分最高的进程。

  • 值为非0:会kill 掉当前申请内存而触发OOM的进程。

oom_score_adj

设置进程kill优先级接口

/proc/PID/oom_score_adj(注意 points越小越不容易被杀;值为-1000到+1000)

oom_dump_tasks

用来记录触发OOM时记录哪些日志

/proc/sys/vm/oom_dump_tasks oom_dump_tasks

参数可以记录进程标识信息、该进程使用的虚拟内存总量、物理内存、进程的页表信息等。

值为0:关闭打印上述日志。在大型系统中,可能存在上千进程,逐一打印使用内存信息可能会造成性能问题。

其他导致OOM

其他1:cgroup oom(/sys/fs/cgroup/memory)

1. memory.usage_in_bytes > memory.limit_in_bytes时触发。

2. memory.oom_control控制oom行为

oom_kill_disable 1/0

3.日志差异

Cgroup oom时调用栈会有

a. mem_cgroup_out_of_memory+0xAAA/0xBBB

b. oom信息会新增当前memcgroup的信息,包括used,limit和

Task信息

其他2: overcommit

Memory Overcommit的意思是操作系统承诺给进程的内存大小超过了实际可用的内存。

接口:

/proc/sys/vm/overcommit_kbytes

/proc/sys/vm/overcommit_memory

内核参数 vm.overcommit_memory 接受三种取值:

  • 0 – Heuristic overcommit handling. 这是缺省值,它允许overcommit,但过于明目张胆的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是“试探式的”,内核利用某种算法(对该算法的详细解释请看文末)猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit。

  • 1 – Always overcommit. 允许overcommit,对内存申请来者不拒。

  • 2 – Don’t overcommit. 禁止overcommit。

/proc/sys/vm/overcommit_ratio

默认50,表示超过50%触发

验证

# grep -i commit /proc/meminfo
CommitLimit: 5967744 kB
Committed_AS: 5363236 kB

注意:

overcommit针对的是内存申请,内存申请不等于内存分配,内存只在实际用到的时候才分配。比如进程malloc申请100G,但是使用只用到10M,那么oom针对的是实际内存(RSS),overcommit针对的是malloc。

日志差异:调用栈有__vm_enough_memory, 只是打印meminfo,不会kill任务

参考文章:https://zhuanlan.zhihu.com/p/463434212

猜你喜欢

转载自blog.csdn.net/imliuqun123/article/details/130890013