星期五, 5月 13, 2022

Linux OOM-Killer

一般程序在使用過多記憶體時,就會被 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

這個設定在一般情況下不太會被用到,基本上用預設設定就可以。主要還是用在系統調校或是正式環境時,才會去動到。

參考資料

沒有留言: