공부해봅시당
[성능 테스트] nGrinder + Springboot 부하 테스트 - 계획 본문
아래 링크를 참고하여 작성된 글입니다
https://leezzangmin.tistory.com/42
nGrinder + Springboot 부하 테스트 튜토리얼
개인 프로젝트를 진행하면서 스프링 어플리케이션의 성능을 측정해보고자, 네이버에서 만든 (오픈소스 + 무료 + 한글 + Java스러운 Groovy 스크립트 지원 + 자료가 그나마 많은) 부하테스트 툴 nGrinde
leezzangmin.tistory.com
부하 테스트(stress test) 란 서버가 얼마만큼의 요청을 견딜 수 있는지 테스트하는 방법
작성한 API 에 병목 현상과 얼마 만큼의 트래픽을 수용할 수 있는지에 대한 여부를 확인하고자 스트레스 테스트를 작성
가장 중요한 것은 작성한 코드에 문법적, 논리적 오류가 없더라도 실 운영 상황에서는 예기치 못한 제약으로 서비스가 중단될 수도 있음
이 예기치 못한 제약을 미리 찾아내고 예측하는 것이 가장 큰 목적
이를 파악하기 위한 지표
- Users
동시에 사용할 수 있는 유저 수
nGrinder에서는 VUser로 Virtual User의 약자임
테스트는 가상 사용자로 진행하게 됨
- TPS
초당 몇개의 테스트를 처리할 수 있는지 (Test per second - transaction 아님!)
1) 한 명만 사용해도 처리량이 좋지 않으면 → scale up
2) 부하 증가시 문제 → scale out
- Time
얼마나 빠른지
테스트 환경
테스트는 실제 운영 환경과 동일하거나 유사해야 함
인프라와 데이터의 양 모두 같으면 좋음
또 외부 API를 호출하는 경우 임의의 Mock 로직을 삽입한 서버를 구동해야 함
외부에 의존성이 있는 테스트는 언제나 좋지 못함
현재 진행 중인 프로젝트에도 kakao oauth 로직이 있는데 mocking해서 테스트해야함
전제조건
- 테스트하려는 Target 시스템의 범위를 정해야 함
- 부하 테스트시에 저장될 데이터 건수와 크기를 결정해야 함
서비스 이용자 수, 사용자의 행동 패턴, 사용 기간 등을 고려하여 계산
- 목푯값에 대한 성능 유지기간을 정해야 함
- 서버에 같이 동작하고 있는 다른 시스템, 제약 사항 등을 파악해야 함
target 시스템의 범위는 springboot + mysql + redis로 설정
데이터 수는 테이블별로 5 ~ 10 만개의 임의 데이터를 넣고 진행
성능 유지기간은 30분으로 설정
테스트 종류
아래 세 가지 테스트는 모두 소프트웨어 개발 생명주기(SDLC)의 일부이며, 각기 다른 목적과 초점을 가지고 있음
스모크 테스트는 빌드의 기본적인 안정성을 확인하는 데 사용
로드 테스트는 시스템의 성능 기준을 설정하는 데 사용
스트레스 테스트는 시스템의 극한 상태와 복원력을 평가하는 데 사용
1. 스모크 테스트 (Smoke Testing)
1) 스모크 테스트란?
빌드의 안정성을 확인하기 위한 테스트
일반적으로 테스트의 초기 단계에서 수행되며, 스크립트나 시스템에 심각한 오류가 없는지를 확인하는데 사용
2) 이름의 유래
이름은 전자 제품을 처음 켰을 때 연기(smoke)가 나지 않으면 기본적인 기능이 작동한다는 개념에서 유래
3) 특징
새로운 소프트웨어 또는 소프트웨어의 새로운 버전이 개발되었을 때, 스모크 테스트는 기본적인 기능이 작동하는지를 확인하는 데 초점을 맞춤
소프트웨어 개발 초기 단계나 새로운 빌드가 완성되었을 때 수행되며, "빌드가 너무 결함이 많아 테스트를 계속하는 것이 의미가 없는지"를 판단하는 데 도움을 줌
4) 진행 방법
VUser: 1 ~ 2
최소의 부하로 시나리오를 검증
스모크 테스트를 진행하기 위해서는 기본적인 테스트 스크립트를 작성한 다음, 가장 낮은 부하 설정으로 테스트를 실행하여 시스템의 기본 기능이 정상적으로 작동하는지 확인
(1) 테스트 스크립트 작성: 애플리케이션의 핵심 기능에 대한 테스트 스크립트를 작성
(2) 테스트 환경 설정: nGrinder에서 테스트를 위한 환경을 설정
(3) 낮은 부하 실행: 단일 사용자 또는 매우 적은 수의 사용자로 테스트를 실행
(4) 결과 확인: 테스트 결과를 확인하여 기본 기능이 정상적으로 동작하는지 검증
2. 부하 테스트 (Load Testing)
1) 부하(로드) 테스트란?
시스템이 정상적인 조건과 피크 타임에 예상되는 사용자 수를 처리할 수 있는지 확인하기 위한 테스트
시스템이 정상적인 운영 조건 하에서 사용자의 요구를 충족시킬 수 있는지를 측정
이를 위해 실제 운영 환경을 모방하는 부하를 생성
2) 특징
시스템이나 애플리케이션이 사용자들로부터의 요청을 얼마나 잘 처리할 수 있는지를 측정하는 데 초점을 맞춤
로드 테스트는 일반적으로 예상되는 최대 사용자 수 또는 트랜잭션 수에 도달할 때까지 점진적으로 시스템에 부하를 가하며 수행
시스템의 응답 시간, 처리량, 자원 사용량 등을 측정하여 성능을 평가
3) 진행 방법
평소 트래픽과 최대 트래픽일 때 VUser를 계산 후 시나리오를 검증
결과에 따라 개선해보면서 테스트를 반복
로드 테스트는 시스템이 실제 운영 환경에서 예상되는 사용자 수를 처리할 수 있는지를 확인하기 위한 테스트
(1) 테스트 스크립트 준비: 실제 사용자가 수행할 것으로 예상되는 작업을 모델링하는 테스트 스크립트를 준비
(2) 부하 설정: 예상 사용자 수에 해당하는 부하를 설정합니다. nGrinder에서는 에이전트를 사용하여 동시 사용자 수를 모방
(3) 테스트 실행: 설정된 부하로 테스트를 실행
(4) 모니터링 및 분석: nGrinder의 모니터링 도구를 사용하여 응답 시간, TPS(초당 트랜잭션 수), CPU 사용량 등을 모니터링하고 분석
3. 스트레스 테스트 (Stress Testing)
1) 스트레스 테스트란?
소프트웨어가 정상적인 운영 조건을 넘어선 상황에서도 얼마나 견딜 수 있는지를 평가
시스템의 한계를 테스트하고, 한계점 이상에서 어떻게 성능이 저하되는지, 시스템이 어떻게 복구되는지를 평가
2) 특징
로드 테스트를 한 단계 더 나아가, 시스템이나 애플리케이션이 극단적인 부하, 제한된 자원, 높은 트래픽 등의 상황에서 어떻게 동작하는지를 확인
스트레스 테스트의 목적은 시스템의 한계와 한계에 도달했을 때의 시스템의 복원력을 확인하는 것
이를 통해 시스템이 실패하는 조건을 파악하고, 중요한 시스템이 과부하 상태에서도 안정적으로 운영될 수 있는지를 평가
3) 진행 방법
스트레스 테스트는 시스템의 극한 조건에서의 성능과 복원력을 평가하기 위한 테스트
최대 사용자 혹은 최대 처리량인 경우의 한계점을 확인하는 테스트
점진적으로 부하를 증가시켜봄
테스트 이후 시스템이 수동 개입 없이 자동 복구되는지 확인
(1) 테스트 스크립트 준비: 스트레스 테스트를 위한 스크립트를 작성
(2) 극한 부하 설정: 시스템이 처리할 수 있는 것 이상의 부하를 설정. 이는 시스템의 한계를 찾기 위함
(3) 테스트 실행: 설정된 고부하로 테스트를 실행
(4) 시스템 모니터링: 시스템의 성능을 지속적으로 모니터링하면서, 어떤 지점에서 시스템이 어떻게 실패하는지를 관찰
(5) 결과 분석: 시스템의 한계점을 확인하고, 시스템이 실패 후 얼마나 잘 복원되는지 평가
성능 목표 설정
1) VUser(Virtual User)
부하(로드) 테스트인 경우, 성능 목표를 정하기 위해서는 VUser를 구해야함
VUser를 구하기 위해서는 아래와 같은 지표들이 필요
- DAU(Daily active users, 활동 사용자 수)
- 피크시간대 집중률(최대 트래픽 / 평소 트래픽)
- 1명 당 1일 평균 요청 수
실제 트래픽을 경험해보지 못해서 어떻게 설정해야할지 잘 모르겠음
대충 DAU 5만, 집중률 3, 평균 요청수 10으로 잡음
2) Throughput
Throughput도 설정해야 함
Throughput은 일정 시간 동안 시스템이 처리할 수 있는 작업의 양을 의미
일반적으로 초 단위로 측정되며, '초당 처리 건수(Transactions Per Second, TPS)'와 같이 표현됨
Throughput은 성능 테스트의 중요한 지표 중 하나로, 다음과 같은 요소를 포함할 수 있음
1) 웹 서버의 경우: 초당 페이지 뷰 수, 초당 요청 수 등
2) 데이터베이스 서버의 경우: 초당 쿼리 수, 초당 트랜잭션 수 등
3) 네트워크의 경우: 초당 전송된 데이터의 양(바이트나 비트 단위)
Throughput을 측정함으로써, 시스템이 얼마나 많은 부하를 처리할 수 있는지, 최적의 성능을 발휘하는 부하 수준은 어떤 것인지, 그리고 시스템의 성능 병목 지점은 어디인지 파악할 수 있음
이러한 정보는 시스템의 용량 계획(capacity planning) 및 성능 향상에 중요한 역할을 함
예를 들어, 로드 테스트 중에 시스템의 Throughput이 일정 수준 이상 증가하지 않는다면, 이는 시스템의 성능 병목이 발생했음을 나타낼 수 있으며, 이를 해결하기 위한 추가적인 조치가 필요할 수 있음
"Throughput: 11.3 ~ 34 이상"이라는 표현을 성능 테스트의 결과로 본다면, 이는 테스트 동안 시스템의 처리량이 초당 최소 11.3 건에서 최대 34 건 이상의 작업을 처리했다는 것을 의미
여기서 작업은 트랜잭션, 요청, 데이터 패킷 등 시스템에 따라 다른 형태를 취할 수 있음
이 범위는 테스트가 수행되는 동안 관찰된 처리량의 변동을 나타내며, 테스트의 다양한 시점에서 측정된 성능 지표를 의미할 수 있음
예를 들어, 시스템의 부하가 증가하거나 감소함에 따라 처리량이 이 범위 내에서 변동할 수 있음
이 정보는 시스템의 성능 범위와 안정성을 평가하는 데 사용될 수 있으며, 시스템의 용량 계획이나 성능 개선에 중요한 기준이 됨
테스트 종합 목표
1) Smoke 테스트
VUser: 1 ~ 2
Throughput: 11.3 ~ 34 이상
Latency: 50 ~ 100ms 이하
2) Load 테스트
평소 트래픽 VUser: 7
최대 트래픽 VUser: 22
Throughput: 11.3 ~ 34 이상
Latency: 50 ~ 100ms 이하
성능 유지 기간: 30분
3) Stress 테스트
VUser: 점진적으로 증가시켜보기
어디서 가져온건데 잘 모르겠으니 일단 이대로 해보는걸로...