IT STUDY LOG
[성능 테스트] 04. 부하 테스트 도구와 활용 본문
# 학습 목표
- 시스템의 가용성과 확장성을 평가할 수 있다.
- 부하 테스트의 목적을 이해할 수 있다.
- Throughput과 Latency의 개념을 이해할 수 있다.
- 시스템의 병목이 발생하는 주요 원인과 대책을 이해할 수 있다.
- SLO를 설정하고, 이를 기반으로 부하 테스트를 진행하고, 달성 여부를 파악할 수 있다.
# 학습 내용
1. 부하 테스트 계획
- 부하 테스트 전에 서비스 수준 목표(SLO)를 설정하는 것이 좋음 -> 척도 표준화 및 목표 설정
Latency에 중점을 둔 SLO 예시
- GET 호출의 90%는 1ms 이내에 완료해야 함
- GET 호출의 99%는 10ms 이내에 완료해야 함
- GET 호출의 99.9%는 100ms 이내에 완료해야 함
Throughput에 중점을 둔 SLO 예시
- throughput은 순간적으로 요청이 치솟는 피크(peak) 트래픽에서의 처리량을 바탕으로 함
1일 기준으로 RPS를 계산하고자 할 때의 시나리오 예시
- DAU(Daily Active User: 1일 접속자 수): 5만 명
- 1명당 평균 접속 횟수: 20회
- 1일 평균 접속 수에 대한 피크 트래픽 배율: 3배 (보통 평균의 2~3배를 곱합니다)
- 안전 계수 (얼마만큼 넉넉하게 프로비저닝 할 것인가): 3배
- 위 경우 하루가 총 86400초이므로 RPS는 아래와 같이 계산될 수 있음
50000 x 20 / 86400 x 3 x 3 = 104RPS (약 100RPS)
- 이를 바탕으로 도출한 SLO : 서비스는 100RPS를 달성해야 함
2. 부하 테스트 도구
AWS에서 소개하는 부하테스트 도구
도구 명 | 활용 방법 |
JMeter | 웹 애플리케이션 내에서 사용자의 행동 흐름에 대해 부하 테스트를 하고 싶을 때 |
Tsung | API 가 수용할 수 있는 최대치의 부하를 알고 싶을 때 |
Vegeta | 어떤 API 에 대해 초당 특정 수치의 요청이 지속될 경우 발생하는 상황을 파악하고 싶을 때 |
Goad | 부하 생성 클라이언트 구성을 포함한 부하 테스트 관련 인프라 구성을 피하고 싶을 때 |
RedLine13 | JMeter 로 테스트 플랜을 작성하여 활용을 원하지만, 비용을 최소화 하고 싶고 사용한 만큼만 비용이 발생하길 원할 때 |
Blazemeter | 높은 동시성을 위해 JMeter 의 Remote Testing 기능을 활용하고 싶지만, 테스트 플랜 작성에 집중하고, 부하 테스트 관련 인프라 구성은 하고 싶지 않을 때 |
Loader.io | 부하 테스트 관련 인프라 구성을 하고 싶지 않고, Tsung 과 비슷한 목적으로 사용하고 싶을 때 |
k6
- Grafana k6는 엔지니어링 팀이 성능 테스트를 쉽고 생산적으로 수행할 수 있도록 해주는 오픈 소스 부하 테스트 도구로 무료이고 개발자 중심적이며 확장 가능함
- k6을 사용하면 시스템의 안정성과 성능을 테스트하고 성능 회귀와 문제를 조기에 파악 가능
- k6은 확장 가능한 탄력적이고 성능이 뛰어난 애플리케이션을 구축하는 데 도움 됨
주요 특징들
- 개발자 친화적인 API가 포함된 CLI 도구
- JavaScript ES2015/ES6의 스크립팅 - 로컬 및 원격 모듈 지원
- 검사 및 임계값 - 목표 지향적이고 자동화 친화적인 부하 테스트용
사용 사례
- k6 사용자는 일반적으로 개발자, QA 엔지니어, SDET 및 SRE며 일반적인 k6 사용 사례는 아래와 같음
- 부하 테스트 : k6은 최소한의 리소스 소비에 최적화되어 있으며 고부하 테스트 ( 스파이크 , 스트레스 , 소크 테스트 ) 를 실행하도록 설계
- 브라우저 테스트 : k6 브라우저를 통해 브라우저 기반의 성능 테스트를 실행하고 프로토콜 수준을 뛰어넘는 브라우저에만 관련된 문제를 파악 가능
- 혼돈 및 탄력성 테스트 : k6를 사용하여 카오스 실험의 일부로 트래픽을 시뮬레이션하거나 k6 테스트에서 트래픽을 트리거하거나 xk6-disruptor를 사용하여 Kubernetes에 다양한 유형의 결함을 주입 가능
- 성능 및 합성 모니터링 : k6을 사용하면 작은 로드로 테스트를 자주 트리거하도록 자동화하고 예약하여 생산 환경의 성능과 가용성을 지속적으로 검증 가능
k6가 지원하지 않는 것
- k6은 JavaScript로 스크립팅할 수 있는 고성능 부하 테스트 도구로 이러한 아키텍처 디자인은 몇 가지 장단점이 존재
브라우저에서 기본적으로 실행되지 않음
- 기본적으로 k6은 브라우저와 같은 방식으로 웹 페이지를 렌더링하지 않음
- 브라우저는 상당한 시스템 리소스를 사용할 수 있으므로 브라우저를 건너뛰면 단일 시스템 내에서 더 많은 부하를 실행할 수 있음
- 단, k6 브라우저를 사용 하면 실제 브라우저와 상호작용하고 k6 테스트의 일부로 프런트엔드 측정항목을 수집 가능
NodeJS에서 실행되지 않음
- JavaScript는 일반적으로 고성능에 적합하지 않으므로 최대 성능을 달성하기 위해 도구 자체는 Go로 작성되었으며 손쉬운 테스트 스크립팅을 허용하는 JavaScript 런타임이 내장되어 있음
- nodeJS API를 사용하여 npm 모듈 또는 라이브러리를 가져오려는 경우 npm 모듈을 webpack과 번들로 묶고 테스트에서 가져올 수 있음
Artillery.io
테스트 가능한 서비스 종류
- Artillery 는 API 서비스, 전자상거래 백엔드, 채팅 시스템, 게임 백엔드, 데이터베이스, 메시지 브로커 및 대기열, 네트워크를 통해 통신할 수 있는 모든 것과 같은 백엔드 시스템 테스트용으로 설계되어 모든 백엔드를 테스트하는 데 사용 가능
- Artillery는 기본적으로 HTTP, WebSocket 및 Socket.io를 지원하고 플러그인을 통해 HLS, Kinesis 및 Kafka와 같은 많은 추가 프로토콜을 지원
- 웹 UI 또한 가능
사용 사례
- 개발 프로세스의 일부로 개별 API 또는 마이크로 서비스에 대한 임시 로드 테스트를 실행하여 성능 특성을 탐색하고 필요한 경우 성능 최적화(예: 메모리 누수 방지 또는 CPU 사용량이 많은 코드 최적화)
- CI/CD 파이프라인의 일부로 스테이징/기능 환경에 대한 테스트를 실행하여 성능 회귀를 조기에 포착하고 SLO를 확인합니다.
- 새로운 서비스의 프로덕션 릴리스 전 또는 블랙 프라이데이/사이버 먼데이 트래픽과 같은 트래픽이 많은 애플리케이션 및 인프라를 준비하기 위한 대규모 로드 테스트
- 트래픽 급증에 대한 안전 마진을 유지하기 위해 프로덕션에 합성 트래픽 추가
- 여러 지리적 위치의 주요 API에 대해 합성 모니터링을 실행하여 주요 트랜잭션 및 흐름이 예상대로 작동하는지 확인하고 문제가 있는 경우 경고
'devops bootcamp 4 > DevOps 인프라 관리' 카테고리의 다른 글
[성능 테스트] 03. 병목 찾기 (2) | 2023.06.06 |
---|---|
[성능 테스트] 02. 부하 테스트 기본 (0) | 2023.06.06 |
[성능 테스트] 01. 가용성과 확장성 (0) | 2023.06.06 |
[서비스 모니터링] 04. 서비스 수준 목표 (0) | 2023.06.05 |
[서비스 모니터링] 03. Prometheus + Grafana (0) | 2023.06.02 |