7.4.4. 了解 OOM 终止策略

如果容器中所有进程的内存总用量超过内存限制,或者在严重的节点内存耗尽情形下,OpenShift Container Platform 可以终止容器中的某个进程。

当进程超出内存(OOM)终止时,这可能会导致容器立即退出。如果容器 PID 1 进程收到 SIGKILL,则容器会立即退出。否则,容器行为将取决于其他进程的行为。

例如,某个容器进程以代码 137 退出,这表示它收到了 SIGKILL 信号。

如果容器没有立即退出,则能够检测到 OOM 终止,如下所示:

  1. 使用远程 shell 访问 pod:

    # oc rsh test
  2. 运行以下命令,查看 /sys/fs/cgroup/memory/memory.oom_control 中的当前 OOM 终止计数:

    $ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control
    oom_kill 0
  3. 运行以下命令来引发一个 OOM kill:

    $ sed -e '' </dev/zero

    输出示例

    Killed

  4. 运行以下命令查看 sed 命令的退出状态:

    $ echo $?

    输出示例

    137

    例如,137 代表容器进程以代码 137 退出,这表示它收到了 SIGKILL 信号。

  5. 运行以下命令,查看 /sys/fs/cgroup/memory/memory.oom_control 中的 OOM 终止计数器:

    $ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control
    oom_kill 1

    如果 pod 中的一个或多个进程遭遇 OOM 终止,那么当 pod 随后退出时(不论是否立即发生),它都将会具有原因为 OOMKilledFailed 阶段。被 OOM 终止的 pod 可能会根据 restartPolicy 的值重启。如果不重启,复制控制器等控制器会看到 pod 的失败状态,并创建一个新 pod 来替换旧 pod。

    使用以下命令获取 pod 状态:

    $ oc get pod test

    输出示例

    NAME      READY     STATUS      RESTARTS   AGE
    test      0/1       OOMKilled   0          1m

    • 如果 pod 没有重启,请运行以下命令来查看 pod:

      $ oc get pod test -o yaml

      输出示例

      ...
      status:
        containerStatuses:
        - name: test
          ready: false
          restartCount: 0
          state:
            terminated:
              exitCode: 137
              reason: OOMKilled
        phase: Failed

    • 如果重启,运行以下命令来查看 pod:

      $ oc get pod test -o yaml

      输出示例

      ...
      status:
        containerStatuses:
        - name: test
          ready: true
          restartCount: 1
          lastState:
            terminated:
              exitCode: 137
              reason: OOMKilled
          state:
            running:
        phase: Running