Linux | OOM機制的理解

What(什麼是OOM):

Linux下面有個特性叫OOM killer(Out Of Memory killer),這個東西會在系統內存耗盡的情況下跳出來,選擇性的幹掉一些進程以求釋放一些內存。具體的記錄日誌是在/var/log/messages中,如果出現了Out of memory字樣,說明系統曾經出現過OOM!

 

When(什麼時候出現):

linux下允許程序申請比系統可用內存更多的內存,這個特性叫Overcommit。這樣做是出於優化系統考慮,因爲不是所有的程序申請了內存就立刻使用的,當你使用的時候說不定系統已經回收了一些資源了。不幸的是,當你用到這個Overcommit給你的內存的時候,系統還沒有資源的話,OOM killer就跳出來了。

參數/proc/sys/vm/overcommit_memory可以控制進程對內存過量使用的應對策略
1.當overcommit_memory=0 允許進程輕微過量使用內存,但對於大量過載請求則不允許,也就是當內存消耗過大就是觸發OOM killer。
2.當overcommit_memory=1 永遠允許進程overcommit,不會觸發OOM killer。
3.當overcommit_memory=2 永遠禁止overcommit,不會觸發OOM killer。

 

How(系統會怎麼樣):

當然,如果觸發了OOM機制,系統會殺掉某些進程,那麼什麼進程會被處理掉呢?kernel提供給用戶態的/proc下的一些參數:
1./proc/[pid]/oom_adj,該pid進程被oom killer殺掉的權重,介於 [-17,15](具體具體權重的範圍需要查看內核確認)之間,越高的權重,意味着更可能被oom killer選中,-17表示禁止被kill掉。

通過2個步驟可以確認,具體權重的範圍:

①uname -a查看Linux內核版本

②進入/usr/src/kernels/內核版本/include/linux/oom.h確認具體的權重範圍


2./proc/[pid]/oom_score,當前該pid進程的被kill的分數,越高的分數意味着越可能被kill,這個數值是根據oom_adj運算(2ⁿ,n就是oom_adj的值)後的結果。

oom_adj,oom_score是oom_killer的主要參考值

 

 

So(我們能做什麼):

1.保護我們重要的進程,避免被處理掉

實例:

ps -ef|grep GameServer(獲得重要進程的PID)

echo -17 > /proc/PID/oom_score_adj(輸入-17,禁止被OOM機制處理)

2.關閉OOM機制(不推薦,如果不啓動OOM機制,內存使用過大,會讓系統產生很多異常數據)

echo "vm.panic_on_oom=1" >> /etc/sysctl.conf

systcl -p

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章