如何理解Linux中的OOM机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解Linux中的OOM机制相关的知识,希望对你有一定的参考价值。

OOM Killer(Out of Memory Killer) 是当系统内存严重不足时 linux 内核采用的杀掉进程,释放内存的机制。

OOM Killer 通过检查所有正在运行的进程,然后根据自己的算法给每个进程一个 badness 分数,拥有最高 badness 分数的进程将会在内存不足时被杀掉。

它打分的算法如下:

    某一个进程和它所有的子进程都占用了很多内存的将会打一个高分。

    为了释放足够的内存来解决这种情况,将杀死最少数量的进程(最好是一个进程)。

    内核进程和其他较重要的进程会被打成相对较低的分。

    上面打分的标准意味着,当 OOM killer 选择杀死的进程时,将选择一个使用大量内存,有很多子进程且不是系统进程的进程。

    简单来讲,oom-killer 的原则就是损失最小、收益最大,因此它会让杀死的进程数尽可能小、释放的内存尽可能大。在数据库服务器上,mysql 被分配的内存一般不会小,因此容易成为 oom-killer 选择的对象。

    “既然发生了 OOM,那必然是内存不足,内存不足这个问题产生原因很多。

    首先第一个就是 MySQL 自身内存的规划有问题,这就涉及到 mysql 相应的配置参数。

    另一个可以想到的原因就是一般部署 MySQL 的服务器,都会部署很多的监控和定时任务脚本,而这些脚本往往缺少必要的内存限制,导致在高峰期的时候占用大量的内存,导致触发 Linux 的 oom-killer 机制,最终 MySQL 无辜躺枪牺牲。”

参考技术A Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。本回答被提问者采纳

linux--OOM killer

OOM killer 是linux自我保护的一个机制,内核检测到内存不足的时候,会挑选并杀掉某个进程以释放内存

 

为什么会出现内存不够的情况呢?

进程不应该是按需分配内存吗,没有了就不分配吗,怎么会有内存不足的情况呢?

这就是linux另一个高明的机制,linux的内核会根据应用程序的要求来分配内存,但是应用程序不可能一直将分配给它的内存都用满,所以为了最大化的利用内存,Linux有一个叫过度分配内存(over-commit-memory)的策略

一般来说没有问题,但是如果有个时间,每个应用程序都将自己的内存都消耗光了,那么所有应用程序的内存之和就是大于实际物理内存的,这个时候就需要出发OOM killer机制来杀掉一部分进程了。

 

正常情况:日常应用程序没有消耗到自己分配的最大内存,运行无问题

异常情况:某个时间,各个应用程序都将分配给自己的内存消耗光了,那么各个应用程序用的内存之和就大于实际物理内存了,也就出现问题需要OOM killer了

 

如何避免OOM killer的发生的?

 ​超分是服务器资源利用率最大化的一个合理机制,所以我们只能从监控和规划上去避免:

【1】做好监控,当内存使用达到设定的告警阈值,人工干预,保证重要服务不受影响

【2】合理划分内存

 

推荐公众号,分享运维知识:龙叔18岁

以上是关于如何理解Linux中的OOM机制的主要内容,如果未能解决你的问题,请参考以下文章

理解和配置 Linux 下的 OOM Killer

深入理解Java虚拟机垃圾回收机制

Android内存优化之OOM

oom killer

深入理解Java虚拟机类加载机制

Linux vm运行参数 - OOM相关的参数