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掉?
- 与OOM相干的几个文件是 /proc//oom_adj 、 /proc//oom_score。前者是一个权值-16至15,默认是0,设置为-17示意永远不被kill,其余状况值越大越容易被kill。后者就是它计算出来的一个值,就是依据这个值来抉择哪些过程被kill掉的。
- 下面搁置应用swap中的第三个办法 overcommit参数,因为它调配不出内存就会返回谬误,所以永远也不能达到内存被耗尽。OOM也就不会有影响了。
参考文档:https://blog.csdn.net/hu_jing...`