gpu-zombie-test/scripts/observe.sh

111 lines
3.2 KiB
Bash
Executable File

#!/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 "=========================================="