Linux內核OOM機制的理解【轉】


本文轉載自:http://blog.csdn.net/zhoutimo/article/details/52024487

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM