Linux 伺服器程序避免 OOM 的方法
阿新 • • 發佈:2022-06-01
問題描述
Linux 核心有個機制叫 OOM killer(Out-Of-Memory killer),該機制會監控那些佔用記憶體過大,尤其是瞬間很快消耗大量記憶體的程序,為了防止記憶體耗盡而核心會把該程序殺掉。典型的情況是:某天一臺機器突然 ssh 遠端登入不了,但能 ping 通,說明不是網路的故障,原因是 sshd 程序被 OOM killer 殺掉了(多次遇到這樣的假死狀況)。重啟機器後檢視系統日誌「/var/log/messages」會發現「Out of Memory: Kill process 1865(sshd)」類似的錯誤資訊。如何防止重要的系統程序觸發(OOM)機制而被殺死呢?只需要一招,就可以輕鬆避免。設定引數「/proc/PID/oom_adj為-17」,可臨時關閉 Linux 核心的 OOM 機制。核心會通過特定的演算法給每個程序計算一個分數來決定殺哪個程序,每個程序的 OOM 分數可以在「/proc/PID/oom_score」中找到。處理辦法 1. 方法一:設定引數/proc/PID/oom_adj為-17如何防止mongod被殺,可以這樣操作:(1) 編寫指令碼檔案oomadj.sh,內容如下:
Linux 核心有個機制叫 OOM killer(Out-Of-Memory killer),該機制會監控那些佔用記憶體過大,尤其是瞬間很快消耗大量記憶體的程序,為了防止記憶體耗盡而核心會把該程序殺掉。典型的情況是:某天一臺機器突然 ssh 遠端登入不了,但能 ping 通,說明不是網路的故障,原因是 sshd 程序被 OOM killer 殺掉了(多次遇到這樣的假死狀況)。重啟機器後檢視系統日誌「/var/log/messages」會發現「Out of Memory: Kill process 1865(sshd)」類似的錯誤資訊。如何防止重要的系統程序觸發(OOM)機制而被殺死呢?只需要一招,就可以輕鬆避免。設定引數「/proc/PID/oom_adj為-17」,可臨時關閉 Linux 核心的 OOM 機制。核心會通過特定的演算法給每個程序計算一個分數來決定殺哪個程序,每個程序的 OOM 分數可以在「/proc/PID/oom_score」中找到。處理辦法
-
!/bin/bash
-
netstat -ntlup |grep mongod |awk '{print$NF}' |awk -F '/' '{print$(NF-1)}' |while read PID;
-
do
-
echo -17 >/proc/$PID/oom_adj;
-
done
-
[root@mnkj-mongodb-01 ~]crontab -e
-
/1 * /root/oomadj.sh
-
sysctl -w vm.panic_on_oom=1
-
vm.panic_on_oom = 1 //1表示關閉,預設為0表示開啟OOM
-
sysctl -p
-
Kernel-2.6.26之前版本的 oomkiller 演算法不夠精確,RHEL 6.x 版本的 2.6.32 可以解決這個問題。
-
子程序會繼承父程序的 oom_adj。
-
OOM 不適合於解決記憶體洩漏(Memory leak)的問題。