좀비 프로세스 (Z state)
좀비는 실행이 끝났지만 부모가 wait()를 호출하지 않아 프로세스 테이블에 남은 상태입니다. 시스템 자원을 거의 사용하지 않지만 PID를 점유합니다.
좀비 프로세스 확인
# 좀비 프로세스 목록
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좀비의 부모 프로세스 찾기
# 좀비 PID 확인 후 부모 찾기
ps -o ppid= -p <좀비_PID>
# 부모 프로세스 이름 확인
ps -p <부모_PID> -o comm=
# 트리 형태로 보기
pstree -p | grep -B5 defunct해결 방법
# 방법 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 확인
메모리 부족 시 커널이 프로세스를 강제 종료합니다.
# 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 — 종료 우선순위
# 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 예방
# 스왑 파일 추가 (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.confcgroup으로 프로세스 메모리 제한
# 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이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.