#!/bin/bash
# 실습 #15 ② — cgroup v2 자원 격리: --cpus · --memory · --pids-limit
# - Docker 의 --cpus / --memory 옵션이 실제 cgroup 파일에 어떻게 떨어지는지 직접 확인
# - 부하는 stress-ng 가 아닌 yes(1) × N 으로 (VM 가상 CPU 의 AVX SIGILL 회피)
# - cgroup v2 경로: /sys/fs/cgroup/system.slice/docker-<full-id>.scope/
set -e

# 1) cgroup 버전 확인 (v2 가 기본 — Ubuntu 22.04+)
echo "=== cgroup 버전 ==="
stat -fc %T /sys/fs/cgroup/
echo "(cgroup2fs = v2, tmpfs = v1 혼용)"

# 2) 제한 컨테이너 — CPU 0.5코어 · Mem 256MB · PID 100개
sudo docker rm -f lab-limited 2>/dev/null || true
sudo docker run -d --name lab-limited \
    --cpus="0.5" \
    --memory="256m" \
    --memory-swap="256m" \
    --pids-limit=100 \
    alpine sh -c 'yes > /dev/null & yes > /dev/null & sleep 600'

sleep 2

# 3) cgroup 직접 확인
CID=$(sudo docker inspect -f '{{.Id}}' lab-limited)
CG="/sys/fs/cgroup/system.slice/docker-${CID}.scope"

if [ ! -d "$CG" ]; then
    # cgroup v1 또는 다른 슬라이스
    CG=$(sudo find /sys/fs/cgroup -name "docker-${CID}.scope" -type d 2>/dev/null | head -1)
fi

echo
echo "=== cgroup 경로 ==="
echo "$CG"

echo
echo "=== CPU 한도 (cpu.max: <quota> <period>) ==="
sudo cat "$CG/cpu.max" 2>/dev/null || echo "(파일 없음 — cgroup v1 가능)"
echo "→ 50000 100000 = 100ms 주기에 50ms = 0.5 CPU"

echo
echo "=== Mem 한도 (memory.max, byte) ==="
sudo cat "$CG/memory.max" 2>/dev/null || echo "(파일 없음)"
echo "→ 268435456 = 256 MiB"

echo
echo "=== PID 한도 ==="
sudo cat "$CG/pids.max" 2>/dev/null || echo "(파일 없음)"

# 4) docker stats — 실제 사용량이 한도에 빠르게 도달
echo
echo "=== docker stats (스냅샷) ==="
sudo docker stats --no-stream lab-limited

# 5) 부하 컨테이너는 cAdvisor 그래프에서 ceiling 도달 확인
echo
echo "→ cAdvisor 에서 그래프 확인: http://<VM-IP>:8080/docker/lab-limited"
echo "→ CPU 차트에 0.5 core 천장 / Mem 차트에 256 MiB 천장 그어진 거 보임"

echo
echo "=== 정리 ==="
echo "  sudo docker rm -f lab-limited"
