一般程序在使用過多記憶體時,就會被 Kernel 結束掉,在 Kernel 裡的負責這工作的就是 OOM Killer 。
如果想要把這功能關掉,可以用 sysctl 來作。
sudo -s sysctl -w vm.oom-kill=0
那要啟用,就是用
sudo -s sysctl -w vm.oom-kill=1
一般預設是啟用的。
另外一個設定是當出現 OOM 時,Kernel 要不要 Panic
這可以藉由察看 /proc/vm/oom_kill 的內容,得知此設定有沒有啟用。
cat /proc/sys/vm/panic_on_oom
要啟用,可以直接把 1 寫到這檔案裡。
echo "1" | sudo tee /proc/sys/vm_panic_on_oom
要關閉,就是寫 0
除了啟用跟關閉之外,還可以做一點細部的控制,就是 vm_overcommit_memory 。先說明 overcommit 的意思,當程序跟 kernel 申請記憶體時,kernel 通常是允許,因為不會立刻就使用,這樣就有機會可以執行更多程序,這就是 overcommit 過度使用。
這個值是 0 的時候,表示過度使用記憶體時的處理是由 kernel 自己決定,這也是預設值。
用 1 ,表示 kernel 永遠都可以過度使用,這設定有點危險,因為會有機會導致 OOM;2 表示不會使用超過指定的比率。
那就可以針對個別程序去做調整,OOM killer 在處理時,會去參考程序的 oom_score 來決定是砍不砍,所以可以調整 oom_score_adj 數值來影響 oom_score。
比如我們希望 pid 是 3813 的程序可以不要被 OOM killer 砍掉,就可以這樣調整
echo "-100" | sudo tee /proc/3813/oom_score_adj
或者是在 systemd service 裡加入
[Service]
OOMScoreAdjust=-100
這個設定在一般情況下不太會被用到,基本上用預設設定就可以。主要還是用在系統調校或是正式環境時,才會去動到。
沒有留言:
張貼留言