java進程被OOM幹掉問題記錄

異常現象:用戶環境部署了一臺iserver,訪問一陣後,進程沒了
 
分析:
一、bin目錄下沒有崩潰日誌,在tomcat的訪問日誌裏面也沒有看到有用的信息。iserver.log裏面也沒有信息
二、懷疑是否是機器重啓致使:執行last,看到機器運行200多小時,說明沒人重啓
三、查看linux系統日誌 /var/log/messages,果真看到java進程被kill掉的信息

 

 

緣由:查了下,OOM_killer是Linux自我保護的方式,當內存不足時不至於出現太嚴重問題,有點壯士斷腕的意味
在kernel 2.6,內存不足將喚醒oom_killer,挑出/proc/<pid>/oom_score最大者並將之kill掉
 
爲了保護重要進程不被oom-killer掉,咱們能夠:echo -17 > /proc/<pid>/oom_adj,-17表示禁用OOM
咱們也能夠對把整個 系統的OOM給禁用掉:
sysctl -w vm.panic_on_oom=1 (默認爲0,表示開啓)
sysctl -p
 
參數/proc/sys/vm/overcommit_memory能夠控制進程對內存過量使用的應對策略
當overcommit_memory=0 容許進程輕微過量使用內存,但對於大量過載請求則不容許(默認)
當overcommit_memory=1 永遠容許進程overcommit
當overcommit_memory=2 永遠禁止overcommit
 
進展:先禁用了OOM,保證iserver不會掛掉。後續寫一個監控腳本,進程被幹掉之後,自動重啓啦
相關文章
相關標籤/搜索