Linux Memory Leak 원인과 해결 방법! 메모리 누수 확인 및 OOM 장애 예방 방법

Linux Memory Leak이란?

Linux Server를 운영하다 보면 시간이 지날수록 Memory 사용량이 계속 증가하고 결국 Server가 느려지거나 Application이 종료되는 문제가 발생할 수 있습니다.

이러한 현상을 Memory Leak(메모리 누수)이라고 합니다.

Memory Leak은 Application이 사용한 Memory를 정상적으로 반환하지 못하는 문제입니다.

기본 구조:

Application 실행↓Memory 할당↓작업 완료↓Memory 반환 실패↓사용 Memory 지속 증가↓Memory 부족 발생

Memory Leak이 지속되면 Linux Kernel은 사용 가능한 Memory가 부족해지고 OOM(Out Of Memory) Killer를 실행할 수 있습니다.

정상적인 Memory 사용과 Memory Leak 차이

모든 Memory 증가가 문제가 되는 것은 아닙니다.

Linux에서는 Cache와 Buffer를 적극적으로 활용하기 때문에 Memory 사용량이 높게 보일 수 있습니다.

정상:

Application 실행↓Memory 증가↓작업 종료↓Memory 반환↓안정화

Memory Leak:

Application 실행↓Memory 증가↓작업 종료↓Memory 반환 실패↓계속 증가

핵심 차이는 시간이 지나도 Memory가 계속 증가하는지 여부입니다.

Linux Memory 구조 이해하기

Memory Leak을 분석하려면 Linux Memory 구조를 이해해야 합니다.

구조:

Application↓Process Memory↓Virtual Memory↓Physical RAM↓Hardware

Process는 Virtual Memory 공간을 사용하며 Linux Kernel이 실제 RAM과 연결합니다.

Process Memory 영역

Linux Process Memory는 여러 영역으로 구성됩니다.

Process Memory├ Code├ Data├ Heap└ Stack

Memory Leak은 주로 Heap 영역에서 발생합니다.

Heap Memory Leak이란?

Heap은 Application이 실행 중 동적으로 할당하는 Memory 공간입니다.

예:

Memory 할당↓사용↓반환하지 않음↓Memory 증가

대표 원인:

  • 객체 해제 실패
  • 잘못된 Cache 관리
  • 종료되지 않는 Thread
  • 무한 데이터 저장

Linux Memory Leak 발생 주요 원인

Application Bug

가장 일반적인 원인입니다.

예:

  • 사용하지 않는 객체 유지
  • 전역 변수 증가
  • Cache 삭제 실패
  • Thread 종료 실패

Java Memory Leak

Java Application에서도 Memory Leak이 발생할 수 있습니다.

대표 원인:

  • Collection 데이터 누적
  • Static Object 증가
  • Thread Local 미정리
  • Cache 관리 실패

확인 도구:

  • jmap
  • jstack
  • VisualVM

Web Application Memory Leak

Web Server나 WAS에서도 Memory Leak이 발생합니다.

예:

사용자 요청 증가↓Session 증가↓Memory 증가↓Application 장애

대표 환경:

  • Tomcat
  • Spring
  • Node.js
  • Python Application

Linux에서 Memory Leak 확인 방법

free 명령어 확인

현재 Memory 상태 확인:

free -h

확인:

항목설명
total전체 Memory
used사용 Memory
free남은 Memory
cacheCache 영역
available사용 가능 Memory

단순 used 값보다 available 값을 확인하는 것이 중요합니다.

top 명령어 활용

실시간 Memory 사용 Process 확인:

top

확인:

PIDUSER%MEMCOMMAND

Memory 사용량이 높은 Process를 찾을 수 있습니다.

ps 명령어 활용

Memory 기준 정렬:

ps aux --sort=-%mem

결과:

USERPID%MEMCOMMAND

특정 Process의 Memory 사용량을 확인할 수 있습니다.

smem 명령어 활용

smem은 Process Memory를 더욱 상세하게 분석할 수 있습니다.

설치:

apt install smem

확인:

smem -r

확인:

  • RSS
  • PSS
  • USS

pmap 명령어 활용

특정 Process Memory Mapping 확인:

pmap PID

예:

pmap 1234

확인:

  • Heap
  • Library
  • Memory Mapping

