1. 程式人生 > 其它 >oom記憶體溢位程序被殺處理辦法

oom記憶體溢位程序被殺處理辦法

1.由於系統記憶體不夠用,導致一些重要程序被殺
2.修改程序oom的優先順序
# 這個介面就是/proc/pid/oom_adj, 它的範圍是-17~+15,值越高,就越容易被殺掉,如果把該值設定為-17,oom就永遠也不會考慮殺它。
​
cat oom_setting.sh  #使用cron定時執行這個指令碼
#!/bin/bash
# 【重要服務不殺 -17cat /data/mysql/mysql_master/data/mysql.pid && echo -17 > /proc/`cat /data/mysql/mysql_master/data/mysql.pid`/oom_adj
cat /data/mongodb/mongodb_master/pid_mongod.pid && echo
-17 > /proc/`cat /data/mongodb/mongodb_master/pid_mongod.pid`/oom_adj cat /data/mysql/mysql_slave/data/mysql.pid && echo -17 > /proc/`cat /data/mysql/mysql_slave/data/mysql.pid`/oom_adj ​ # 【不重要且佔用較多記憶體可停服務,可優先被殺 15,釋放記憶體,找維護時間再處理】 cat /data/mongodb/mongodb_slave/pid_mongod.pid && echo 15 > /proc/`cat
/data/mongodb/mongodb_slave/pid_mongod.pid`/oom_adj
3.oom原理說明
在Linux中當malloc返回的是非空時,並不代表有可以使用的記憶體空間。Linux系統允許程式申請比系統可用記憶體更多的記憶體空間,這個特性叫做overcommit特性,這樣做可能是為了系統的優化,因為不是所有的程式申請了記憶體就會立刻使用,當真正的使用時,系統可能已經回收了一下記憶體。但是,當你使用時Linux系統沒有記憶體可以使用時,OOM Killer就會出來讓一些程序退出。
Linux下有3種Overcommit的策略(參考核心文件:vm/overcommit-accounting),可以在/proc/sys/vm/overcommit_memory配置(取0,1和2三個值,預設是0)。 
(
10:啟發式策略,比較嚴重的Overcommit將不能得逞,比如你突然申請了128TB的記憶體。而輕微的overcommit將被允許。另外,root能Overcommit的值比普通使用者要稍微多 (21: 永遠允許overcommit,這種策略適合那些不能承受記憶體分配失敗的應用,比如某些科學計算應用。 (32: 永遠禁止overcommit,在這個情況下,系統所能分配的記憶體不會超過swap+RAM*係數(/proc/sys/vm/overcmmit_ratio,預設50%,你可以調整),如果這麼多資源已經用光,那麼後面任何嘗試申請記憶體的行為都會返回錯誤,這通常意味著此時沒法執行任何新程式。