linux OOM killer分析

基本概念

Linux 內核有個機制叫OOM killer(Out-Of-Memory killer),該機制會監控那些佔用內存過大,尤爲是瞬間很快消耗大量內存的進程,爲了防止內存耗盡而內核會把該進程殺掉。css

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的主要參考。markdown

sysctl 下有2個可配置選項:ui

  • vm.panic_on_oom = 0 #內存不夠時內核是否直接panic
  • vm.oom_kill_allocating_task = 1 #oom-killer是否選擇當前正在申請內存的進程進行kill

觸發oom killer時/var/log/message打印了進程的score:spa

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
相關文章
相關標籤/搜索