Kill
在程序被OOM殺手/ cgroups殺死之前接收信號
在我們的集群中,我們正在限制我們的程序資源,例如記憶體 (
memory.limit_in_bytes
)。我認為,最後,這也是通過 Linux 核心中的 OOM 殺手處理的(通過閱讀原始碼看起來很像)。
在我的程序被殺死之前有什麼方法可以獲取信號?(就像SGE 的
-notify
選項一樣,它將在程序被終止之前發送。)qsub
SIGUSR1
/dev/mem_notify
我在這裡讀到過,但我沒有——現在還有別的東西嗎?我也讀過這似乎有點相關。我希望至少能夠轉儲一個小的堆棧跟踪,也許還有一些其他有用的調試資訊——但也許我什至可以通過釋放一些記憶體來恢復。
我目前正在使用的一種解決方法是這個小腳本,它經常檢查我是否接近(95%)限制,如果是,它會向程序發送一個
SIGUSR1
. 在 Bash 中,我在後台 (cgroup-mem-limit-watcher.py &
) 中啟動此腳本,以便它監視同一 cgroup 中的其他 proc,並在父 Bash 程序死亡時自動退出。
當 cgroup 的記憶體使用量超過門檻值時,可以註冊通知。原則上,將門檻值設置在實際限制以下的適當點將使您能夠發送信號或採取其他措施。
看:
https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
OOM 殺手確實會發送 SIGKILL,否則會讓有問題的程序選擇繼續執行會適得其反。
這意味著一個程序絕對沒有辦法知道它什麼時候會被它殺死。
管理此類問題通常意味著對程序或其配置進行更正。有時,根據系統的配置,簡單地增加交換空間可以為作業系統提供更多的記憶體管理靈活性,以避免這種激烈的措施。