OOM

一些概念:

    1. Linux下面有个特性叫OOM killer(Out Of Memory killer),这个东西会在系统内存耗尽的情况下跳出来,选择性的干掉一些进程以求释放一些内存。

        典型的情况是:某天机器突然登不上了,能ping通,但是ssh死活连不了。原因是sshd进程被OOM killer干掉了(泪流满面)。

        重启机器后查看系统日志会发现血淋淋的Out of Memory: Killed process ×××、Out of Memory: Killed process 〇〇〇。一篇狼藉,惨不忍睹。

        数据堆积在内存中,内存耗光,逼得OOM killer出来收拾局面。

     2. Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit

         OOM killer与内存overcommit:两者是相互作用的:

         对于一台16G的Linux服务器。如果使用overcommit_memory=0,如果没有没有足够的内存分配,那么应用想分配内存就会失败。如果使用overcommit_memory>0,每次的应用内存申请都会成功,这种成功是建立在OOM killer会杀掉部分进程来实现的。

 

优先杀死哪些进程?

1.Linux下每个进程都有个OOM权重,在/proc/<pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。

2.最终OOM killer是通过/proc/<pid>/oom_score这个值来决定哪个进程被干掉的。

这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低。

总之,总的策略是:损失最少的工作,释放最大的内存同时不伤及无辜的用了很大内存的进程,并且杀掉的进程数尽量少。

 

 

好文章:

https://blog.csdn.net/carlosfu/article/details/84765785

 

posted @ 2019-04-04 11:39  口头猿  阅读(1085)  评论(0)    收藏  举报