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

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

좀비 프로세스 발생 원인과 부모 프로세스 찾아 해결하는 방법, OOM Killer 동작 확인·방지·우선순위 조정, 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)

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