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의 안전 장치입니다.
| 구성 요소 | 역할 |
|---|---|
| Memory | Application 데이터 저장 |
| Linux Kernel | Memory 관리 |
| 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
| 값 | 의미 |
|---|---|
| -1000 | OOM 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 개선
분석 순서:
- free 명령어 확인
- OOM Log 확인
- Memory 사용 Process 확인
- Application Log 분석
- 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 Killer | Process 종료 관리 |
| oom_score | 종료 우선순위 판단 |
| Log | 장애 분석 |
| Monitoring | 예방 관리 |
Linux OOM Killer 동작 원리와 분석 방법을 이해하면 Linux Server, Docker, Kubernetes 환경에서 발생하는 Memory 장애를 효과적으로 해결할 수 있습니다.
함께 보면 좋은 글
- Linux Out Of Memory(OOM) Killer가 동작하는 이유와 해결 방법
- Linux Process Scheduler란? CPU 스케줄러의 동작 원리와 프로세스 실행 방식
- Linux Load Average 완벽 가이드! CPU 부하 분석 방법
- Docker Container Memory 관리 완벽 가이드
- Kubernetes Resource Request 완벽 가이드! Scheduler 배치 기준과 CPU·Memory 관리 구조 이해하기