Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions .docs/performance/performance-base.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
# 성능 테스트 환경 및 개선 전 측정값

## 1. 테스트 환경

### 1.1 하드웨어

| 항목 | 사양 |
|------|------|
| Machine | MacBook M1 |
| Memory | 16GB |
| Storage | 256GB SSD |

### 1.2 소프트웨어

| 구성 요소 | 버전 | 비고 |
|-----------|------|------|
| Spring Boot | 3.4.4 | commerce-api (로컬 실행) |
| MySQL | 8.0 | Docker 컨테이너 |
| Redis | 7.0 | Docker 컨테이너 |
| Kafka | 3.5.1 | Docker 컨테이너 |
| k6 | - | 부하 테스트 도구 |

---

## 2. 데이터 규모

| 테이블 | 건수 | 비고 |
|--------|------|------|
| brand | 23,250 | 5계층 롱테일 분포 |
| product | 500,000 | 브랜드 규모별 차등 분배 |
| likes | ~972,000 | 4계층 롱테일 분포 |

### 브랜드 분포

실제 서비스의 롱테일 분포를 재현하기 위해 5계층으로 설계했다.

| 계층 | 브랜드 수 | 브랜드당 상품 | 소계 |
|------|----------|-------------|------|
| 대형 (1~50) | 50 | 500 | 25,000 |
| 중형 (51~250) | 200 | 200 | 40,000 |
| 소형 (251~1,250) | 1,000 | 80 | 80,000 |
| 영세 (1,251~6,250) | 5,000 | 20 | 100,000 |
| 신규 (6,251~23,250) | 17,000 | 15 | 255,000 |

### 좋아요 분포

실제 서비스의 인기 상품 쏠림을 재현하기 위해 4계층 롱테일 분포를 적용했다. Top 50개 상품이 전체 좋아요의 ~90%를 독점한다.

| 계층 | 상품 ID | 상품 수 | 좋아요/상품 | 소계 | 비중 |
|------|---------|---------|------------|------|------|
| Top | 1~50 | 50 | 15,100~20,000 | ~877K | 90% |
| High | 51~150 | 100 | 304~700 | ~50K | 5% |
| Mid | 151~650 | 500 | 40~60 | ~25K | 3% |
| Tail | 651~5,650 | 5,000 | 4 | ~20K | 2% |
| 없음 | 5,651~500,000 | 494,350 | 0 | 0 | 0% |

---

## 3. 부하 프로파일

```
Stage 1: Warm-up 0 → 50 VU (30s)
Stage 2: Ramp-up 50 → 100 VU (1m)
Stage 3: Stress 100 → 200 VU (30s)
Stage 4: Ramp-down 200 → 0 VU (1m)
```

- 총 약 3분, 8개 시나리오 (목록 조회 6 + 상세 조회 2), weight 기반 VU 분배

---

## 4. 개선 전 측정값 (인덱스 없음, 200 VU)

### 4.1 단일 쿼리 실행 시간

| 쿼리 | 소요 시간 |
|------|----------|
| 좋아요순 page 0 | 17,315ms |
| 좋아요순 page 49 | 23,004ms |
| 최신순 page 0 | 3,307ms |
| 최신순 page 49 | 3,374ms |
| 가격순 page 0 | 2,474ms |
| 가격순 page 49 | 2,410ms |
| 브랜드+좋아요순 page 0 | 4,600ms |
| 브랜드+좋아요순 deep | 2,726ms |
| 브랜드+최신순 page 0 | 2,786ms |
| 브랜드+최신순 deep | 2,108ms |
| 브랜드+가격순 page 0 | 1,304ms |
| 브랜드+가격순 deep | 1,603ms |
| 상세 조회 (id=1) | 0.0002ms |
| 상세 조회 (id=3000) | 0.0002ms |

- 목록 조회: PK 외 인덱스 없음 → 50만 건 풀스캔 + filesort
- 상세 조회: PK 조회로 1ms 미만

### 4.2 부하 테스트 지표 — 상품 목록 조회

| 지표 | 값 |
|------|-----|
| RPS | 17.49/s |
| 에러율 | 90.5% |
| avg latency | 5s |
| med latency | 3s |
| p90 latency | 6s |
| p95 latency | 23s |
| p99 latency | 32s |
| max latency | 47s |

### 4.3 부하 테스트 지표 — 상품 상세 조회 (PK 조회)

| 지표 | 값 |
|------|-----|
| RPS | 16.39/s |
| 에러율 | 67.7% |
| avg latency | 5s |
| med latency | 3s |
| p90 latency | 10s |
| p95 latency | 11s |
| p99 latency | 12s |
| max latency | 14s |
Loading