1. 程式人生 > >Out of memory: Kill process 解決

Out of memory: Kill process 解決

code 日誌 一個 配置 保持 內存分配 roc ssa 運行

Linux有一個特性:OOM Killer,一個保護機制,用於避免在內存不足的時候不至於出現嚴重問題,把一些無關的進程優先殺掉,即在內存嚴重不足時,系統為了繼續運轉,內核會挑選一個進程,將其殺掉,以釋放內存,緩解內存不足情況,不過這種保護是有限的,不能完全的保護進程的運行。

在很多情況下,經常會看到還有剩余內存時,oom-killer依舊把進程殺死了,現象是在/var/log/messages日誌文件中有如下信息:
Out of Memory: Killed process [PID] [process name].
該問題是low memory耗盡,因為內核使用low memory來跟蹤所有的內存分配。

當low memory耗盡,不管high memory剩多少,oom-killer都會殺死進程,以保持系統的正常運行。

上google研究了一下, 找到了一些配置方法。記錄一下,備忘。

sysctl vm.panic_on_oom=1
sysctl kernel.panic=X
echo “vm.panic_on_oom=1” >> /etc/sysctl.conf
echo “kernel.panic=X” >> /etc/sysctl.conf

上面配置可以讓linux在出現 Out of memory之後重啟。

echo -15 > /proc/[pid]/oom_adj


這會讓 oom 在出現 Out of memory後,盡量不去kill這個進程。

echo 10 > /proc/[pid]/oom_adjoom
會優先考慮kill這個進程。

echo -17 > /proc/[pid]/oom_adj
oom在Out of memory時, 不會kill該進程。

oom_adj的值在-16 到 +15之間,值越高被kill的優先度越高,當該值為-17時,系統將不會殺死指定pid的進程,而-16~15則會使得進程的/proc/[pid]/oom_adj值呈指數(K*2^n)形式遞增,即它們被殺掉的可能性呈指數遞增。針對init(進程號為1)這個進程,無論該值設為多少都不會被殺。

sysctl vm.overcommit_memory=2
echo “vm.overcommit_memory=2” >> /etc/sysctl.conf

可以完全關掉oom, 不過這並不建議,關掉後可能會出現未知的情況。

Out of memory: Kill process 解決