#!/bin/bash
# 실습 #4 ① — 5축 시스템 모니터링 한 번에 (CPU·메모리·디스크·네트워크·프로세스)
# tmux 4-pane 으로 htop·vmstat·iostat·free 동시 관찰
#
# 사용법
#   bash setup_01_5axis_monitoring.sh
#   → tmux 세션 "monitor" 가 만들어지고 4 pane 자동 분할됨
#   → 종료: Ctrl-b → x (각 pane), 또는 tmux kill-session -t monitor
set -e

echo "=== 0) 필수 도구 설치 ==="
# htop      : 컬러·트리·필터 인터랙티브 (top 의 강화판)
# sysstat   : iostat / vmstat / pidstat / sar 시계열 도구 모음
# tmux      : 한 화면 4 pane 분할
# iotop     : PID 별 디스크 I/O (실시간)
# iftop     : 인터페이스 별 트래픽 (실시간)
# nethogs   : PID 별 네트워크 (어떤 프로세스가 통신?)
# ncdu      : 인터랙티브 디스크 사용량 분석
# lsof      : 열린 파일·소켓 전부
sudo apt update
sudo apt install -y htop sysstat tmux iotop iftop nethogs ncdu lsof

echo
echo "=== 1) 시스템 4종 세트 — 부하·코어·메모리·디스크 한 줄 요약 ==="
# uptime 의 load average 3 컬럼:
#   첫 번째  → 직전 1 분 평균 부하 (RUNNABLE + UNINTERRUPTIBLE 평균 프로세스 수)
#   두 번째  → 직전 5 분 평균
#   세 번째  → 직전 15 분 평균
#
# 추세 읽기 (이 3 숫자 비교가 핵심):
#   1m > 5m > 15m  → 부하 ↑↑ 증가 추세 (지금 막 사고가 터지는 중)
#   1m < 5m < 15m  → 부하 ↓↓ 회복 추세 (피크 지나감)
#   1m ≈ 5m ≈ 15m  → 안정 상태 (정상 운영)
#
# 절대값 해석은 nproc 와 비교:
#   load < nproc       → 여유
#   load = nproc       → 100% busy (대기 없음, 한계 도달)
#   load > nproc × 1   → 대기열 쌓이는 중
#   load > nproc × 2~3 → 명백한 과부하 (응답 지연)
uptime
nproc          # CPU 코어 수 — load avg 가 이 값보다 크면 대기열 쌓임
free -h        # 메모리 — available 컬럼만 보면 됨 (page cache 빼고 진짜 가용)
df -hT         # 디스크 — -T 로 파일시스템 타입까지

echo
echo "=== 2) load avg 해석 룰 ==="
echo "    [3 컬럼 시간창]"
echo "      1번째 = 1분 평균, 2번째 = 5분 평균, 3번째 = 15분 평균"
echo "    [추세]"
echo "      1m > 5m > 15m → 증가 중 (위험 신호)"
echo "      1m < 5m < 15m → 회복 중"
echo "    [절대값 — vs nproc]"
echo "      < nproc       → 여유"
echo "      = nproc       → 100% busy"
echo "      > nproc       → 대기열 쌓임 (느려질 가능성)"

echo
echo "=== 3) 메모리 깊이 보기 ==="
cat /proc/meminfo | head -10

# dmidecode --type 17 = SMBIOS "Memory Device" — DIMM 슬롯 물리 정보
# 베어메탈에서만 의미 있음:
#   Size           : 모듈 크기 (예: 32 GB)
#   Type           : DDR4 / DDR5
#   Speed          : 3200 MT/s 등 동작 속도
#   Form Factor    : DIMM / SODIMM
#   Locator        : DIMM_A1, DIMM_B2 등 슬롯 위치
#   Manufacturer / Part Number : 제조사·모델
#
# 가상머신/클라우드 (VirtualBox, KVM, VMware, AWS, GCP) 에서는 hypervisor 가
# Type 17 정보를 거의 안 노출 — 출력이 비거나 가짜 슬롯만 보일 수 있음.
# 그 경우는 정상 (BMS 점검은 호스트(베어메탈)에서만 의미)
DMI=$(sudo dmidecode --type 17 2>/dev/null | grep -E "Size|Speed|Manufacturer|Part Number" | grep -v "Unknown\|Not Specified" | head -10)
if [ -n "$DMI" ]; then
    echo "$DMI"
else
    echo "→ DIMM 물리 정보 없음 (가상머신/클라우드 환경)"
    echo "  대체 명령:"
    echo "    sudo lshw -short -class memory       # OS 가 본 메모리 (총량/뱅크)"
    echo "    dmesg | grep -iE 'memory|dimm'       # 부팅 시 커널이 본 메모리"
    echo "    cat /sys/class/dmi/id/sys_vendor      # 가상화 벤더 (innotek/QEMU/VMware)"
fi

echo
echo "=== 4) 디스크 사용 Top 10 ==="
sudo du -shx /* 2>/dev/null | sort -hr | head -10

echo
echo "=== 5) tmux 4-pane 모니터 자동 구성 ==="
# 이미 monitor 세션이 있으면 그대로 attach 안 하고 안내만
if tmux has-session -t monitor 2>/dev/null; then
    echo "→ 이미 'monitor' 세션이 있음. 'tmux attach -t monitor' 로 접속"
    exit 0
fi

# 새 세션 detached 로 만들고 4 pane 분할
tmux new-session -d -s monitor -n main
# 가로 1회 (위/아래) + 양쪽 세로 1회씩 = 4 pane
tmux split-window -v -t monitor:0
tmux split-window -h -t monitor:0.0
tmux split-window -h -t monitor:0.2

# 각 pane 에 도구 띄우기
tmux send-keys -t monitor:0.0 'htop' C-m                    # 좌상: CPU·메모리 인터랙티브
tmux send-keys -t monitor:0.1 'vmstat 1' C-m                # 우상: CPU·메모리·I/O 시계열
tmux send-keys -t monitor:0.2 'iostat -xz 1' C-m            # 좌하: 디스크 디바이스 별 r/s w/s await %util
tmux send-keys -t monitor:0.3 'watch -n 1 free -h' C-m      # 우하: 메모리 1초 갱신

echo
echo "→ 4-pane monitor 세션 준비 완료"
echo "   접속: tmux attach -t monitor"
echo "   pane 이동: Ctrl-b → 화살표"
echo "   종료    : tmux kill-session -t monitor"
