Linux 서버를 운영하다 보면 프로그램 실행 중 갑자기 종료되거나 서비스가 비정상적으로 동작하면서 Out of memory 오류가 발생하는 경우가 있습니다. 이 오류는 시스템에서 사용할 수 있는 메모리가 모두 소진되어 새로운 메모리를 할당할 수 없는 상태를 의미합니다.
특히 데이터베이스, Java 애플리케이션, Docker 컨테이너, Kubernetes Pod, 웹 서버처럼 메모리 사용량이 많은 서비스에서 자주 발생합니다. 메모리 부족이 심해지면 Linux 커널은 OOM(Out Of Memory) Killer를 실행하여 일부 프로세스를 강제로 종료하기도 합니다.
이번 글에서는 Out of memory 오류가 발생하는 원인과 해결 방법을 자세히 알아보겠습니다.
Out of memory란 무엇인가?
프로그램이 필요한 메모리를 요청했지만 시스템에서 더 이상 메모리를 할당할 수 없을 때 발생하는 오류입니다.
대표적인 오류 예시는 다음과 같습니다.
Out of memory
또는
java.lang.OutOfMemoryError: Java heap space
또는
malloc(): Out of memory
이 오류는 애플리케이션 자체에서 출력될 수도 있고, Linux 커널 로그에 기록될 수도 있습니다.
Out of memory 오류가 발생하는 대표적인 원인
다음과 같은 경우에 자주 발생합니다.
- RAM 부족
- Swap 부족
- 메모리 누수(Memory Leak)
- Java Heap 부족
- Docker 메모리 제한
- Kubernetes Memory Limit 초과
- 대용량 데이터 처리
- 캐시 과다 사용
- 메모리 단편화
- 잘못된 애플리케이션 설정
실무에서는 현재 메모리 사용량과 어떤 프로세스가 메모리를 많이 사용하는지 먼저 확인해야 합니다.
1. 메모리 사용량 확인하기
현재 메모리 상태를 확인합니다.
free -h
예시
total used free
Mem: 32G 31G 300M
Swap: 8G 8G 0B
RAM과 Swap이 모두 거의 사용 중이라면 메모리 부족 가능성이 매우 높습니다.
2. 실시간 메모리 사용량 확인하기
현재 메모리를 많이 사용하는 프로세스를 확인합니다.
top
또는
htop
%MEM 항목이 높은 프로세스를 확인합니다.
3. 메모리 사용량 순으로 프로세스 확인하기
ps aux --sort=-%mem | head -20
메모리를 가장 많이 사용하는 프로세스를 빠르게 찾을 수 있습니다.
4. Swap 사용량 확인하기
현재 Swap 사용 현황을 확인합니다.
swapon --show
또는
cat /proc/swaps
Swap까지 모두 사용 중이라면 OOM이 발생할 가능성이 매우 높습니다.
5. OOM 로그 확인하기
커널 로그를 확인합니다.
dmesg | grep -i oom
또는
journalctl -k | grep -i oom
다음과 같은 로그가 보일 수 있습니다.
Out of memory: Kill process 12345 (java)
OOM Killer가 실행된 기록입니다.
6. Docker 메모리 제한 확인하기
Docker 환경에서는 컨테이너 메모리 제한을 확인합니다.
docker stats
또는
docker inspect 컨테이너명
메모리 제한(Memory)이 실제 사용량보다 너무 낮게 설정되어 있는지 확인합니다.
7. Kubernetes 리소스 확인하기
Pod의 메모리 제한을 확인합니다.
kubectl describe pod POD_NAME
다음 항목을 확인합니다.
- Requests
- Limits
Memory Limit을 초과하면 Pod가 종료될 수 있습니다.
8. Java Heap 확인하기
Java 애플리케이션이라면 Heap 크기를 확인합니다.
jcmd PID VM.flags
또는
jmap -heap PID
-Xms, -Xmx 값이 적절하게 설정되어 있는지 확인합니다.
9. 메모리 누수 확인하기
프로세스의 메모리 사용량이 지속적으로 증가하는지 확인합니다.
top
또는
ps aux --sort=-%mem
시간이 지날수록 메모리가 계속 증가한다면 메모리 누수를 의심해야 합니다.
10. 시스템 로그 확인하기
전체 시스템 로그를 확인합니다.
journalctl -xe
또는
dmesg
메모리 부족 외에 다른 시스템 오류가 함께 발생했는지 확인합니다.
Out of memory 문제를 확인하는 순서
실무에서는 다음 순서대로 점검하는 것이 가장 효율적입니다.
free -h확인top또는htop확인ps aux --sort=-%mem확인- Swap 확인
- OOM 로그 확인
- Docker 메모리 제한 확인
- Kubernetes Memory Limit 확인
- Java Heap 확인
- 메모리 누수 분석
- 시스템 로그 확인
이 순서대로 확인하면 대부분의 원인을 빠르게 파악할 수 있습니다.
오류를 해결할 때 주의할 점
메모리 부족이 발생했다고 해서 무조건 RAM을 증설하는 것이 최선의 해결책은 아닙니다.
먼저 메모리를 과도하게 사용하는 프로세스가 있는지, 메모리 누수가 발생하고 있는지, Docker나 Kubernetes의 메모리 제한이 적절한지 확인해야 합니다. 또한 Linux는 캐시를 적극적으로 활용하므로 buff/cache가 많다고 해서 곧바로 메모리 부족이라고 판단해서는 안 됩니다.
자주 묻는 질문
Swap이 충분한데도 Out of memory가 발생합니다.
메모리 제한(ulimit, Docker, Kubernetes)이나 특정 애플리케이션의 Heap 설정 문제일 수 있습니다.
Java에서만 OutOfMemoryError가 발생합니다.
Java Heap(-Xmx)이 부족하거나 메모리 누수가 발생했을 가능성이 높습니다.
OOM Killer와 Out of memory는 같은 의미인가요?
아닙니다. Out of memory는 메모리 부족 상태를 의미하며, OOM Killer는 그 상태를 해결하기 위해 Linux 커널이 특정 프로세스를 강제로 종료하는 기능입니다.
마무리
Out of memory 오류는 Linux 서버 운영 중 가장 자주 발생하는 메모리 관련 문제 중 하나입니다. free, top, ps, swapon, dmesg, journalctl 등을 활용해 메모리 사용량과 OOM 로그를 단계적으로 확인하면 대부분의 원인을 빠르게 파악할 수 있습니다. 특히 메모리 누수나 컨테이너 리소스 제한을 함께 점검하면 재발 방지에도 큰 도움이 됩니다.