OOM Killer/cgroupsによってプロセスが終了する前に信号を受信する

OOM Killer/cgroupsによってプロセスが終了する前に信号を受信する

クラスタでは、メモリ()などのプロセスリソースを制限しますmemory.limit_in_bytes

私の考えでは、これは最終的にLinuxカーネルのOOMキラーを介しても処理されます(読み取りを通して)。ソースコード)。

私のプロセスが終了する前に信号を受信する方法はありますか? (-notifyオプションと同様に上海金取引所qsubSIGUSR1プロセスが終了する前に送信されます。 )

私は読んだ/dev/mem_notify ここしかし、私はそうではありませんでした。もう他に何もありませんか?私も読んだこれこれはやや関連があるようです。

私は少なくとも小さなスタックトレースと他の有用なデバッグ情報をダンプできるようにしたいと思います。ただし、一部のメモリを解放して回復することもできます。

現在使用されている回避策の1つは次のとおりです。この小さなスクリプトSIGUSR1制限(95%)に近いかどうかを頻繁に確認し、その場合は終了時に自動的に終了を送信しますcgroup-mem-limit-watcher.py &

答え1

cgroupのメモリ使用量がしきい値を超えると通知を受け取るように登録できます。原則として、しきい値を実際の制限より低い適切なポイントに設定すると、信号を送信したり他のアクションを実行したりできます。

望むより:

https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt

答え2

OOM KillerはSIGKILLを送ります。それ以外の場合は、問題のプログラムを継続するように選択することは非生産的です。

これは、プロセスがいつ終了するかがまったくわからないことを意味します。

これらの問題を管理することは、通常、プログラムまたはその構成を変更することを意味します。時には、システム構成に応じてスワップスペースを増やすだけで、オペレーティングシステムにメモリ管理の柔軟性を高めることで、このような大胆な対策を回避できます。

答え3

cgroupを使ったような気がします。

プロセスがcgroupの唯一のプロセス(つまり、シャットダウンできる唯一のプロセス)であり、実行しているプログラムを所有している場合は、プログラムを変更して子プロセスを作成し、そのプロセスのoomスコアを高い値に調整できます。したがって、このプロセスは餌になります。 cgroupメモリ制限に達すると、OOM Killerはデフォルトプロセスの代わりにこのルアープロセスを終了します。デフォルトのプロセスは、サブルアーがOOMキラーが実行される正確な瞬間を学習するのを待つことができます。

IMO、特定のしきい値を持つモニタースクリプトよりも簡単です。以下はBashの例です。

#!/usr/bin/bash

self_pid=$$

(
    /usr/bin/sleep infinity &
    oom_decoy_pid=$!
    echo "1000" > "/proc/${oom_decoy_pid}/oom_score_adj"
    echo "Launched oom decoy ${oom_decoy_pid} for parent process ${self_pid}"

    wait $oom_decoy_pid

    echo "OOM decoy is killed. Likely OOM is coming!"
    echo "Signalling parent..."
    kill -SIGTERM $self_pid
)&

while true; do
    sleep 1
    echo "Doing something important and memory heavy"
done

関連情報