是否建議在 systemd 中設置 OOMScoreAdjust=1000 以獲得可替換服務?
systemd 有一個
OOMScoreAdjust
選項,允許調整啟動程序的 oom-killer 分數。引用systemd 文件:
OOMScoreAdjust=
為執行的程序設置記憶體不足殺手的調整級別。取一個介於 -1000(禁用該程序的 OOM 殺戮)和 1000(使該程序很可能在記憶體壓力下殺戮)之間的整數。有關詳細資訊,請參見proc.txt。
在我的設置中,我在 AWS 上部署了一個 NodeJs 伺服器。除了節點伺服器之外,EC2 實例上沒有執行其他任何東西(除了監控和基本的作業系統程序)。有 ELB 健康檢查,最終應該會替換損壞的 EC2 實例。
不過,我想知道如果存在記憶體問題,增加核心是否更喜歡殺死 Node 伺服器程序是否被認為是一種好習慣
OOMScoreAdjust
,因為它可以自動重新啟動。在 systemd 中,它可能如下所示:OOMScoreAdjust=1000 Restart=always
我不得不承認我的理解是有限的。我目前的理解是,它很可能不會產生真正的影響,最好保留預設值:
- 如果記憶體耗盡的程序是節點伺服器,它很可能無論如何都會被殺死。
- 如果罪魁禍首是另一個程序,重新啟動節點伺服器將無濟於事,ELB 健康檢查最終應該負責替換實例。
不過,我很好奇是否有更好理解的人已經考慮過了。啟用它只是 systemd 腳本中的一行。如果有疑問,我寧願讓核心殺死 Node 程序而不是任何隨機系統服務。
對於具有單個程序的伺服器,它可能不會產生太大的影響,但如果您有一個經常洩漏記憶體的程序,這真的會大放異彩。
例如,在桌面上,Firefox 傾向於使用越來越多的記憶體,直到呼叫 OOM-killer,並且總是會確定 Xorg 正在使用最多的記憶體並將其殺死,從而導致整個桌面崩潰,而實際上它只是瀏覽器需要重新啟動。
因此,在這種情況下,將洩漏程序的 OOM 分數設置為 1000 並立即重新啟動不會有問題,因為它將首先被殺死,並且當它重新載入時,它不會像以前那樣使用那麼多的記憶體,從而釋放整體記憶。
如果該程序的記憶體使用相當穩定,那麼它不太重要(但肯定不會受到傷害),但如果它有洩漏,那麼它可能會比讓 AWS ELB 注意到問題並建構一個新的 VM 更快地恢復。