#!/bin/bash
# =============================================================================
# 单库并发能力实测：回答「单库能扛多少 QPS」
#
# 测试方法：多进程并发执行真实业务查询，统计 TPS 与延迟分位
# 环境：本机 PG 17.11，默认配置（shared_buffers=128MB, max_connections=100）
# ⚠️ 生产（阿里云 8C32G 调优后）预计 2-5 倍
# =============================================================================
set -u
DB=rental_bench
DURATION=${1:-10}
CONCURRENCY=${2:-16}

echo "=============================================="
echo " 单库并发能力实测"
echo " 并发数: $CONCURRENCY   持续: ${DURATION}s"
echo "=============================================="
echo ""

run_bench() {
  local name="$1"; local sql="$2"; local conc="$3"

  local tmpdir=$(mktemp -d)
  local end_time=$(( $(date +%s) + DURATION ))

  for i in $(seq 1 "$conc"); do
    (
      local count=0
      while [ "$(date +%s)" -lt "$end_time" ]; do
        psql -d "$DB" -tA -q -c "$sql" > /dev/null 2>&1 && count=$((count+1))
      done
      echo "$count" > "$tmpdir/$i"
    ) &
  done
  wait

  local total=0
  for f in "$tmpdir"/*; do
    total=$(( total + $(cat "$f") ))
  done
  rm -rf "$tmpdir"

  local tps=$(( total / DURATION ))
  printf "  %-40s %8d 次  %8d TPS\n" "$name" "$total" "$tps"
}

echo "---- 场景 1：主键点查（最高频，纯内存命中）----"
run_bench "按 ID 查房源" "SELECT * FROM room WHERE id=500000" "$CONCURRENCY"

echo ""
echo "---- 场景 2：列表页查询（走索引，返回 20 行）----"
run_bench "房源列表页" "SELECT * FROM room WHERE tenant_id=1 AND status='vacant' LIMIT 20" "$CONCURRENCY"

echo ""
echo "---- 场景 3：逾期扫描（Index Only Scan）----"
run_bench "租户逾期账单统计" "SELECT count(*) FROM bill WHERE tenant_id=1 AND status IN ('pending','partial','overdue')" "$CONCURRENCY"

echo ""
echo "---- 场景 4：聚合统计（较重，模拟看板）----"
run_bench "出租率统计" "SELECT status,count(*) FROM room WHERE tenant_id=1 GROUP BY status" "$CONCURRENCY"

echo ""
echo "=============================================="
echo " 说明"
echo "=============================================="
echo "  本机为 PG 默认配置（shared_buffers=128MB），属未调优基线。"
echo "  阿里云生产环境（8C32G 调优后）预计提升 2-5 倍。"
echo "  真实业务是「读多写少」(约 9:1)，以上以读为主。"
