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 서버가 갑자기 종료되었다고 가정해 보겠습니다.
다음 순서로 확인합니다.
dmesg | grep -i oom으로 OOM 발생 여부 확인journalctl -k에서 종료된 프로세스 확인free -h로 메모리 사용량 확인ps aux --sort=-%mem으로 메모리 사용량이 높은 프로세스 확인- JVM Heap 설정과 Swap 구성 확인
- 필요 시
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 설정을 통해 대부분의 문제를 예방할 수 있습니다.