/엔지니어/트러블슈팅/메모리 누수 진단 — /proc/meminfo ·
트러블슈팅고급UbuntuDebianCentOS메모리누수valgrindsmaps

메모리 누수 진단 — /proc/meminfo · smaps · valgrind

/proc/meminfo와 free로 메모리 현황을 파악하고, smaps·pmap으로 프로세스 메모리를 분석하며, valgrind와 AddressSanitizer로 누수를 찾는 방법을 설명합니다.

1단계 — 메모리 현황 파악

Bash
# 전체 메모리 현황
free -h
# Mem: total=16G, used=14G, free=500M, buff/cache=2G, available=1G
# available이 중요 — 실제 사용 가능한 메모리

# 상세 정보
cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable|Cached|Buffers|SwapTotal|SwapFree"

# 시간에 따른 메모리 변화 관찰
watch -n 5 'free -h'

# vmstat으로 스왑 활성도 확인
vmstat 5 10
# si/so 컬럼이 지속적으로 0이 아니면 메모리 부족

2단계 — 메모리 소비 프로세스 특정

Bash
# 메모리 Top 10
ps aux --sort=-%mem | head -11
ps aux --sort=-rss | awk '{print $2, $4, $6, $11}' | head -11

# 특정 프로세스 메모리
ps -p 1234 -o pid,rss,vsz,cmd
# RSS: 실제 점유 메모리 (KB)
# VSZ: 가상 메모리 크기 (공유 라이브러리 포함)

# pidstat으로 메모리 추이 관찰
pidstat -r -p 1234 5 12   # 5초 간격, 1분

3단계 — 프로세스 메모리 맵 분석

Bash
# pmap — 메모리 매핑 요약
sudo pmap -x 1234
# RSS 합계가 실제 사용량
sudo pmap -x 1234 | tail -1

# /proc/PID/smaps — 상세 분석
sudo cat /proc/1234/smaps | awk '
  /^Private_Dirty/ { pd += $2 }
  /^Shared_Dirty/  { sd += $2 }
  END { printf "Private Dirty: %d KB\nShared Dirty: %d KB\n", pd, sd }
'

# smaps_rollup — 요약 (kernel 4.14+)
sudo cat /proc/1234/smaps_rollup

# 힙 크기 확인
sudo cat /proc/1234/status | grep -E "VmRSS|VmHeap|VmPeak"

4단계 — 언어별 메모리 누수 추적

C / C++ — Valgrind

Bash
sudo apt install -y valgrind

# 메모리 누수 검사
valgrind --leak-check=full \
         --show-leak-kinds=all \
         --track-origins=yes \
         --verbose \
         ./myprogram 2>&1 | tee valgrind.log

# 주요 출력
# "definitely lost": 확실한 누수
# "indirectly lost": 간접 누수
# "possibly lost": 누수 가능성

C / C++ — AddressSanitizer (빠른 컴파일 타임 검사)

Bash
# 컴파일 시 활성화
gcc -fsanitize=address -g -O1 myprogram.c -o myprogram
./myprogram   # 누수 발생 시 자동 보고

Python

Python
import tracemalloc

tracemalloc.start()

# 분석할 코드
do_something()

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
for stat in top_stats[:10]:
    print(stat)

Node.js

Bash
# heapdump로 스냅샷 비교
node --expose-gc server.js

# Chrome DevTools 연결
node --inspect server.js
# chrome://inspect 에서 메모리 프로파일

5단계 — OOM Killer 확인

Bash
# OOM으로 프로세스가 종료됐는지 확인
dmesg | grep -i "oom|killed process|out of memory"
sudo journalctl -k | grep -i oom

# OOM 스코어 확인 (높을수록 먼저 kill)
cat /proc/1234/oom_score

# 중요 프로세스 OOM 보호
echo -1000 | sudo tee /proc/1234/oom_score_adj

6단계 — 임시 완화

Bash
# 페이지 캐시 해제
sync; echo 1 | sudo tee /proc/sys/vm/drop_caches

# 슬랩 캐시까지 해제
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches

# 스왑 추가 (임시)
sudo dd if=/dev/zero of=/swapfile bs=1G count=4
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
#메모리누수#valgrind#smaps#oom#트러블슈팅#linux
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서GNU/Linux man 페이지

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.