k6 부하테스트 Nginx 구성 - 100-hours-a-week/KTB4-7th-Cloud GitHub Wiki
구성
SLI-1 매출 분석 조회 요청을 Nginx로 보내고, k6 결과와 Nginx 로그, Backend CPU, 메모리, GC를 함께 저장했다. 타임아웃이 발생한 뒤에는 Backend 직접 호출과 비교하고 연결 구간을 추가로 측정했다.
k6 → Nginx(127.0.0.1:8088)
→ 로컬 Backend(host.docker.internal:8080)
Nginx는 Docker로 실행하고 8088 포트는 로컬에만 공개했다.
| 파일 | 역할 |
|---|---|
| tests/k6/nginx/compose.yaml | Nginx 컨테이너와 8088 포트 설정 |
| tests/k6/nginx/nginx.conf | Backend 프록시와 JSON 접근 로그 설정 |
| tests/k6/sales-analysis.js | Q1, Q2 조회와 응답 검증 |
| local-k6-monitor/LocalMonitor.java | Backend JVM 자원과 스레드 상태 수집 |
| local-k6-monitor/run.sh | k6 실행, 결과 저장 |
테스트 실행
1. Nginx 실행
cd "/Users/jake/Documents/ChatGPT/Final Project/repos/KTB4-7th-Cloud"
docker compose -f tests/k6/nginx/compose.yaml up -d
2. Smoke와 Load
Smoke는 1 RPS로 2분, Load는 5 RPS로 10분이다. 각 실행이 끝나면 결과를 확인한다.
PROFILE=smoke bash "/Users/jake/Documents/ChatGPT/Final Project/local-k6-monitor/run.sh"
PROFILE=load bash "/Users/jake/Documents/ChatGPT/Final Project/local-k6-monitor/run.sh"
준비 스크립트는 계정 생성, 로그인, 매출 업로드를 Backend 8080으로 요청한다. 실제 k6 조회 부하만 Nginx 8088을 통과한다. Q1은 이번 달 조회, Q2는 지정 기간 조회이며 HTTP 200, COMPLETED, 요청 기간 일치로 정상 완료를 판정한다.
기본 진행 조건은 Smoke 통과 후 Load 실행이다. 보고서의 초기 Smoke는 Q2 1건이 실패했고, 이후 Load는 원인 분석용 측정으로 기록했다.
3. 결과 폴더
실행 시 출력된 경로를 사용한다. XXXXXX는 실제 출력값으로 바꾼다.
open /tmp/k6-local-monitor-XXXXXX
k6 run만 실행하면 수집기는 시작되지 않는다. 실행이 끝나면 수집은 종료되고 Backend와 Nginx는 계속 실행된다. 중단한 결과는 부분 측정값이며, 보관할 파일은 /tmp 밖으로 복사한다.
저장 자료
| 파일 | 확인할 내용 |
|---|---|
| k6-summary.json | Q1, Q2 완료율, 500ms와 1초 이내 완료율, p95, p99 |
| k6-timeseries.json | 요청 시각, 응답시간, HTTP 상태, 오류 코드, Q1/Q2 태그 |
| metrics.csv | Backend CPU, Heap, 비힙, GC |
| process-memory.csv | Backend 프로세스 RSS(KiB) |
| nginx.log | 요청 시각, 응답 상태, 프록시 처리시간 |
| threads.txt | JVM 스레드 상태와 호출 스택 |
| monitor-summary.json | Backend 자원 최댓값과 누적 지표 증가량 |
초기 Smoke 자료는 k6-local-monitor-xUqIpX, Load 자료는 k6-local-monitor-W9m8Rd에 저장했다. 수집에는 준비 단계도 포함되므로 보고서에서는 실제 k6 요청 구간만 집계했다.
Nginx 로그
| 필드 | 의미 |
|---|---|
| status, upstream_status | Nginx와 Backend의 응답 상태 |
| request_time | Nginx가 요청을 읽기 시작해 로그를 기록할 때까지의 시간 |
| upstream_response_time | Backend에서 응답을 받는 데 걸린 시간 |
| request_id | Nginx가 생성해 X-Request-ID로 Backend에 전달하는 식별자 |
| load_test | X-Load-Test 헤더 값. k6 요청은 k6로 기록 |
처리시간 단위는 초다. API 경로와 load_test=k6로 로그를 추린다. 초기 로그의 uri에는 쿼리 문자열이 없어 Q1, Q2는 k6 태그로 구분한다.
실시간 로그는 Cloud 저장소 루트에서 확인한다.
docker compose -f tests/k6/nginx/compose.yaml logs -f --tail=0 k6-nginx