linux内核oom,linux OOM killer分析
基本概念
Linux 內核有個機制叫OOM killer(Out-Of-Memory killer),該機制會監控那些占用內存過大,尤其是瞬間很快消耗大量內存的進程,為了防止內存耗盡而內核會把該進程殺掉。
oom killer機制分析
oom killer是計算出選擇哪個進程kill呢?我們先來看一下kernel提供給用戶態的/proc下的一些參數:
/proc/[pid]/oom_adj ,該pid進程被oom killer殺掉的權重,介于 [-17,15]之間,越高的權重,意味著更可能被oom killer選中,-17表示禁止被kill掉。
/proc/[pid]/oom_score,當前該pid進程的被kill的分數,越高的分數意味著越可能被kill,這個數值是根據oom_adj運算后的結果,是oom_killer的主要參考。
sysctl 下有2個可配置選項:
vm.panic_on_oom = 0 #內存不夠時內核是否直接panic
vm.oom_kill_allocating_task = 1 #oom-killer是否選擇當前正在申請內存的進程進行kill
觸發oom killer時/var/log/message打印了進程的score:
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758297] [ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758311] [ 399] 0 399 2709 133 2 -17 -1000 udevd
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758314] [ 810] 0 810 2847 43 0 0 0 svscanboot
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758317] [ 824] 0 824 1039 21 0 0 0 svscan
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758320] [ 825] 0 825 993 17 1 0 0 readproctitle
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758322] [ 826] 0 826 996 16 0 0 0 supervise
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758325] [ 827] 0 827 996 17 0 0 0 supervise
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758327] [ 828] 0 828 996 16 0 0 0 supervise
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758330] [ 829] 0 829 996 17 2 0 0 supervise
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758333] [ 830] 0 830 6471 152 0 0 0 run
Apr 18 16:56:18 v125000100.bja kernel: : [22254386.758335] [ 831] 99 831 1032 21 0 0 0 multilog
所以,如果想修改被oom killer選中的概率,禁止或者給oom_adj最小或偏小的值,也可以通過sysctl調節oom killer行為
如何查看OOM日志
grep "Out of memory" /var/log/messages
總結
以上是生活随笔為你收集整理的linux内核oom,linux OOM killer分析的全部內容,希望文章能夠幫你解決所遇到的問題。