#!/bin/bash
# 실습 #14 ② — pgbench Before/After 튜닝
# - 기본값 그대로 1회 → postgresql.conf 핵심 3종 튜닝 → 다시 측정
# - 핵심 3종: shared_buffers (메모리 25%) · effective_cache_size · work_mem
# - vmstat 1 옆 창에서 wa (I/O 대기) 줄어드는 거 같이 보기
set -e

DIR="$(cd "$(dirname "$0")" && pwd)"
TUNED_CONF="$DIR/configs/02_postgresql_tuned.conf"

# 1) 데이터 적재 (scale=20 → 약 300MB. VM 작으면 10으로 줄여도 OK)
SCALE="${SCALE:-20}"
echo "=== pgbench 초기화 (scale=$SCALE) ==="
sudo -u postgres pgbench -i -s "$SCALE" bench >/dev/null
sudo -u postgres psql -d bench -c "SELECT count(*) AS accounts FROM pgbench_accounts;"

# 2) Before — 기본 설정으로 60초 부하
echo
echo "=== Before (기본 설정) ==="
sudo -u postgres pgbench -c 16 -j 4 -T 60 bench 2>&1 | tail -20 | tee /tmp/pgbench_before.log

# 3) 튜닝 적용 — drop-in 으로 (본체 안 건드림)
TUNED_DROPIN=/etc/postgresql/16/main/conf.d/99-lab-tuning.conf
sudo mkdir -p /etc/postgresql/16/main/conf.d
# include_dir 'conf.d' 가 활성화되어 있어야 함. 16 기본값 활성.
sudo cp "$TUNED_CONF" "$TUNED_DROPIN"
sudo chown postgres:postgres "$TUNED_DROPIN"
sudo systemctl restart postgresql
sleep 2

# 4) After — 같은 부하 다시
echo
echo "=== After (튜닝) ==="
sudo -u postgres pgbench -c 16 -j 4 -T 60 bench 2>&1 | tail -20 | tee /tmp/pgbench_after.log

# 5) TPS 차이 한 줄 요약
BEFORE_TPS=$(grep -E "^tps" /tmp/pgbench_before.log | head -1 | awk '{print $3}')
AFTER_TPS=$(grep -E "^tps" /tmp/pgbench_after.log | head -1 | awk '{print $3}')
echo
echo "=== 결과 비교 ==="
echo "Before:  $BEFORE_TPS tps"
echo "After :  $AFTER_TPS  tps"

cat <<'EOF'

관전 포인트:
  - shared_buffers 25% : 가장 큰 효과 (페이지 캐시 hit ↑)
  - work_mem          : join/sort 메모리. 너무 크면 OOM (사용자×쿼리수 곱)
  - random_page_cost  : SSD 면 1.1, HDD 면 기본 4.0
  - checkpoint_completion_target 0.9 : 체크포인트 IO 분산 → TPS 출렁 완화
EOF
