OOM_killer是Linux自我保護的方式,當內存不足時不至於出現太嚴重問題,有點壯士斷腕的意味
在kernel 2.6,內存不足將喚醒oom_killer,挑出/proc/<pid>/oom_score最大者並將之kill掉
為了保護重要進程不被oom-killer掉,我們可以:echo -17 > /proc/<pid>/oom_adj,-17表示禁用OOM
我們也可以對把整個
系統的OOM給禁用掉:
sysctl -w vm.panic_on_oom=1 (默認為0,表示開啟)
sysctl -p
值得注意的是,有些時候 free -m 時還有剩余內存,但還是會觸發OOM-killer,可能是因為進程占用了特殊內存地址
平時我們應該留意下新進來的進程內存使用量,免得系統重要的業務進程被無辜牽連
可用 top M 查看最消耗內存的進程,但也不是進程一超過就會觸發oom_killer
參數/proc/sys/vm/overcommit_memory可以控制進程對內存過量使用的應對策略
當overcommit_memory=0 允許進程輕微過量使用內存,但對於大量過載請求則不允許(默認)
當overcommit_memory=1 永遠允許進程overcommit
當overcommit_memory=2 永遠禁止overcommit
基本概念:
Linux 內核有個機制叫OOM killer(Out Of Memory killer),該機制會監控那些占用內存過大,尤其是瞬間占用內存很快的進程,然后防止內存耗盡而自動把該進程殺掉。內核檢測到系統內存不足、挑選並殺掉某個進程的過程可以參考內核源代碼linux/mm/oom_kill.c,當系統內存不足的時候,out_of_memory()被觸發,然后調用select_bad_process()選擇一個”bad”進程殺掉。如何判斷和選擇一個”bad進程呢?linux選擇”bad”進程是通過調用oom_badness(),挑選的算法和想法都很簡單很朴實:最bad的那個進程就是那個最占用內存的進程。
如何查看:
grep "Out of memory" /var/log/messages
查看系統日志方法:
運行egrep -i -r 'killed process' /var/log命令,結果如下:
也可運行dmesg命令,結果如下:
轉載自:
https://www.cnblogs.com/duanxz/p/10185946.html
https://www.cnblogs.com/yanqingxu/p/8316359.html