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
Linux有趣的核心機制 OOM
what 什麼是oom linux下面有個非常特別的機制叫oom killer out of memory killer 這個有趣的傢伙會在系統記憶體耗盡的情況下跳出來,選擇性的乾掉一些程序以求釋放一些記憶體。預設具體的記錄日誌是在 var log messages中,如果出現了out of mem...
linux核心的中斷機制
上半部中斷不能巢狀,中斷被禁止,要盡量短,處理一些重要的事情,通常是改變一些標誌狀態 下半部的中斷可以巢狀,有三種處理的方式 softirq tasklet workqueue工作佇列 中斷頂半部函式,禁止中斷,不可巢狀 通過request irq 申請 中斷處理函式是被硬體請求執行的核心 所以它屬...
linux核心IPC機制
未完,待續.摘要 本文將從乙個例項出發,逐步剖析linux核心是如何實現訊號量機制的.正文 訊號量使用例項 1 訊號量建立例項 void sem create test void int key fd,key value int sem id union semun sem args unsigne...