8.4.4. OOM の強制終了ポリシーについて
OpenShift Container Platform は、コンテナーのすべてのプロセスのメモリー使用量の合計がメモリー制限を超えるか、ノードのメモリーを使い切られるなどの深刻な状態が生じる場合にコンテナーのプロセスを強制終了できます。
プロセスがメモリー不足 (OOM) で強制終了された場合、コンテナーは即座に終了する可能性があります。コンテナーの PID 1 プロセスが SIGKILL を受信すると、コンテナーは直ちに終了します。それ以外の場合、コンテナーの動作は他のプロセスの動作に依存します。
たとえば、コンテナーのプロセスは、SIGKILL シグナルを受信したことを示すコード 137 で終了します。
コンテナーがすぐに終了しない場合は、以下の手順を使用して、メモリー不足による強制終了が発生したかどうかを検出します。
手順
リモートシェルを使用して Pod にアクセスします。
# oc rsh test以下のコマンドを実行して、
/sys/fs/cgroup/memory/memory.oom_controlで現在の OOM kill カウントを表示します。$ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control出力例
oom_kill 0以下のコマンドを実行して、Out Of Memory (OOM) による強制終了を促します。
$ sed -e '' </dev/zero出力例
Killed以下のコマンドを実行して、
sedコマンドの終了ステータスを表示します。$ echo $?出力例
137137コードは、コンテナーのプロセスが、SIGKILL シグナルを受信したことを示すコード 137 で終了していることを示唆します。以下のコマンドを実行して、
/sys/fs/cgroup/memory/memory.oom_controlの OOM kill カウンターの増分を表示します。$ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control出力例
oom_kill 1Pod の 1 つ以上のプロセスが OOM で強制終了され、Pod がこれに続いて終了する場合 (即時であるかどうかは問わない)、フェーズは Failed、理由は OOMKilled になります。OOM で強制終了された Pod は
restartPolicyの値によって再起動する場合があります。再起動されない場合は、レプリケーションコントローラーなどのコントローラーが Pod の失敗したステータスを認識し、古い Pod に置き換わる新規 Pod を作成します。以下のコマンドを使用して Pod のステータスを取得します。
$ oc get pod test出力例
NAME READY STATUS RESTARTS AGE test 0/1 OOMKilled 0 1mPod が再起動されていない場合は、以下のコマンドを実行して Pod を表示します。
$ oc get pod test -o yaml出力例
apiVersion: v1 kind: Pod metadata: name: test # ... status: containerStatuses: - name: test ready: false restartCount: 0 state: terminated: exitCode: 137 reason: OOMKilled phase: Failed再起動した場合は、以下のコマンドを実行して Pod を表示します。
$ oc get pod test -o yaml出力例
apiVersion: v1 kind: Pod metadata: name: test # ... status: containerStatuses: - name: test ready: true restartCount: 1 lastState: terminated: exitCode: 137 reason: OOMKilled state: running: phase: Running