MVP 부하테스트 보고서 - 100-hours-a-week/2-hertz-wiki GitHub Wiki
📚 목차
📄 MVP 부하테스트 보고서
부하테스트는 MVP 이후 예상되는 트래픽 또는 그 이상의 부하 상황에서도 시스템이 안정적으로 동작하는지를 검증하기 위해 수행됩니다. 테스트를 통해 성능 병목 구간을 식별하고 개선 방안을 도출하며, 이를 기반으로 코드와 시스템을 최적화합니다. 또한 도출된 데이터를 바탕으로 시스템의 최대 처리 용량을 산정하고, 리소스 활용을 효율화하는 것을 목표로 합니다.
1. 부하테스트에 사용된 툴
1.1 SigNoz(APM)
SigNoz는 OpenTelemetry 기반의 오픈소스 APM 도구로, 분산 트레이싱과 메트릭, 로그를 통합하여 시스템의 성능을 실시간으로 모니터링할 수 있습니다. 본 프로젝트에서는 다음과 같은 기술적 이유로 SigNoz를 채택하였습니다:
- 다양한 스택 호환성: OpenTelemetry 기반으로 FastAPI(Python), Spring Boot(Java) 등 이기종 백엔드 프레임워크와의 통합이 용이함
- 로그 기반 요청 흐름 시각화: 트레이스와 로그를 연계하여 개별 요청의 흐름을 시각적으로 분석할 수 있어 장애 분석 및 성능 최적화에 유리함
- 협업 효율성 제고: SigNoz Cloud 플랫폼을 통해 백엔드, 프론트엔드, AI 등 다양한 역할의 개발자들에 대시보드를 공유할 수 있음. 직관적인 대시보드를 통해 API, 로그 등을 웹 사이트에서 확인할 수 있음
- 비용 효율성: 상용 APM 솔루션 대비 무료로 사용할 수 있어 운영 비용 절감이 가능함
초기에는 Scouter 도입도 고려하였으나, JDK 21 미지원과 JAVA 기반의 어플리케이션만 추적할 수 있다는 기술적 제약이 있었고, 본 프로젝트에서 최신 자바 버전을 사용하기 때문에, 최신 자바 버전을 지원하며 확장성과 유지보수성이 뛰어난 SigNoz가 더 적합하다고 판단하였습니다.
1.2 Netdata(시스템 단위 리소스 모니터링 도구)
Netdata는 실시간으로 시스템 리소스 상태를 모니터링할 수 있는 경량화된 오픈로스 모니터링 도구로, CPU, 메모리, 디스크, 네트워크 등의 인프라 자원 사용 현환을 초 단위 이하의 해상도로 시각화하여 보여줍니다. 본 프로젝트에서는 다음과 같은 이유로 Netdata를 채택하였습니다:
- 실시간 상태 모니터링: 초 단위보다 세밀한 해상도로 CPU, 메모리, 네트워크 등의 자원 사용률을 실시간으로 시각화하여, 순간적인 병목 구간도 포착 가능
- 간편한 설치 및 웹 기반 UI 제공: 원클릭 설치 및 웹 브라우저에서 직관적인 대시보드를 제공하여 접근성이 높음. 또한 Netdata Cloud 플랫폼을 통해 여러 노드를 연결하여 모니터링 가능.(공유를 통해 협업도 가능)
- 프로세스 단위 분석: 애플리케이션별 CPU, 메모리 사용량을 분리해 확인 가능하며, 각 컨테이너 및 서비스 단위의 부하 분석에 유리함
- 경량성 및 낮은 오버헤드: 시스템 리소스를 적게 사용하면서도 다양한 메트릭을 수집할 수 있어 운영 환경에서도 부담 없이 사용할 수 있음
- 알림 기능 내장: CPU 과부하, 메모리 사용률 초과, 특정 프로세스의 비정상 종료 등 다양한 시스템 이벤트에 대해 Slack, Discord, 이메일 등으로 실시간 알림 설정 가능
Netdata는 SigNoz에서 제공하지 않는 프로세스 레벨의 시스템 모니터링 기능을 지원합니다. 또한 CPU, 메모리, 디스크 I/O 등 인프라 자원에 대한 실시간 추적을 세밀한 단위(1초 이하)로 수행하며, 이를 시각화된 대시보드를 통해 직관적으로 제공해줍니다. 이러한 특성 덕분에, 시스템 전체 리소스 흐름과 개별 프로세스의 병목 현상을 손쉽게 파악할 수 있어, SigNoz와 보완적인 관계로 Netdata를 추가 도입하였습니다.
1.3 K6 (부하 생성 도구)
K6는 개발자 친화적인 스크립트 기반의 오픈소스 부하 테스트 도구로, HTTP 기반 API에 대한 성능 검증 및 부하 유도를 위해 사용되었습니다. 본 프로젝트에서는 다음과 같은 이유로 K6를 선택하였습니다:
- 가벼운 러닝 커브 및 CLI 기반 실행: 설치와 사용이 간편하며, CI/CD 파이프라인에 쉽게 통합 가능
- 고성능 부하 생성 능력: 수천~수만 건의 요청을 시뮬레이션할 수 있어, API의 안정성과 확장성 검증에 효과적
- 직관적인 결과 출력: CLI 상의 실시간으로 출력되는 직관적인 결과
- 개발자 중심의 사용성: JavaScript 기반으로 테스트 시나리오를 코드로 작성할 수 있어 복잡한 사용자 흐름을 유연하게 표현할 수 있음
- 적은 리소스 사용: Go 언어로 구현된 런타임 위에서 동작하여, 리소스를 적게 사용하고, 가볍고 효율적인 성능을 낸다.
K6는 특히 백엔드(Spring Boot), AI 서버(FastAPI) 등 다양한 구성 요소 간의 응답 시간과 병목 구간을 정량적으로 측정하는 데 효과적이었습니다. 또한 트래픽 증가에 따른 시스템의 임계점과 안정성 한계를 파악하는 데 유용하게 활용되었습니다.
이를 기반으로 SigNoz와 Netdata를 병행하여 사용함으로써, 애플리케이션 내부 상태(Trace 기반)와 시스템 리소스 사용량, 외부 부하 반응을 통합적으로 분석할 수 있는 테스트 환경을 구축할 수 있었습니다.
2. 테스트 시나리오
현재 배포된 서비스의 주요 기능에 따라 다음과 같은 시나리오를 작성하여 테스트를 실시하였습니다.
MVP 단계에서 운영 중인 실제 서비스 흐름에 따라 사용자 행동을 시나리오화하였으며, 각 시나리오에서 트래픽이 집중될 것으로 예상되는 핵심 API를 타겟팅하여, 시스템의 처리 성능 및 병목 발생 여부를 중점적으로 검증하였습니다.
시나리오 1: 회원가입
- 신규 사용자가 카카오 로그인 후 개인정보 입력, 취향 정보를 입력 후 저장
- 사용자의 취향정보를 저장하고 임베딩하는 AI 서버 API 호출
시나리오 2: 매칭 요청
- 사용자가 AI 기반 매칭을 요청
- 사용자에 해당하는 매칭된 목록울 AI 서버에 호출 및 결과 반환
시나리오 3: 채널방 – 메시지 보내기
- 상대와의 채널방에서 메시지 전송
- 메시지를 저장하는 백엔드 API 호출
시나리오 4: 채널방 – 메시지 수신
- 상대방이 보낸 메시지를 실시간으로 수신
- 3초 주기의 Polling: 채널방의 메세지를 가져오는 API 호출
시나리오 5: 채널 목록 조회
- 사용자가 참여 중인 채널 목록을 조회
- 5초 주기의 Polling: 사용자의 모든 채널방에서 새로운 메세지가 있는 확인하는 API 호출
3. 테스트 결과 보고서
시나리오에 따른 부하테스트 결과는 아래에 별도의 문서로 첨부하였습니다.