What(什麼是OOM):linux
Linux下面有個特性叫OOM killer(Out Of Memory killer),這個東西會在系統內存耗盡的狀況下跳出來,選擇性的幹掉一些進程以求釋放一些內存。具體的記錄日誌是在/var/log/messages中,若是出現了Out of memory字樣,說明系統曾經出現過OOM!優化
When(何時出現):.net
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個步驟能夠確認,具體權重的範圍:get
①uname -a查看Linux內核版本it
②進入/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