IT STUDY LOG

[성능 테스트] 04. 부하 테스트 도구와 활용 본문

devops bootcamp 4/DevOps 인프라 관리

[성능 테스트] 04. 부하 테스트 도구와 활용

roheerumi 2023. 6. 6. 14:56

# 학습 목표

  • 시스템의 가용성과 확장성을 평가할 수 있다.
  • 부하 테스트의 목적을 이해할 수 있다.
  • 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에서 소개하는 부하테스트 도구

 

AWS 기반 웹 및 애플리케이션 서버 부하 테스트: A to Z | Amazon Web Services

사용자가 이용하고 있는 온라인 서비스로부터 예상치 못한 느려짐을 겪거나, 접속 불가로 인해 서비스 이용 조차 할 수 없다면, 서비스에 중요한 재방문율(Retention Rate)과 유료 전환율(Conversation R

aws.amazon.com

도구 명 활용 방법
JMeter 웹 애플리케이션 내에서 사용자의 행동 흐름에 대해 부하 테스트를 하고 싶을 때
Tsung API 가 수용할 수 있는 최대치의 부하를 알고 싶을 때
Vegeta 어떤 API 에 대해 초당 특정 수치의 요청이 지속될 경우 발생하는 상황을 파악하고 싶을 때
Goad 부하 생성 클라이언트 구성을 포함한 부하 테스트 관련 인프라 구성을 피하고 싶을 때
RedLine13 JMeter 로 테스트 플랜을 작성하여 활용을 원하지만, 비용을 최소화 하고 싶고 사용한 만큼만 비용이 발생하길 원할 때
Blazemeter 높은 동시성을 위해 JMeter 의 Remote Testing 기능을 활용하고 싶지만, 테스트 플랜 작성에 집중하고, 부하 테스트 관련 인프라 구성은 하고 싶지 않을 때
Loader.io 부하 테스트 관련 인프라 구성을 하고 싶지 않고, Tsung 과 비슷한 목적으로 사용하고 싶을 때

 

k6

 

Load testing for engineering teams | Grafana k6

k6 is an open-source tool and cloud service that makes load testing easy for developers and QA engineers.

k6.io

- Grafana k6는 엔지니어링 팀이 성능 테스트를 쉽고 생산적으로 수행할 수 있도록 해주는 오픈 소스 부하 테스트 도구로 무료이고 개발자 중심적이며 확장 가능함

- k6을 사용하면 시스템의 안정성과 성능을 테스트하고 성능 회귀와 문제를 조기에 파악 가능

- k6은 확장 가능한 탄력적이고 성능이 뛰어난 애플리케이션을 구축하는 데 도움 됨

주요 특징들

사용 사례

- k6 사용자는 일반적으로 개발자, QA 엔지니어, SDET 및 SRE며 일반적인 k6 사용 사례는 아래와 같음

  1. 부하 테스트 : k6은 최소한의 리소스 소비에 최적화되어 있으며 고부하 테스트 ( 스파이크 , 스트레스 , 소크 테스트 ) 를 실행하도록 설계
  2. 브라우저 테스트 : k6 브라우저를 통해 브라우저 기반의 성능 테스트를 실행하고 프로토콜 수준을 뛰어넘는 브라우저에만 관련된 문제를 파악 가능
  3. 혼돈 및 탄력성 테스트 : k6를 사용하여 카오스 실험의 일부로 트래픽을 시뮬레이션하거나 k6 테스트에서 트래픽을 트리거하거나 xk6-disruptor를 사용하여 Kubernetes에 다양한 유형의 결함을 주입 가능
  4. 성능 및 합성 모니터링 : k6을 사용하면 작은 로드로 테스트를 자주 트리거하도록 자동화하고 예약하여 생산 환경의 성능과 가용성을 지속적으로 검증 가능

k6가 지원하지 않는 것

- k6은 JavaScript로 스크립팅할 수 있는 고성능 부하 테스트 도구로 이러한 아키텍처 디자인은 몇 가지 장단점이 존재

브라우저에서 기본적으로 실행되지 않음

- 기본적으로 k6은 브라우저와 같은 방식으로 웹 페이지를 렌더링하지 않음

- 브라우저는 상당한 시스템 리소스를 사용할 수 있으므로 브라우저를 건너뛰면 단일 시스템 내에서 더 많은 부하를 실행할 수 있음

- 단, k6 브라우저를 사용 하면 실제 브라우저와 상호작용하고 k6 테스트의 일부로 프런트엔드 측정항목을 수집 가능

NodeJS에서 실행되지 않음

- JavaScript는 일반적으로 고성능에 적합하지 않으므로 최대 성능을 달성하기 위해 도구 자체는 Go로 작성되었으며 손쉬운 테스트 스크립팅을 허용하는 JavaScript 런타임이 내장되어 있음

- nodeJS API를 사용하여 npm 모듈 또는 라이브러리를 가져오려는 경우 npm 모듈을 webpack과 번들로 묶고 테스트에서 가져올 수 있음

 

Artillery.io

 

Artillery.io | Load & Smoke Testing

Keep production reliable, customers happy, and pagers silent.

www.artillery.io

테스트 가능한 서비스 종류

- Artillery 는 API 서비스, 전자상거래 백엔드, 채팅 시스템, 게임 백엔드, 데이터베이스, 메시지 브로커 및 대기열, 네트워크를 통해 통신할 수 있는 모든 것과 같은 백엔드 시스템 테스트용으로 설계되어 모든 백엔드를 테스트하는 데 사용 가능

- Artillery는 기본적으로 HTTP, WebSocket 및 Socket.io를 지원하고 플러그인을 통해 HLS, Kinesis 및 Kafka와 같은 많은 추가 프로토콜을 지원

- 웹 UI 또한 가능

사용 사례

  • 개발 프로세스의 일부로 개별 API 또는 마이크로 서비스에 대한 임시 로드 테스트를 실행하여 성능 특성을 탐색하고 필요한 경우 성능 최적화(예: 메모리 누수 방지 또는 CPU 사용량이 많은 코드 최적화)
  • CI/CD 파이프라인의 일부로 스테이징/기능 환경에 대한 테스트를 실행하여 성능 회귀를 조기에 포착하고 SLO를 확인합니다.
  • 새로운 서비스의 프로덕션 릴리스 전 또는 블랙 프라이데이/사이버 먼데이 트래픽과 같은 트래픽이 많은 애플리케이션 및 인프라를 준비하기 위한 대규모 로드 테스트
  • 트래픽 급증에 대한 안전 마진을 유지하기 위해 프로덕션에 합성 트래픽 추가
  • 여러 지리적 위치의 주요 API에 대해 합성 모니터링을 실행하여 주요 트랜잭션 및 흐름이 예상대로 작동하는지 확인하고 문제가 있는 경우 경고

 

Comments