Linux OOM Killer란? Out of Memory 발생 원리와 프로세스 종료 기준 완벽 이해

Linux 서버에서는 메모리가 부족해지는 상황이 발생할 수 있습니다. 웹 서버에 과도한 요청이 몰리거나, 데이터베이스가 예상보다 많은 메모리를 사용하거나, 메모리 누수(Memory Leak)가 발생하면 시스템은 더 이상 새로운 메모리를 할당할 수 없게 됩니다.

이때 Linux Kernel은 시스템 전체가 멈추는 것을 방지하기 위해 OOM Killer(Out of Memory Killer) 를 실행합니다.

OOM Killer는 실행 중인 프로세스 중 하나를 강제로 종료하여 메모리를 확보하는 Kernel의 보호 기능입니다.

이번 글에서는 OOM Killer의 동작 원리와 프로세스 선택 기준, 확인 방법, 그리고 실무에서의 대응 방법까지 자세히 알아보겠습니다.

OOM Killer란?

OOM Killer는 시스템 메모리가 부족하여 더 이상 메모리를 할당할 수 없는 상황에서 특정 프로세스를 종료하는 Linux Kernel 기능입니다.

동작 과정은 다음과 같습니다.

프로세스 메모리 요청

↓

메모리 부족

↓

Kernel 검사

↓

OOM Killer 실행

↓

프로세스 종료

↓

메모리 확보

이 과정을 통해 시스템 전체가 다운되는 것을 방지합니다.

OOM Killer가 필요한 이유

메모리가 모두 사용된 상황에서 새로운 메모리 요청이 계속되면 시스템은 정상적으로 동작할 수 없습니다.

OOM Killer가 없다면 다음과 같은 문제가 발생할 수 있습니다.

  • 시스템 응답 없음
  • 프로세스 전체 정지
  • 커널 패닉 위험 증가
  • 서비스 장애

따라서 Linux는 마지막 보호 장치로 OOM Killer를 실행합니다.

OOM Killer는 언제 실행될까?

대표적인 상황은 다음과 같습니다.

  • 물리 메모리 부족
  • Swap 공간 부족
  • 메모리 누수 발생
  • 컨테이너 메모리 초과
  • 대용량 프로그램 실행

특히 Swap까지 모두 사용한 경우 OOM Killer가 실행될 가능성이 높습니다.

OOM Score란?

OOM Killer는 임의로 프로세스를 종료하지 않습니다.

각 프로세스에 OOM Score를 계산하여 종료 대상을 선택합니다.

점수가 높을수록 종료될 가능성이 높습니다.

확인 방법

cat /proc/PID/oom_score

예시

742

값이 높을수록 OOM Killer의 우선 대상입니다.

OOM Score Adj란?

관리자는 프로세스의 우선순위를 조정할 수 있습니다.

현재 설정 확인

cat /proc/PID/oom_score_adj

기본값

0

범위는 다음과 같습니다.

의미
-1000절대 종료하지 않음
0기본값
500종료 가능성 증가
1000가장 먼저 종료

예를 들어 중요한 데이터베이스 프로세스는 -1000으로 설정하는 경우가 있습니다.

OOM Killer 동작 과정

전체 흐름은 다음과 같습니다.

프로세스 메모리 요청

↓

메모리 부족

↓

OOM Score 계산

↓

종료 대상 선택

↓

SIGKILL 전송

↓

프로세스 종료

↓

메모리 확보

SIGKILL은 강제 종료 신호이므로 애플리케이션이 종료를 거부할 수 없습니다.

OOM 발생 확인

Kernel 로그에서 확인할 수 있습니다.

dmesg | grep -i oom

또는

journalctl -k | grep -i oom

예시

Out of memory:

Killed process 12345 (java)

어떤 프로세스가 종료되었는지 확인할 수 있습니다.

메모리 상태 확인

현재 메모리 사용량

free -h

가상 메모리 통계

vmstat 1

프로세스 메모리 사용량

ps aux --sort=-%mem

메모리를 가장 많이 사용하는 프로세스를 확인할 수 있습니다.

OOM Killer 방지 방법

다음과 같은 방법으로 OOM 발생 가능성을 줄일 수 있습니다.

  • 메모리 증설
  • Swap 구성
  • 메모리 누수 수정
  • 불필요한 서비스 종료
  • 컨테이너 메모리 제한 설정
  • JVM Heap 크기 조정
  • 애플리케이션 메모리 최적화

OOM Killer는 최후의 보호 장치이므로 근본 원인을 해결하는 것이 중요합니다.

실무에서 자주 사용하는 명령어

메모리 사용량

free -h

OOM 로그 확인

dmesg | grep -i oom

Kernel 로그

journalctl -k

프로세스 메모리 사용량

ps aux --sort=-%mem

OOM Score 확인

cat /proc/PID/oom_score

OOM Score 조정 확인

cat /proc/PID/oom_score_adj

실무 사례

예를 들어 Java 서버가 갑자기 종료되었다고 가정해 보겠습니다.

다음 순서로 확인합니다.

  1. dmesg | grep -i oom으로 OOM 발생 여부 확인
  2. journalctl -k에서 종료된 프로세스 확인
  3. free -h로 메모리 사용량 확인
  4. ps aux --sort=-%mem으로 메모리 사용량이 높은 프로세스 확인
  5. JVM Heap 설정과 Swap 구성 확인
  6. 필요 시 oom_score_adj를 조정하여 핵심 서비스 보호

이러한 과정을 통해 OOM의 원인을 분석하고 재발을 방지할 수 있습니다.

자주 묻는 질문

OOM Killer는 랜덤으로 프로세스를 종료하나요?

아닙니다. OOM Score를 기반으로 메모리 사용량과 프로세스 특성을 종합적으로 평가한 후 종료 대상을 선택합니다.

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

권장되지 않습니다. OOM Killer를 비활성화하면 메모리 부족 시 시스템 전체가 멈추거나 심각한 장애가 발생할 수 있습니다.

Swap이 있으면 OOM Killer가 실행되지 않나요?

반드시 그렇지는 않습니다. Swap이 모두 사용되거나 메모리 압박이 심한 경우에는 Swap이 있어도 OOM Killer가 실행될 수 있습니다.

마무리

OOM Killer는 Linux Kernel이 메모리 부족 상황에서 시스템을 보호하기 위한 핵심 기능입니다. OOM Score를 기반으로 종료 대상을 선택하고, 강제로 프로세스를 종료하여 메모리를 확보합니다. free, vmstat, dmesg, journalctl 등을 활용하면 OOM 발생 원인을 분석할 수 있으며, 적절한 메모리 관리와 Swap 설정을 통해 대부분의 문제를 예방할 수 있습니다.

댓글 남기기