Memory 증가 패턴 분석

Memory Leak은 시간 흐름을 확인해야 합니다.

분석:

09:00Memory 40%↓12:00Memory 70%↓15:00Memory 95%

지속적으로 증가한다면 Memory Leak 가능성이 높습니다.

Linux OOM Killer와 Memory Leak 관계

Memory Leak이 심해지면 Linux Kernel은 Memory 부족 상태를 감지합니다.

구조:

Memory Leak↓Available Memory 감소↓Memory Pressure 증가↓OOM Killer 실행↓Process 종료

확인:

dmesg | grep-i oom

또는:

journalctl | grep-i oom

Docker Container Memory Leak

Container 환경에서도 Memory Leak은 발생합니다.

구조:

Docker Container↓Application Process↓Memory 증가↓Container Limit 초과

확인:

docker stats

확인:

  • CPU
  • Memory Usage
  • Memory Limit

Docker Memory 제한 설정

Container가 무제한 Memory를 사용하는 것을 방지합니다.

예:

docker run --memory=512m nginx

설정 효과:

  • 장애 범위 제한
  • Host 보호

Kubernetes Memory Leak

Kubernetes 환경에서도 Container Memory 관리가 중요합니다.

구조:

Pod↓Container↓Application Memory 증가↓OOMKilled

확인:

kubectl describe pod pod-name

상태:

OOMKilled

Kubernetes Memory Limit 설정

예:

resources:  limits:    memory: "512Mi"

Memory 초과 시 Container를 재시작할 수 있습니다.

Memory Leak 장애 분석 순서

장애 발생:

서비스 느림↓Memory 사용량 확인↓Process 확인↓Memory 증가 패턴 분석↓Application 분석↓원인 수정

Memory Leak 해결 방법

Application 수정

가장 근본적인 해결 방법입니다.

방법:

  • 불필요한 Object 제거
  • Cache 만료 설정
  • Resource Close 처리
  • Thread 관리

Process Restart

임시 해결 방법입니다.

예:

systemctl restartservice

하지만 근본 원인 해결은 아닙니다.

Resource Limit 설정

Application이 Server 전체 Memory를 사용하는 것을 방지합니다.

사용:

  • Docker Memory Limit
  • Kubernetes Memory Limit

Memory Leak 예방 방법

권장:

  • Application Memory Monitoring
  • Heap Dump 분석
  • Resource 관리
  • 정기적인 Performance 테스트
  • Monitoring Alert 설정

Memory Leak 확인 명령어 정리

명령어용도
free -h전체 Memory 확인
top실시간 Process 확인
ps auxMemory 높은 Process 확인
smem상세 Memory 분석
pmapMemory Mapping 확인
docker statsContainer Memory 확인
kubectl describeKubernetes 분석

자주 묻는 질문

Linux Memory 사용량이 계속 증가하면 무조건 Memory Leak인가요?

아닙니다.

Cache 증가나 정상적인 Application 동작일 수도 있습니다.

시간에 따라 계속 증가하고 반환되지 않는 패턴인지 확인해야 합니다.

OOM Killer와 Memory Leak은 같은 문제인가요?

다릅니다.

Memory Leak은 원인이고 OOM Killer는 Memory 부족 상황에서 Linux Kernel이 실행하는 보호 기능입니다.

Process 재시작하면 해결되나요?

일시적으로 Memory는 확보되지만 Memory Leak 원인을 해결하지 않으면 다시 발생합니다.

마무리

Linux Memory Leak은 Server 성능 저하와 장애를 발생시키는 대표적인 문제입니다.

중요한 것은 단순히 Memory 사용량만 확인하는 것이 아니라 시간이 지나면서 증가하는 패턴과 특정 Process 원인을 분석하는 것입니다.

구성 요소역할
Memory LeakMemory 반환 실패 문제
ProcessMemory 사용 주체
OOM KillerMemory 보호 기능
Monitoring장애 예방
Resource Limit사용량 제어

Memory Leak 분석 방법을 이해하면 Linux Server뿐 아니라 Docker, Kubernetes, Cloud 환경에서 발생하는 Memory 관련 장애까지 효과적으로 대응할 수 있습니다.

함께 보면 좋은 글

댓글 남기기