해당 글을 통해서 성능 테스트를 왜 해야하는지, 어디서부터 어떻게 해야하는지를 알아보도록 하자
앱이나 시스템이 주어진 조건에서 얼마나 효율적이고 안정적으로 동작하는지 평가하기 위한 테스트 과정
시스템의 성능을 다양한 관점에서 측정하여, 실제 운영 환경에서 발생할 수 있는 문제를 미리 파악하고 해결하는 데 목적이 있음
2017년 구글이 발한 자료 내용을 살펴보자 [참고]
설정한 목표치 달성
목표 : 초당 1000건의 요청 처리, 모든 조회 요청을 1초 이내로 응답
→ 배포 전 성능 테스트를 통해 목표치를 만족하는지 확인
어떤 지표를 확인해야할까요?
성능 병목 현상 파악
가용성
기타
성능 테스트의 결과를 정량적으로 평가하는 기준
응답 시간(Response Time) : 사용자가 요청을 보낸 시점부터 응답을 받기까지의 시간
처리량(Throughput) : 시스템이 단위 시간당 처리할 수 있는 요청이나 트랜잭션의 수
초당 요청 수 (Requests per Second, RPS) : 시스템이 초당 처리할 수 있는 HTTP 요청의 수를 측정하여, 웹 앱의 처리 능력을 평가
트랜잭션 수 (Transactions per Second, TPS) : DB나 앱에서 초당 처리되는 트랜잭션 수를 평가하여, 시스템의 처리 능력을 파악
데이터 전송량 : 네트워크를 통해 초당 전송되는 데이터 양(예: MB/s)을 측정하여, 대용량 데이터 전송 시의 성능을 평가
자원 사용량(Resource Utilization) : CPU, 메모리, 네트워크 대역폭 등의 자원 사용률
오류율(Error Rate) : 처리된 요청 중 실패한 요청의 비율
성능 테스트의 구체적인 방법을 나타내며, 각각의 유형은 특정한 목적을 달성하기 위해 사용됨
부하 관련 테스트 (Load Testing)
부하 테스트**(Load Testing)**
: 예상되는 최대 사용자 수나 트래픽 조건에서 시스템 성능을 평가, 목표값에 해당되는 부하를 견딜 수 있는지 확인
고정 부하 테스트 : 예상되는 최대 부하를 일정 시간 동안 유지하여 안정성 평가
스파이크 테스트(Spike Testing)
: 짧은 시간 동안 급격하게 부하를 증가시켜 시스템이 어떻게 대응하는지 평가, 사용량이 급증하는 상황에서 시스템이 견디고 성능에 문제가 없는지 확인
피크 테스트(Peak Testing)
: 예상되는 최고 부하 상태에서 시스템 성능을 평가
한계점 및 회복력 테스트
스트레스 테스트(Stress Testing)
: 시스템이 최대치에 해당되는 부하를 받았을 때 성능과 회복 능력을 평가
중단점 테스트(Breakpoint Testing)
: 시스템이 감당할 수 있는 최대 부하 수준을 찾기 위해 점진적으로 부하를 증가시키며 테스트
회복 테스트 : 시스템 장애 이후 정상 상태로 회복하는 능력을 평가
지속성 및 안정성 평가
내구 테스트 (Endurance/Soak Testing)
: 장시간 동안 평균 사용률로 일정한 부하를 가하여 시스템 성능과 안정성을 평가
안정성 테스트 : 시스템이 오랜 시간 동안 지속적인 부하에서 얼마나 안정적으로 동작하는지 평가
데이터 처리 관련 테스트
볼륨 테스트
: 대량의 데이터를 처리할 때 시스템 성능이 어떻게 변화하는지 평가
기본 기능 확인 테스트
스모크 테스트(Smoke Testing)
: 시스템의 주요 기능이 정상적으로 동작하는지 간단히 확인하는 초기 테스트
내구 테스트 (Endurance/Soak Testing) : 장시간 동안 시스템의 안정성을 평가
볼륨 테스트 (Volume Testing) : 대량의 데이터를 처리할 때 시스템 성능을 평가
테스트 도구 | Locust | JMeter | k6 | nGrinder |
---|---|---|---|---|
개발 조직 | Locust 오픈소스 커뮤니티 | Apache Foundation | Grafana Labs | NHN |
언어 | Python | Java | JavaScript | Jython, Groovy |
사용자 시나리오 정의 | 코드 기반 | GUI 또는 코드 기반 | 다양한 GUI (Grafana 호환) | GUI 또는 코드 기반 |
설치 및 시작 | pip install locust | Java 설치 및 GUI 또는 명령행으로 실행 | 패키지 설치, CLI 실행 | Java 설치 및 실행 |
분산 테스트 | 마스터-워커 구조 지원 | 분산 테스트 지원 | 분산 테스트 지원 (클라우드 유료) | 분산 테스트 지원 |
유연성 및 확장성 | Python 코드로 유연성이 높음 | 플러그인 아키텍처로 확장 가능 | 코드 기반으로 높은 유연성 제공 | 플러그인으로 확장 가능 |
학습 곡선 | Python 개발자 친숙 | GUI 사용으로 비전공자도 가능 | 코드 작성 필요로 중급 이상 | Java 친숙 필요 |
메모리 사용량 | 약 50 ~ 150 MB | 약 512MB ~ 1GB | 약 128~ 256MB | 약 300 ~ 500MB |
비고 | 단일 코어에서 실행 시 메모리 소비가 적은 편 분산 테스트 시 사용되는 워커의 수에 따라 메모리 사용량이 증가 | JVM의 특성상 메모리 사용량이 비교적 높은 편, 많은 스레드를 생성할 때 메모리 소모가 크며, 대규모 테스트에서 성능에 영향 | Go 언어 기반의 경량 도구로, 메모리 사용량이 비교적 적음, 이로 인해 클라우드 환경에서 매우 효율적으로 작동 | - |
시스템이 요청을 받은 후, 해당 요청을 처리하는 데 소요되는 시간
일반적으로 응답시간보다 짧은 시간으로 측정
시스템이 얼마나 효율적으로 요청을 처리하고 있는지를 나타내는 중요한 지표
동시 접속자 수를 예상
할 수 있음