1. 程式人生 > >關於OOM-killer

關於OOM-killer

OOM-killer:Out-of-Memory (OOM) Killer是一種保護機制,用於當記憶體嚴重不足時,為了系統的繼續運轉,核心迫不得已挑選一個程序,將其殺死,以釋放記憶體,緩解記憶體不足的問題。
可以看出這種方式對程序的保護是有限的,不能完全的保護程序的執行。


OOM Killer的關閉與啟用方式:
# echo "0" > /proc/sys/vm/oom-kill
# echo "1″ > /proc/sys/vm/oom-kill


在實際運營場景中,我們經常出現ssh連線不上伺服器,但ping卻是通的情況,這個時候很有可能是記憶體不夠linux啟動了oom-killer,系統根據一定的分數和機制來決定
隨機殺掉一些程式釋放實體記憶體(特別是我們後臺需要大量共享記憶體而且用了mlock的程式),而sshd程序很可能就是被選中殺掉的程序,因此導致通過ssh登入不上。 
這個時候基本上swap也被耗盡, 所有能釋放記憶體的機制核心都已經嘗試了。


而ping能夠通,主要是因為ping其實是核心協議棧就直接回包了,不會走到使用者態,所以還能證明機器還是活著的。


 
對於每個程序都有一個oom_score的屬性/proc/PID/oom_score
oom- killer 會殺死oom_score較大的程序,當oom_score為0時禁止核心殺死該程序。


還有一個/proc/PID/oom_adj
一般來說,oom_adj的值越大,該程序被系統選中終止的可能就越高,當oom_adj=-17時,oom_score將變為0。
(要對某個程序進行OOM保護的話就直接向“/proc/pid/oom_adj”中寫入“-17”即可。)


所以可以通過命令 
echo 0 > /proc/PID/oom_adj 
來防止重要的程序被oom_killer殺死。


例如可以把sshd程序的oom_adj改為0 ,包括自己連線上的那個終端程序,這樣你還可以執行一些運維工作。