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…`