부하 테스팅 심화는 k6와 Locust를 활용하여 실제 사용자 트래픽 패턴을 정밀하게 시뮬레이션하고, 시스템의 성능 특성과 한계를 측정하는 고급 기법을 다룬다.
부하 테스팅 유형
| 유형 | 목적 | 패턴 |
|---|
| Load Test | 예상 부하 성능 | 일정 VU 유지 |
| Stress Test | 한계점 탐색 | 점진적 증가 |
| Spike Test | 갑작스런 급증 대응 | 순간 폭증 |
| Soak Test | 장기 안정성 | 낮은 부하 장시간 |
| Breakpoint | 최대 처리량 | 증가 후 관찰 |
javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate, Trend } from 'k6/metrics';
const errorRate = new Rate('errors');
const loginDuration = new Trend('login_duration');
export const options = {
stages: [
{ duration: '2m', target: 100 }, // 램프업
{ duration: '5m', target: 100 }, // 유지
{ duration: '2m', target: 200 }, // 스파이크
{ duration: '5m', target: 200 },
{ duration: '2m', target: 0 }, // 램프다운
],
thresholds: {
http_req_duration: ['p(95)<500', 'p(99)<1000'],
errors: ['rate<0.01'], // 에러율 1% 미만
},
};
export default function () {
const start = Date.now();
const res = http.post('https://api.example.com/login', {
username: 'user',
password: 'pass',
});
loginDuration.add(Date.now() - start);
check(res, {
'status 200': (r) => r.status === 200,
'has token': (r) => r.json('token') !== undefined,
}) || errorRate.add(1);
sleep(1);
}
python
from locust import HttpUser, task, between, events
from locust.runners import MasterRunner
class WebsiteUser(HttpUser):
wait_time = between(1, 3)
def on_start(self):
# 로그인 (세션 유지)
self.client.post('/login', json={
'username': 'user', 'password': 'pass'
})
@task(3) # 가중치 3
def view_articles(self):
self.client.get('/articles')
@task(1) # 가중치 1
def create_article(self):
with self.client.post('/articles',
json={'title': 'Test', 'body': 'Content'},
catch_response=True
) as resp:
if resp.status_code != 201:
resp.failure(f'Expected 201, got {resp.status_code}')
# 실행: locust -f locustfile.py --host https://api.example.com
# Web UI: http://localhost:8089
# Headless: locust --headless -u 1000 -r 50 --run-time 10m
k6 vs Locust 비교
| 항목 | k6 | Locust |
|---|
| 언어 | JavaScript | Python |
| 아키텍처 | Go 코어, 경량 | Python, 멀티프로세스 |
| 분산 실행 | k6 Cloud / k6 operator | Master-Worker |
| 메모리 효율 | 높음 | 보통 |
| Grafana 연동 | 기본 지원 | 플러그인 필요 |
| 프로토콜 | HTTP, gRPC, WebSocket | HTTP (확장 가능) |
| 학습 곡선 | 낮음 | 낮음 (Python 친숙) |
결과 분석 지표
핵심 지표:
- Throughput (RPS): 초당 요청 수
- Latency: p50/p90/p95/p99 응답 시간
- Error Rate: 4xx/5xx 비율
- Concurrency: 동시 접속자 수
병목 판단:
- CPU 100% + 레이턴시 증가 → CPU 바운드
- DB 쿼리 시간 증가 → DB 병목
- 커넥션 풀 고갈 → 커넥션 설정 문제
- 메모리 증가 → 메모리 누수
관련 문서
- •[[chaos-testing|카오스 테스팅]]
- •[[api-testing|API 테스팅]]
- •[[performance-optimization|성능 최적화]]