111 lines
3.2 KiB
Bash
Executable File
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 "=========================================="
|