Linux Out of memory 오류가 발생하는 원인과 해결 방법

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 문제를 확인하는 순서

실무에서는 다음 순서대로 점검하는 것이 가장 효율적입니다.

  1. free -h 확인
  2. top 또는 htop 확인
  3. ps aux --sort=-%mem 확인
  4. Swap 확인
  5. OOM 로그 확인
  6. Docker 메모리 제한 확인
  7. Kubernetes Memory Limit 확인
  8. Java Heap 확인
  9. 메모리 누수 분석
  10. 시스템 로그 확인

이 순서대로 확인하면 대부분의 원인을 빠르게 파악할 수 있습니다.

오류를 해결할 때 주의할 점

메모리 부족이 발생했다고 해서 무조건 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 로그를 단계적으로 확인하면 대부분의 원인을 빠르게 파악할 수 있습니다. 특히 메모리 누수나 컨테이너 리소스 제한을 함께 점검하면 재발 방지에도 큰 도움이 됩니다.

댓글 남기기