41.6. 诊断 OOM Kill
如果容器中所有进程的内存总用量超过内存限制,或者在严重的节点内存耗尽情形下,OpenShift Container Platform 可以终止容器中的某个进程。
当一个进程被 OOM 终止时,这有可能会造成容器立即退出,但也不一定。如果容器 PID 1 进程收到 SIGKILL,则容器会立即退出。否则,容器行为将取决于其他进程的行为。
如果容器没有立即退出,则能够检测到 OOM 终止,如下所示:
- 使用代码 137 退出的容器进程,表示它收到了 SIGKILL 信号
-
/sys/fs/cgroup/memory/memory.oom_control
中的 oom_kill 计数器递增
$ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control oom_kill 0 $ sed -e '' </dev/zero # provoke an OOM kill Killed $ echo $? 137 $ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control oom_kill 1
如果 pod 中的一个或多个进程遭遇 OOM 终止,那么当 pod 随后退出时(不论是否立即发生),它都将会具有原因为 OOMKilled 的 Failed 阶段。OOM 终止的 pod 可以根据 restartPolicy
的值来重新启动。如果不重启,ReplicationController 等控制器会看到 pod 的失败状态,并创建一个新 pod 来取代旧 pod。
如果不重启,pod 状态如下:
$ oc get pod test NAME READY STATUS RESTARTS AGE test 0/1 OOMKilled 0 1m $ oc get pod test -o yaml ... status: containerStatuses: - name: test ready: false restartCount: 0 state: terminated: exitCode: 137 reason: OOMKilled phase: Failed
如果重启,其状态如下:
$ oc get pod test NAME READY STATUS RESTARTS AGE test 1/1 Running 1 1m $ oc get pod test -o yaml ... status: containerStatuses: - name: test ready: true restartCount: 1 lastState: terminated: exitCode: 137 reason: OOMKilled state: running: phase: Running