Linux Out Of Memory(OOM) Killer 완벽 가이드! 메모리 부족 원인과 프로세스 종료 기준 이해하기

Linux Server를 운영하다 보면 갑자기 Application이 종료되거나 서비스가 중단되는 상황이 발생할 수 있습니다.

특히 서버의 Memory 사용량이 지속적으로 증가하면 Linux Kernel은 시스템 전체 장애를 방지하기 위해 특정 Process를 강제로 종료합니다.

이때 동작하는 기능이 바로 OOM Killer입니다.

OOM은 Out Of Memory(메모리 부족 상태)를 의미하며, Linux Kernel이 더 이상 사용할 Memory가 부족하다고 판단했을 때 실행되는 보호 기능입니다.

예:

Application 실행↓Memory 사용량 증가↓Available Memory 부족↓Linux Kernel 판단↓OOM Killer 실행↓Process 종료

OOM Killer는 장애를 만드는 기능이 아니라 시스템 전체가 멈추는 상황을 방지하기 위한 Linux Kernel의 안전 장치입니다.

구성 요소역할
MemoryApplication 데이터 저장
Linux KernelMemory 관리
OOM Killer부족한 Memory 대응
Process종료 대상
Log원인 분석 정보

Linux Out Of Memory(OOM) Killer 동작 원리를 이해하면 서버 Memory 장애 원인을 분석하고 안정적인 Linux 운영 환경을 구축할 수 있습니다.

Linux Out Of Memory(OOM)란?

Out Of Memory(OOM)는 Linux 시스템에서 사용 가능한 Memory가 부족해지는 상태입니다.

일반적으로 다음과 같은 상황에서 발생합니다.

  • Application Memory Leak
  • 과도한 Traffic 증가
  • Database Memory 증가
  • Container Resource 부족
  • 잘못된 Memory 설정

Memory 부족 상태가 지속되면 새로운 Process 실행이 불가능해지고 전체 System 성능이 저하될 수 있습니다.

Linux Memory 구조 이해하기

Linux Memory는 단순히 Application만 사용하는 것이 아닙니다.

구조:

Physical Memory(RAM)↓Kernel Memory↓Application Memory↓Cache / Buffer

Linux는 남은 Memory를 Cache와 Buffer로 활용하여 Disk I/O 성능을 높입니다.

따라서 free 명령어에서 free Memory가 적다고 바로 문제가 발생한 것은 아닙니다.

확인:

free -h

확인 항목:

  • available Memory
  • used Memory
  • swap 사용량

특히 available 값을 확인하는 것이 중요합니다.

Linux에서 Out Of Memory가 발생하는 원인

Application Memory Leak

가장 대표적인 원인입니다.

Memory Leak은 Application이 사용한 Memory를 반환하지 않고 계속 점유하는 현상입니다.

예:

Application 실행↓Memory 500MB 사용↓시간 증가↓Memory 8GB 사용↓System Memory 부족

주요 대상:

  • Java Application
  • Web Server
  • Database
  • Custom Application

Memory Leak이 발생하면 Process Restart 또는 Code 개선이 필요합니다.

과도한 Traffic 증가

갑작스러운 사용자 증가도 Memory 부족 원인이 됩니다.

구조:

User 증가↓Request 증가↓Application Worker 증가↓Memory 사용 증가↓OOM 발생

운영 환경에서는 Auto Scaling과 Resource Monitoring이 필요합니다.

Database Memory 증가

Database는 많은 Cache와 Buffer를 사용합니다.

예:

  • MySQL Buffer Pool
  • PostgreSQL Shared Buffer
  • Redis Memory

Database 설정이 서버 Memory보다 크게 설정되면 OOM이 발생할 수 있습니다.

Linux OOM Killer는 어떻게 동작할까?

Linux Kernel은 Memory 부족 상황에서 모든 Process를 종료하지 않습니다.

각 Process의 상태를 분석하여 종료 우선순위를 결정합니다.

동작 과정:

Memory 부족↓Kernel Memory 분석↓Process 점수 계산↓가장 적합한 Process 선택↓Process 종료

종료 대상 선정에는 OOM Score가 사용됩니다.

oom_score란?

Linux는 Process마다 OOM Score를 계산합니다.

확인:

cat /proc/<PID>/oom_score

예:

850

값이 높을수록 OOM Killer 종료 대상이 될 가능성이 높습니다.

일반적으로:

  • Memory 사용량이 큰 Process
  • 많은 Resource를 사용하는 Process

가 높은 점수를 가질 가능성이 있습니다.

oom_score_adj란?

