Linux 서버를 운영하다 보면 정상적으로 실행되던 프로그램이 갑자기 종료되거나 서비스가 예고 없이 중단되는 경우가 있습니다. 로그를 확인해 보면 “Killed process” 또는 “Out of Memory”라는 메시지가 남아 있는 경우가 있는데, 이는 Linux의 OOM(Out Of Memory) Killer가 동작했기 때문입니다.
OOM Killer는 시스템 메모리가 모두 소진되어 더 이상 새로운 메모리를 할당할 수 없을 때 Linux 커널이 자동으로 실행하는 보호 기능입니다. 메모리가 부족한 상태를 계속 방치하면 시스템 전체가 멈출 수 있기 때문에, 커널은 특정 프로세스를 강제로 종료하여 메모리를 확보합니다.
이번 글에서는 OOM Killer가 무엇인지, 왜 발생하는지, 그리고 원인을 확인하고 해결하는 방법을 알아보겠습니다.
OOM Killer란 무엇인가?
OOM은 Out Of Memory의 약자로 시스템 메모리가 부족한 상태를 의미합니다.
Linux 커널은 메모리가 모두 사용되어 시스템이 정상적으로 동작할 수 없다고 판단하면 자동으로 OOM Killer를 실행합니다.
OOM Killer는 메모리를 많이 사용하는 프로세스나 중요도가 낮은 프로세스를 선택하여 강제로 종료합니다.
이 과정은 시스템 전체가 멈추는 것을 방지하기 위한 안전장치입니다.
OOM Killer가 발생하는 대표적인 원인
다음과 같은 상황에서 자주 발생합니다.
- 메모리 부족
- Memory Leak 발생
- Swap 부족
- 대용량 프로그램 실행
- 데이터베이스 메모리 증가
- Java Heap 설정 오류
- Docker 메모리 제한 초과
- 동시에 많은 프로그램 실행
메모리 사용량이 지속적으로 증가하면 OOM Killer가 실행될 가능성이 높아집니다.
1. 시스템 메모리 확인하기
먼저 현재 메모리 사용량을 확인합니다.
free -h
다음 항목을 확인합니다.
- Total
- Used
- Free
- Available
- Swap
Available 메모리가 거의 없다면 메모리 부족 상태일 가능성이 높습니다.
2. OOM 로그 확인하기
OOM Killer가 실행되었는지 확인합니다.
dmesg | grep -i oom
또는
journalctl -k | grep -i oom
“Killed process”라는 메시지가 있다면 OOM Killer가 실행된 것입니다.
3. 종료된 프로세스 확인하기
로그에서 종료된 프로세스를 확인합니다.
dmesg | grep "Killed process"
어떤 프로그램이 종료되었는지 확인할 수 있습니다.
4. 메모리를 많이 사용하는 프로세스 확인하기
현재 메모리를 많이 사용하는 프로그램을 확인합니다.
ps aux --sort=-%mem | head
상위 메모리 사용 프로세스를 쉽게 찾을 수 있습니다.
5. 실시간 메모리 상태 확인하기
실시간으로 메모리 변화를 확인합니다.
top
또는
htop
메모리가 지속적으로 증가하는 프로세스가 있는지 확인합니다.
6. Swap 사용량 확인하기
Swap 사용량도 확인합니다.
swapon --show
또는
cat /proc/swaps
Swap까지 모두 사용 중이라면 OOM 발생 가능성이 매우 높습니다.
7. Memory Leak 확인하기
특정 프로세스의 메모리가 계속 증가하는지 확인합니다.
pmap PID | tail
또는
smem
메모리 사용량이 지속적으로 증가한다면 Memory Leak을 의심할 수 있습니다.
8. Docker 환경 확인하기
Docker를 사용하는 경우 컨테이너 메모리 사용량을 확인합니다.
docker stats
특정 컨테이너가 과도한 메모리를 사용하는지 확인합니다.
9. 시스템 로그 확인하기
전체 시스템 로그를 확인합니다.
journalctl -xe
또는
dmesg | tail
메모리 부족과 관련된 메시지가 있는지 확인합니다.
10. OOM Score 확인하기
Linux는 각 프로세스마다 OOM Score를 계산합니다.
cat /proc/PID/oom_score
점수가 높을수록 OOM Killer가 종료 대상으로 선택할 가능성이 높습니다.
OOM 문제를 확인하는 순서
실무에서는 다음 순서대로 확인하는 것이 가장 효율적입니다.
- free -h
- dmesg
- journalctl
- 종료된 프로세스 확인
- ps aux –sort=-%mem
- top
- Swap 확인
- Memory Leak 확인
- Docker 확인
- OOM Score 확인
이 순서대로 점검하면 대부분의 원인을 빠르게 찾을 수 있습니다.
OOM Killer를 예방하는 방법
OOM Killer는 메모리가 부족할 때 마지막으로 동작하는 보호 기능입니다.
다음과 같은 방법으로 예방할 수 있습니다.
- 메모리 사용량 모니터링
- Memory Leak 수정
- Swap 설정 확인
- 불필요한 프로세스 종료
- Docker 메모리 제한 설정
- 애플리케이션 메모리 최적화
- 정기적인 로그 점검
평소 메모리 사용량을 관리하면 OOM 발생 가능성을 크게 줄일 수 있습니다.
자주 묻는 질문
OOM Killer는 오류인가요?
아닙니다.
시스템이 멈추는 것을 방지하기 위해 Linux 커널이 자동으로 실행하는 보호 기능입니다.
OOM Killer는 어떤 프로세스를 종료하나요?
메모리 사용량과 OOM Score 등을 종합적으로 계산하여 종료 대상을 선택합니다.
Swap이 있으면 OOM이 발생하지 않나요?
아닙니다.
Swap까지 모두 사용하면 OOM Killer는 여전히 실행될 수 있습니다.
마무리
OOM Killer는 Linux 시스템이 메모리 부족 상태에서 정상 동작을 유지하기 위해 자동으로 실행하는 중요한 기능입니다. 하지만 OOM Killer가 반복적으로 동작한다면 메모리 부족이나 Memory Leak과 같은 근본 원인을 해결해야 합니다. free, dmesg, journalctl, top, docker stats 등을 함께 활용하면 어떤 프로세스가 메모리를 과도하게 사용하는지 빠르게 확인하고 문제를 예방할 수 있습니다.