홈/엔지니어/트러블슈팅/좀비 프로세스 · OOM Killer — 진단과 방…
트러블슈팅중급UbuntuDebianCentOS좀비프로세스oomoom-killer

좀비 프로세스 · OOM Killer — 진단과 방지

좀비 프로세스 발생 원인과 부모 프로세스 찾아 해결하는 방법, OOM Killer 동작 확인·방지·우선순위 조정, cgroup으로 메모리 제한하는 방법을 설명합니다.

목차
  1. 좀비 프로세스 (Z state)
  2. 좀비 프로세스 확인
  3. 좀비의 부모 프로세스 찾기
  4. 해결 방법
  5. OOM Killer 확인
  6. OOM Score — 종료 우선순위
  7. 스왑으로 OOM 예방
  8. cgroup으로 프로세스 메모리 제한

좀비 프로세스 (Z state)

좀비는 실행이 끝났지만 부모가 wait()를 호출하지 않아 프로세스 테이블에 남은 상태입니다. 시스템 자원을 거의 사용하지 않지만 PID를 점유합니다.


좀비 프로세스 확인

Bash
# 좀비 프로세스 목록
ps aux | grep -w Z
# USER PID %CPU %MEM ... STAT ... COMMAND
# www-data 1234 0.0 0.0 ... Z+  ... [nginx] <defunct>

# 수 확인
ps aux | awk '{print $8}' | grep Z | wc -l

# top에서 확인
top
# Tasks: 150 total, 1 running, 148 sleeping, 0 stopped, 1 zombie

좀비의 부모 프로세스 찾기

Bash
# 좀비 PID 확인 후 부모 찾기
ps -o ppid= -p <좀비_PID>

# 부모 프로세스 이름 확인
ps -p <부모_PID> -o comm=

# 트리 형태로 보기
pstree -p | grep -B5 defunct

해결 방법

Bash
# 방법 1: 부모 프로세스를 정상 재시작 (권장)
# 부모가 재시작되면 init(1)이 wait()를 호출해 좀비 정리
sudo systemctl restart nginx    # 예: nginx 워커 좀비

# 방법 2: 부모에 SIGCHLD 신호 전송 (wait() 강제 호출)
kill -SIGCHLD <부모_PID>

# 방법 3: 부모 종료 (자식 좀비는 init이 정리)
kill -TERM <부모_PID>

# 방법 4: 마지막 수단 — 부모 강제 종료
kill -9 <부모_PID>

좀비 자체를 kill -9로 죽일 수는 없습니다. 반드시 부모 프로세스를 통해 해결해야 합니다.


OOM Killer 확인

메모리 부족 시 커널이 프로세스를 강제 종료합니다.

Bash
# OOM Killer 발생 확인
dmesg | grep -E "Out of memory|oom_kill|Killed process"
sudo journalctl -k | grep -i oom

# 어떤 프로세스가 종료됐는지
dmesg | grep "Killed process"
# Killed process 1234 (myapp) total-vm:512000kB, anon-rss:450000kB

# OOM 시점 메모리 덤프
dmesg | grep -A30 "Out of memory"

OOM Score — 종료 우선순위

Bash
# OOM score 확인 (-1000~1000, 높을수록 먼저 종료)
cat /proc/<PID>/oom_score

# oom_score_adj 조정 (-1000~1000)
# -1000 = OOM Killer 완전 제외
# 0 = 기본
# +1000 = 가장 먼저 종료

# 중요 프로세스 보호
echo -1000 | sudo tee /proc/$(pgrep postgres)/oom_score_adj

# 덜 중요한 프로세스 먼저 종료
echo 500 | sudo tee /proc/$(pgrep node)/oom_score_adj

# systemd 서비스 영구 설정
# /etc/systemd/system/myapp.service
# [Service]
# OOMScoreAdjust=-500

스왑으로 OOM 예방

Bash
# 스왑 파일 추가 (1GB)
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 영구 적용
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# swappiness 조정 (0=스왑 최소화, 100=적극 사용)
sudo sysctl vm.swappiness=10
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf

cgroup으로 프로세스 메모리 제한

Bash
# systemd 서비스에 메모리 제한
sudo systemctl edit myapp.service

# 추가:
# [Service]
# MemoryMax=512M
# MemoryHigh=400M   # 이 이상이면 스로틀링

sudo systemctl daemon-reload
sudo systemctl restart myapp

# 현재 메모리 한도 확인
sudo systemctl show myapp --property=MemoryMax

# Docker 컨테이너 메모리 제한
docker run --memory=512m --memory-swap=512m myapp
#좀비프로세스#oom#oom-killer#cgroup#트러블슈팅#linux
편집 안내 · Editorial Note

AI 도구가 초안 작성에 사용될 수 있습니다. 명령어의 실행 여부와 검증 환경은 각 가이드에 기재된 근거를 확인하세요. 적용 전 사용 중인 버전의 공식 문서를 확인하고, 오류는 이메일로 알려주세요. 이메일로 제보

주제 관련 공식 문서(자동 연결 · 문장별 근거 아님)GNU/Linux man 페이지 ↗

질문 & 답변 (Q&A)

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