관리자는 특정 Process의 OOM 종료 우선순위를 조정할 수 있습니다.

확인:

cat /proc/<PID>/oom_score_adj

범위:

-1000 ~ 1000
의미
-1000OOM Killer 보호
0기본값
1000우선 종료 대상

중요한 Database나 System Process는 조정할 수 있습니다.

Linux OOM Killer 로그 확인 방법

OOM Killer가 실행되면 Kernel Log에 기록됩니다.

확인:

dmesg | grep-i oom

또는:

journalctl -k | grep-ikill

예:

Out of memory: Killed process 1234 (java)

확인할 내용:

  • 종료된 Process
  • PID
  • Memory 사용량
  • Kernel 판단 결과

Memory 부족 Process 찾는 방법

top 명령어

top

확인:

  • %MEM
  • RES Memory
  • CPU 사용량

Memory를 많이 사용하는 Process를 찾을 수 있습니다.

ps 명령어

ps aux --sort=-%mem

Memory 사용량 기준으로 Process를 정렬합니다.

Docker 환경에서 OOM 발생

Container 환경에서도 Out Of Memory 문제가 자주 발생합니다.

구조:

Container Application↓Memory Limit 초과↓Container 종료↓OOM 발생

확인:

docker stats

Memory 제한 설정:

docker run --memory=2g nginx

Container는 반드시 Resource 제한을 설정하는 것이 좋습니다.

Kubernetes OOMKilled란?

Kubernetes에서는 Memory 부족으로 Container가 종료되면 OOMKilled 상태가 표시됩니다.

확인:

kubectl describe pod

결과:

Reason: OOMKilled

주요 원인:

  • Memory Limit 부족
  • Application Memory Leak
  • 잘못된 Resource 설정

Kubernetes에서는 Resource Request와 Limit 설정이 중요합니다.

Out Of Memory 예방 방법

Memory Monitoring 구성

운영 환경에서는 지속적인 Monitoring이 필요합니다.

구조:

Linux Server↓Node Exporter↓Prometheus↓Grafana↓Memory Alert

확인:

  • Memory 사용률
  • Swap 사용량
  • Process 상태

Application Memory 제한

무제한 Memory 사용을 방지해야 합니다.

Docker:

--memory=2g

Kubernetes:

resources: limits:  memory: 2Gi

Swap 관리

Swap은 부족한 Memory를 보조하는 기능입니다.

확인:

swapon --show

하지만 Swap은 RAM보다 느리기 때문에 근본적인 해결책은 아닙니다.

Linux OOM 장애 분석 순서

장애 발생:

Service Down↓Memory 상태 확인↓OOM Log 확인↓Process 분석↓Application 개선

분석 순서:

  1. free 명령어 확인
  2. OOM Log 확인
  3. Memory 사용 Process 확인
  4. Application Log 분석
  5. Resource 설정 확인

Linux Out Of Memory(OOM) Best Practice

권장:

  • Memory Monitoring 구성
  • Application Memory Leak 분석
  • Process Resource 관리
  • Docker Memory Limit 설정
  • Kubernetes Resource Limit 설정
  • OOM Log 정기 확인

안정적인 Server 운영 환경을 구축할 수 있습니다.

자주 묻는 질문

OOM Killer는 오류인가요?

아닙니다.

OOM Killer는 Linux 시스템 전체 장애를 방지하기 위한 Kernel 보호 기능입니다.

Memory가 부족하면 항상 OOM Killer가 실행되나요?

아닙니다.

Swap 사용 가능 여부, Memory 상태, Kernel 판단 기준에 따라 동작합니다.

Kubernetes OOMKilled와 Linux OOM Killer는 같은 것인가요?

비슷한 개념이지만 동작 위치가 다릅니다.

Linux OOM Killer는 Kernel 수준에서 동작하고 Kubernetes OOMKilled는 Container Memory Limit 초과 상황에서 발생합니다.

마무리

Linux Out Of Memory(OOM) Killer는 Memory 부족 상황에서 시스템 전체 장애를 방지하기 위해 특정 Process를 종료하는 Linux Kernel 기능입니다.

구성 요소역할
Out Of Memory(OOM)Memory 부족 상태
OOM KillerProcess 종료 관리
oom_score종료 우선순위 판단
Log장애 분석
Monitoring예방 관리

Linux OOM Killer 동작 원리와 분석 방법을 이해하면 Linux Server, Docker, Kubernetes 환경에서 발생하는 Memory 장애를 효과적으로 해결할 수 있습니다.

함께 보면 좋은 글

댓글 남기기