Linux-Kernel

如何永久設置守護程序的OOM殺手調整?

  • December 7, 2017

執行一些帶有單個或幾個重要係統服務守護程序的 Linux 伺服器,我想為這些守護程序調整 OOM 殺手,以防發生奇怪的事情。例如,今天一些執行 MySQL 的 Ubuntu 伺服器遇到了一個終止的 MySQL 守護程序,因為大量apt-checker程序正在消耗所有記憶體,並且核心認為終止 MySQL 是一個好主意。

我知道我可以使用該/proc/$(pidof mysqld)/oom_score_adj文件調整分數,以給核心一些線索,我不希望 MySQL 被殺死,但這無法在服務重新啟動後繼續存在。我應該從包中編輯 init/upstart 腳本以包含這些調整嗎?我不認為這是一個非常優雅的解決方案,因為我會調整屬於一個包的文件。是否可以在一般情況下掛鉤新貴/初始化腳本並有條件地調整它?或者你會建議執行一個無限期的腳本while true{ adjust_oom(); sleep 60;}嗎?

一些現代的守護程序監督系統有辦法做到這一點。(確實,既然有一個鍊式載入工具可以完成這項工作,可以說他們都有辦法做到這一點。)

  • Upstart:oom score在作業文件中使用。
oom 分數 -500
  • **systemd:**使用OOMScoreAdjust=服務單元中的設置。您可以使用服務單元更新檔文件來影響預打包的服務單元。
[服務]   
OOMScoreAdjust=-500
  • **daemontools 系列:**使用該服務程序中oom-kill-protectnosh 工具集中的工具run如果您正在轉換系統服務單元,該convert-systemd-units工具實際上會將OOMScoreAdjust=設置轉換為對oom-kill-protect.
#!/bin/nosh   
...   
oom-kill-protect -- -500   
...  
*程序* *參數*

作為獎勵,您可以使其參數化:

oom-kill-protect -- fromenv

並在服務的環境中設置參數的值(假定從與服務關聯的 envdir 中讀取,這裡使用 nosh 工具集的rcctlshim 進行操作):

rcctl 設置服務名稱*oomprotect* -500

進一步閱讀

引用自:https://unix.stackexchange.com/questions/58872