#!/bin/bash # 컨테이너 내부 관찰 스크립트 — 좀비/고아/GPU 상태 종합 점검 echo "==========================================" echo "컨테이너 내부 관찰: $(date)" echo "==========================================" echo "" echo "[1] PID 1 확인" cat /proc/1/cmdline | tr '\0' ' ' echo "" echo "" echo "[2] 전체 프로세스 트리" ps auxf echo "" echo "" echo "[3] 좀비 프로세스 (STAT=Z)" ZOMBIES=$(ps aux | awk '$8 ~ /Z/') if [ -z "$ZOMBIES" ]; then echo " → 좀비 없음 ✅" else echo " → 좀비 발견 ❌" echo "$ZOMBIES" fi echo "" echo "" echo "[4] 고아 프로세스 (PPID=1, PID 1 자체 제외)" ORPHANS=$(ps -eo pid,ppid,stat,cmd | awk '$2==1 && $1!=1') if [ -z "$ORPHANS" ]; then echo " → 고아 없음 ✅" else echo " → 고아 발견 ⚠️" echo "$ORPHANS" fi echo "" echo "" echo "[5] GPU 메모리 상태" nvidia-smi --query-gpu=index,memory.used,memory.total --format=csv echo "" echo "" echo "[6] GPU 사용 프로세스 (nvidia-smi)" GPU_PIDS=$(nvidia-smi --query-compute-apps=pid,used_gpu_memory,name --format=csv,noheader 2>/dev/null) if [ -z "$GPU_PIDS" ]; then echo " → nvidia-smi에 프로세스 없음" else echo "$GPU_PIDS" fi echo "" echo "" echo "[7] /dev/nvidia* fd 보유 프로세스 (nvidia-smi에 안 나올 수 있음)" for dev in /dev/nvidia[0-9]* /dev/nvidia-uvm /dev/nvidiactl; do [ -e "$dev" ] || continue PIDS=$(fuser "$dev" 2>/dev/null) if [ -n "$PIDS" ]; then echo " $dev →$PIDS" fi done echo "" echo "" echo "[8] Orphaned GPU Context 종합 체크" # 8-a. nvidia-smi에 있는 PID 중 죽은 것 echo " 8-a. nvidia-smi 등록 프로세스 생존 확인:" NSMI_PIDS=$(nvidia-smi --query-compute-apps=pid --format=csv,noheader,nounits 2>/dev/null) if [ -z "$NSMI_PIDS" ]; then echo " nvidia-smi에 등록된 프로세스 없음" else for pid in $NSMI_PIDS; do if [ -d "/proc/$pid" ]; then STATE=$(cat /proc/$pid/status 2>/dev/null | grep "^State:" | awk '{print $2}') echo " PID $pid: 살아있음 (State=$STATE)" else echo " PID $pid: 죽었음 → ❌ ORPHANED GPU CONTEXT" fi done fi # 8-b. nvidia-smi에 안 나오지만 fuser에 잡히는 프로세스 echo " 8-b. nvidia-smi 미등록 but GPU fd 보유:" for dev in /dev/nvidia[0-9]* /dev/nvidia-uvm /dev/nvidiactl; do [ -e "$dev" ] || continue for pid in $(fuser "$dev" 2>/dev/null); do if ! echo "$NSMI_PIDS" | grep -q "^${pid}$"; then if [ -d "/proc/$pid" ]; then CMD=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ' | head -c 50) echo " ⚠️ PID $pid ($dev): $CMD" fi fi done done # 8-c. Ghost context (프로세스 0인데 메모리 점유) echo " 8-c. Ghost context 체크:" PROC_COUNT=$(echo "$NSMI_PIDS" | grep -v '^$' | wc -l) nvidia-smi --query-gpu=index,memory.used --format=csv,noheader,nounits 2>/dev/null | while IFS=', ' read -r idx mem; do if [ "$PROC_COUNT" -eq 0 ] && [ "$mem" -gt 100 ]; then echo " ⚠️ GPU $idx: 프로세스 없는데 ${mem}MiB 점유 → GHOST CONTEXT" else echo " GPU $idx: ${mem}MiB (프로세스 ${PROC_COUNT}개)" fi done echo "" echo "=========================================="