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 |
| cache | Cache 영역 |
| 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 aux | Memory 높은 Process 확인 |
| smem | 상세 Memory 분석 |
| pmap | Memory Mapping 확인 |
| docker stats | Container Memory 확인 |
| kubectl describe | Kubernetes 분석 |
자주 묻는 질문
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 Leak | Memory 반환 실패 문제 |
| Process | Memory 사용 주체 |
| OOM Killer | Memory 보호 기능 |
| Monitoring | 장애 예방 |
| Resource Limit | 사용량 제어 |
Memory Leak 분석 방법을 이해하면 Linux Server뿐 아니라 Docker, Kubernetes, Cloud 환경에서 발생하는 Memory 관련 장애까지 효과적으로 대응할 수 있습니다.