#!/bin/bash
# 실습 #4 ② — 파동 부하 발생 + 4-pane 동시 관찰
# CPU/메모리/디스크 파동을 일으켜 모니터링 도구의 반응 학습.
# 표준 도구만 사용 (yes, python3, dd) — VM 어디서나 동작.
#
# 사용법
#   터미널 A: bash setup_02_stress_load.sh         # 부하 스크립트 4종 생성
#             /tmp/lab04_stress/cpu_wave.sh        # 골라서 실행
#   터미널 B: tmux attach -t monitor               # 또는 htop / vmstat 1
set -e

WORK=/tmp/lab04_stress
mkdir -p "$WORK"

# ────────────────────────────────────────────────────────────────
# 1) CPU 파동 — (부하 N초 → 휴식 N초) × 4 패턴 반복
#    htop CPU 그래프가 파도처럼 위/아래 움직임
# ────────────────────────────────────────────────────────────────
cat > "$WORK/cpu_wave.sh" <<'EOF'
#!/bin/bash
set -e
CORES=$(nproc)
PATTERN=(5 5 10 10 20 20 30 30)        # 부하초 휴식초 × 4
cleanup() { pkill -f "yes > /dev/null" 2>/dev/null || true; exit 0; }
trap cleanup INT TERM EXIT

while true; do
    for i in 0 2 4 6; do
        load_dur=${PATTERN[i]}
        rest_dur=${PATTERN[i+1]}
        echo "🔥 부하 ${load_dur}초 (${CORES} cores)"
        for c in $(seq 1 $CORES); do ( yes > /dev/null ) & done
        sleep "$load_dur"
        pkill -f "yes > /dev/null" 2>/dev/null || true
        echo "💤 휴식 ${rest_dur}초"
        sleep "$rest_dur"
    done
done
EOF
chmod +x "$WORK/cpu_wave.sh"

# ────────────────────────────────────────────────────────────────
# 2) 메모리 파동 — 1GB 점유 5초 → 해제 5초 반복
#    free -h 의 available 컬럼이 1GB 단위로 출렁임
# ────────────────────────────────────────────────────────────────
cat > "$WORK/mem_wave.sh" <<'EOF'
#!/bin/bash
set -e
while true; do
    echo "🔥 1GB 메모리 5초 점유"
    python3 -c "
import time
buf = bytearray(1024 * 1024 * 1024)
time.sleep(5)
"
    echo "💤 휴식 5초"
    sleep 5
done
EOF
chmod +x "$WORK/mem_wave.sh"

# ────────────────────────────────────────────────────────────────
# 3) 디스크 I/O 폭풍 — 500MB × 2 (쓰기/읽기)
#    iostat -xz 1 의 %util 100% 도달
#    vmstat 의 wa (I/O wait) 컬럼 치솟음
# ────────────────────────────────────────────────────────────────
cat > "$WORK/io_burst.sh" <<'EOF'
#!/bin/bash
set -e
FILE=/tmp/lab04_stress/io_test.bin
echo "🔥 쓰기 — 500MB (fsync 강제)"
dd if=/dev/zero of="$FILE" bs=1M count=500 conv=fsync status=progress
echo
echo "🔥 읽기 — 500MB"
dd if="$FILE" of=/dev/null bs=1M
rm -f "$FILE"
EOF
chmod +x "$WORK/io_burst.sh"

# ────────────────────────────────────────────────────────────────
# 4) 4축 종합 (CPU + Mem + I/O) 30초
#    htop / vmstat / iostat / free 모두 동시 반응
# ────────────────────────────────────────────────────────────────
cat > "$WORK/all_in_one.sh" <<'EOF'
#!/bin/bash
set -e
WORK=/tmp/lab04_stress
PIDS=()
cleanup() { for p in "${PIDS[@]}"; do kill "$p" 2>/dev/null || true; done; pkill -f "yes > /dev/null" 2>/dev/null || true; exit 0; }
trap cleanup INT TERM EXIT

echo "🔥 30초 종합 부하 시작"
# CPU
for c in $(seq 1 $(nproc)); do ( yes > /dev/null ) & PIDS+=($!); done
# MEM
( python3 -c "
import time
buf = bytearray(512 * 1024 * 1024)
time.sleep(30)
" ) & PIDS+=($!)
# IO
( dd if=/dev/zero of="$WORK/io_test.bin" bs=1M count=500 conv=fsync 2>/dev/null && \
  dd if="$WORK/io_test.bin" of=/dev/null bs=1M 2>/dev/null && \
  rm -f "$WORK/io_test.bin" ) & PIDS+=($!)

sleep 30
echo "✓ 30초 완료"
EOF
chmod +x "$WORK/all_in_one.sh"

echo
echo "=== 부하 스크립트 4종 준비 완료 ($WORK) ==="
ls -lh "$WORK"/*.sh

cat <<MSG

다음 중 골라 실행:
  $WORK/cpu_wave.sh     — CPU 파동 (Ctrl-C 로 중단)
  $WORK/mem_wave.sh     — 메모리 파동 (Ctrl-C)
  $WORK/io_burst.sh     — I/O 폭풍 1회 (500MB write+read)
  $WORK/all_in_one.sh   — 4축 종합 30초

옆 터미널에서 동시 관찰:
  htop                  — CPU% 컬럼이 100→0→100 반복
  vmstat 1              — us / wa 컬럼 시계열
  iostat -xz 1          — %util / await 시계열
  pidstat -u 1          — PID 별 CPU
  watch -n 0.5 free -h  — 0.5 초 갱신 메모리

→ 정리: rm -rf $WORK
MSG
