panic_on_oom(/proc/sys/vm/panic_on_oom)

决定系统出现oom的时候,要做的操作。接受的三种取值如下:

0 - 默认值,当出现oom的时候,触发oom killer

1 - 程序在有cpuset、memory policy、memcg的约束情况下的OOM,可以考虑不panic,而是启动OOM killer。其它情况触发 kernel panic,即系统直接重启

2 - 当出现oom,直接触发kernel panic,即系统直接重启

Linux用户内存都是读写时分配,所以系统发现需要内存基本上都是发生在handle_mm_fault()的时候(其他特殊流程类似,这里忽略),handle_mm_fault()要为缺的页分配内存,就会调alloc_pages()系列函数,从而调prepare_alloc_pages(),进而进入__alloc_pages_direct_reclaim(),这里已经把可以清到磁盘上的缓冲都清了一次了。这样之后还是分配不到内存,就只好进入OMM Killer了(pagefault_out_of_memory())。

到了这种状态,系统中的内存只有可能被正在运行的进程和内核占据了,大家都不让,系统就只有死
为了防止当系统物理内存不够用的时候系统崩溃,而选择一个占用内存最高的程序,把它Kill掉!

swap:在linux里面,当物理内存不够用了,而又有新的程序请求分配内存,那么linux就会选择将其他程序暂时不用的数据交换到物理磁盘上(swap out),等程序要用的时候再读进来(swap in)。这样做的坏处显而易见,swap in/swap out这里的代价比较大,相比数据一直放在内存里面,多了读磁盘的操作

OOM:out of memory,指在linux里面,由于系统内存压力,系统会选择保护一些系统进程,而将一些其他的进程kill掉,释放内存。

怎么避免进程因为OOM机制被kill掉?

  1. 与OOM相关的几个文件是 /proc//oom_adj 、 /proc//oom_score。前者是一个权值-16至15,默认是0,设置为-17表示永远不被kill,其余情况值越大越容易被kill。后者就是它计算出来的一个值,就是根据这个值来选择哪些进程被kill掉的。
  2. 上面放置使用swap中的第三个方法 overcommit参数,因为它分配不出内存就会返回错误,所以永远也不能达到内存被耗尽。OOM也就不会有影响了。

参考文档:https://blog.csdn.net/hu_jing...`


芒果牛奶
1 声望0 粉丝

运维背锅之路


« 上一篇
Linux Memory
下一篇 »
Rsyslog