Linux OOM Killer가 프로세스를 종료하는 이유와 확인 방법

Linux 서버를 운영하다 보면 정상적으로 실행 중이던 프로그램이 갑자기 종료되거나 서비스가 예고 없이 중단되는 경우가 있습니다. 로그를 확인해 보면 Killed, Out of memory, OOM Killer invoked 등의 메시지가 기록되어 있는 경우가 많은데, 이는 Linux 커널의 OOM(Out Of Memory) Killer가 동작했기 때문입니다.

OOM Killer는 시스템 전체가 메모리 부족으로 멈추는 것을 방지하기 위해 일부 프로세스를 강제로 종료하는 기능입니다. 갑작스럽게 서비스가 종료되는 원인이 되기 때문에 서버 관리자라면 반드시 동작 원리와 확인 방법을 이해해야 합니다.

이번 글에서는 Linux OOM Killer가 동작하는 이유와 확인 방법, 그리고 예방 방법까지 자세히 알아보겠습니다.

OOM Killer란 무엇인가?

OOM Killer는 Linux 커널에 내장된 메모리 보호 기능입니다.

RAM과 Swap 공간까지 모두 부족해져 더 이상 메모리를 할당할 수 없는 경우, 커널은 시스템 전체가 멈추는 것을 방지하기 위해 하나 이상의 프로세스를 선택하여 종료합니다.

대표적인 로그는 다음과 같습니다.

Out of memory: Kill process 24871 (java)
Killed process 24871 (java)

또는

oom-killer: gfp_mask=0x...

이 메시지가 보인다면 OOM Killer가 동작한 것입니다.

OOM Killer가 동작하는 대표적인 원인

다음과 같은 상황에서 자주 발생합니다.

  • RAM 부족
  • Swap 부족
  • 메모리 누수(Memory Leak)
  • Java Heap 과다 사용
  • Docker 메모리 제한 초과
  • Kubernetes Memory Limit 초과
  • 대용량 데이터 처리
  • 동시에 많은 프로세스 실행
  • 잘못된 애플리케이션 설정
  • 비정상적인 메모리 사용 증가

실무에서는 메모리 부족의 원인을 먼저 찾는 것이 가장 중요합니다.

1. OOM 로그 확인하기

가장 먼저 커널 로그를 확인합니다.

dmesg | grep -i oom

또는

journalctl -k | grep -i oom

종료된 프로세스와 발생 시간을 확인할 수 있습니다.

2. 종료된 프로세스 확인하기

로그에서 종료된 프로세스를 확인합니다.

journalctl -k

예시

Killed process 32415 (mysqld)

어떤 프로세스가 종료되었는지 확인해야 합니다.

3. 현재 메모리 사용량 확인하기

free -h

예시

              total   used   free
Mem:           16G    15G    300M
Swap:           4G     4G      0B

RAM과 Swap이 모두 부족했다면 OOM Killer가 동작할 가능성이 높습니다.

4. 메모리를 많이 사용하는 프로세스 확인하기

ps aux --sort=-%mem | head -20

또는

top

메모리 사용량이 비정상적으로 높은 프로세스를 확인합니다.

5. Swap 확인하기

Swap 사용 여부를 확인합니다.

swapon --show

또는

cat /proc/swaps

Swap까지 모두 사용 중이라면 메모리 부족 상태입니다.

6. Docker 환경 확인하기

Docker 환경에서는 컨테이너 메모리 제한도 확인해야 합니다.

docker stats

또는

docker inspect 컨테이너명

컨테이너 메모리 제한 때문에 OOM Killer가 실행될 수도 있습니다.

7. Kubernetes 환경 확인하기

Pod의 메모리 제한을 확인합니다.

kubectl describe pod POD_NAME

다음 항목을 확인합니다.

  • Requests
  • Limits

Memory Limit을 초과하면 Pod가 종료될 수 있습니다.

8. Java Heap 확인하기

Java 애플리케이션이라면 Heap 설정도 확인합니다.

jcmd PID VM.flags

또는

jmap -heap PID

-Xmx 값이 실제 사용량에 맞게 설정되어 있는지 확인합니다.

9. OOM Score 확인하기

Linux는 각 프로세스에 OOM Score를 부여합니다.

확인 방법

cat /proc/PID/oom_score

값이 높을수록 OOM Killer가 우선 종료할 가능성이 높습니다.

또한 다음 명령으로 보호 수준을 확인할 수 있습니다.

cat /proc/PID/oom_score_adj

중요한 서비스는 적절한 oom_score_adj 설정으로 우선순위를 조정할 수 있습니다.

10. 메모리 누수 여부 확인하기

시간이 지날수록 메모리 사용량이 계속 증가하는지 확인합니다.

top

또는

ps aux --sort=-%mem

메모리 사용량이 지속적으로 증가한다면 메모리 누수를 의심해야 합니다.

OOM Killer 문제를 확인하는 순서

실무에서는 다음 순서대로 점검하는 것이 가장 효율적입니다.

  1. dmesg 확인
  2. journalctl -k 확인
  3. free -h 확인
  4. top 확인
  5. ps aux --sort=-%mem 확인
  6. Swap 확인
  7. Docker 메모리 확인
  8. Kubernetes Memory Limit 확인
  9. OOM Score 확인
  10. 메모리 누수 분석

이 순서대로 확인하면 대부분의 원인을 빠르게 파악할 수 있습니다.

OOM Killer를 예방하는 방법

OOM Killer가 자주 발생한다면 다음 사항을 점검하는 것이 좋습니다.

  • 메모리 누수 수정
  • 불필요한 프로세스 종료
  • Swap 공간 확보
  • Docker 및 Kubernetes 메모리 제한 조정
  • Java Heap 크기 최적화
  • 서버 메모리 증설
  • 애플리케이션 캐시 최적화
  • 지속적인 메모리 모니터링 구축

단순히 RAM을 늘리는 것보다 근본 원인을 해결하는 것이 중요합니다.

자주 묻는 질문

OOM Killer는 왜 특정 프로세스만 종료하나요?

Linux 커널은 메모리 사용량과 oom_score 등을 종합적으로 계산하여 종료 대상을 선택합니다.

OOM Killer를 비활성화할 수 있나요?

가능하지만 권장되지 않습니다. 비활성화하면 메모리 부족 시 시스템 전체가 멈출 수 있습니다.

OOM Killer가 자주 발생하면 서버를 교체해야 하나요?

반드시 그렇지는 않습니다. 메모리 누수, 잘못된 설정, 컨테이너 제한 등을 먼저 점검한 후 필요하다면 메모리 증설을 검토하는 것이 좋습니다.

마무리

OOM Killer는 Linux 서버를 보호하기 위한 중요한 기능이지만, 서비스 운영 측면에서는 예기치 않은 장애를 유발할 수 있습니다. dmesg, journalctl, free, top, ps, oom_score 등을 활용해 종료 원인을 정확히 분석하고, 메모리 사용량을 지속적으로 모니터링하면 재발을 효과적으로 예방할 수 있습니다.

댓글 남기기