7.4.4. OOM 종료 정책 이해
컨테이너에 있는 모든 프로세스의 총 메모리 사용량이 메모리 제한을 초과하거나 노드의 메모리 부족 상태가 심각한 경우에는 OpenShift Container Platform에서 컨테이너의 프로세스를 종료할 수 있습니다.
프로세스가 OOM(Out of Memory) 종료되면 컨테이너가 즉시 종료될 수 있습니다. 컨테이너 PID 1 프로세스에서 SIGKILL을 수신하면 컨테이너가 즉시 종료됩니다. 그 외에는 컨테이너 동작이 기타 프로세스의 동작에 따라 달라집니다.
예를 들어 컨테이너 프로세스가 코드 137로 종료되면 SIGKILL 신호가 수신되었음을 나타냅니다.
컨테이너가 즉시 종료되지 않으면 다음과 같이 OOM 종료를 탐지할 수 있습니다.
원격 쉘을 사용하여 Pod에 액세스합니다.
# oc rsh test
다음 명령을 실행하여
/sys/fs/cgroup/memory/memory.oom_control
에서 현재 OOM 종료 수를 확인합니다.$ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control oom_kill 0
다음 명령을 실행하여 OOM 종료를 유도합니다.
$ sed -e '' </dev/zero
출력 예
Killed
다음 명령을 실행하여
sed
명령의 종료 상태를 확인합니다.$ echo $?
출력 예
137
137
코드는 컨테이너 프로세스가 코드 137로 종료되었음을 나타냅니다. 이 코드는 SIGKILL 신호가 수신되었음을 나타냅니다.다음 명령을 실행하여
/sys/fs/cgroup/memory/memory.oom_control
에서 OOM 종료 카운터가 증가했는지 확인합니다.$ grep '^oom_kill ' /sys/fs/cgroup/memory/memory.oom_control oom_kill 1
Pod에서 하나 이상의 프로세스가 OOM 종료된 경우 나중에 Pod가 종료되면(즉시 여부와 관계없이) 단계는 실패, 이유는 OOM 종료가 됩니다.
restartPolicy
값에 따라 OOM 종료된 Pod가 다시 시작될 수 있습니다. 재시작되지 않는 경우 복제 컨트롤러와 같은 컨트롤러는 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