성능 테스트

성능 테스트를 시작하기 전 알아야 할 것들
maro's avatar
Aug 03, 2024
성능 테스트
이 글에서는 성능 테스트에 대해 알아보고, 성능 테스트 툴을 골라봅니다.
이 글은 다음 글들로 이어집니다.
 

테스트의 종류

테스트의 종류는 다음과 같이 나눌 수 있습니다.
  • 단위 테스트 : 특정 메서드를 실행하는 상황에서 발생하는 문제를 사전에 찾기 위한 작업
  • 통합 테스트 : 여러 메서드와 외부 의존 모듈이 함께할 때 발생하는 문제를 사전에 찾기 위한 작업
  • 성능 테스트 : 트래픽이 많은 상황에서 발생하는 문제를 사전에 찾기 위한 작업
    • Load Test : 최대 트래픽에서 발생하는 문제를 찾는 테스트
    • Stress Test : 최대 트래픽 이상의 부하를 주어가며 시스템의 한계에서 발생하는 문제를 찾는 테스트
 
자주 접하는 TDD는 단위 테스트(혹은 유닛 테스트)를 통해 이루어지고, Postman 같은 API 툴로 테스트하는 것은 통합 테스트입니다. 위 두 테스트가 의도대로 기능이 ‘동작’하는지 확인하는 테스트라면 성능 테스트는 기능이 얼마나 ‘잘’ 동작하는지 테스트하는 것이라 볼 수 있습니다. 성능 테스트를 통해 대용량 트래픽이 일어날 때를 예상 할 수 있고, 병목 지점을 찾아 성능 개선 작업을 할 수 있습니다.
트래픽은 1초 동안 서버로 요청되는 수로 RPS(Request Per Second)로 표시할 수 있습니다.
 

성능 테스트 툴

성능 테스트 툴을 선택하기 위해 다음과 같은 사항을 고려하였습니다.
  • 로컬에서도 대용량 부하 테스트가 가능한가?
  • 스크립트 작성이 편리한가?
  • 시각화가 가능한가?
  • 레퍼런스를 많이 찾아볼 수 있는가?
 
위 사항에 부합하는 툴로 nGrinder, JMeter, k6 정도 추릴 수 있었습니다. 그리고 하나씩 테스트로 사용해본 결과, k6로 결정힐 수 밖에 없었습니다.
우선, nGrinder를 사용해 보았을 때, 시각화가 간편하다는 점과 한글 지원은 좋았으나 JDK 11버전까지만 지원한다는 치명적인 단점이 있었습니다. 또한, 메모리 소모도 많아서 대용량 부하 테스트에 리스크가 있습니다.
다음으로 JMeter는 JDK 17 이상을 선호하지만, 무겁고 스크립트 작성이 어렵습니다. 그리고 무엇보다 못.생.겼습니다.
결국 k6로 테스트를 진행하게 되었는데 여러가지 시도해본 결과 좋은 선택이었다고 생각합니다. 장점으로 다음 몇가지 정도 꼽을 수 있습니다.
  • 쉬운 스크립트 작성
    • Javascript로 스크립트를 작성하기 때문에 비교적 쉽게 할 수 있습니다.
  • 적은 리소스로 대규모 부하 테스트가 가능
    • 툴 자체는 Go 언어로 작성되어 있어서 가볍고 빠르다.
  • 그라파나와 연동
    • 그라파나에서 만들었기 때문에 최종적으로 그라파나를 이용한 시각화가 가능합니다.
  • 클라우드 지원
    • 그라파나 클라우드에서 k6 cloud 테스트를 지원합니다. 스크립트만 작성하면 간편하게 클라우드에서 시각화 데이터까지 지원받을 수 있습니다. 물론, 유료입니다.
 

성능 테스트 측정

성능 테스트 중에서도 Load Test(이하, 부하 테스트)에서 확인할 부분은 RPS응답 시간입니다. RPS가 올라가더라도 응답시간이 안정적으로 유지된다면 애플리케이션이 요청을 잘 처리하는 것으로 볼 수 있습니다. 반면, 특정 RPS 이상일 때 응답시간이 급증한다면 애플리케이션이 그 이상의 요청은 처리하기 어렵다고 볼 수 있습니다.
여기서 병목 지점을 찾아 개선하여 좀 더 높은 RPS까지 응답할 수 있도록 하는 것이 성능 개선의 목표입니다.
 
성능 지표
  • VU
    • Virtual User. 접속자 수를 보통 VU로 많이 표시합니다.
  • p99
    • 95분위, 99분위, 99.9분위 값을 줄여서 p95, p99, p999 라고 표시합니다.
    • p99의 응답시간이 1.5초라면 100개 중 99 개는 1.5초 이내라는 뜻입니다.
    • 극단적으로 튀는 값을 제외하고 대부분의 경우에 해당하는 값을 알고 싶을 때 참고합니다.
    • 아마존은 내부 서비스 수준 계약(SLA)의 기준으로 99.9th percentile latency를 사용합니다.
목표 지표를 설정할 때 위 지표를 사용하여 ‘초당 VU 10만명이 10초동안 들어왔을 때 latency p95 200ms’ 같은 목표를 설정합니다.
 
목표 RPS를 위한 VU 계산
목표 RPS를 구하는 공식은 다음과 같습니다.
Request Rate = (VU * R) / T
설정하고 이를 바탕으로 VU와 R을 설정합니다. 여기서 R은 VU 당 반복 요청 수이며, T는 VU 당 전체 반복 시간입니다.
일반적으로 요청에 500ms가 걸린다고 한다면, VU가 전체 반복을 끝내는데 걸리는 시간은 R*500ms 입니다. 여기서 지연을 고려하여 1~2초 정도 더해줍니다.
결과적으로 R을 100으로 가정하고, 1000rps를 달성하려고 할 때 필요한 VU는 다음과 같습니다.
  • Request Rate * T / R = VU
  • 1000 * (100*0.5s + 2s) / 100 = 520
 

정리

성능 테스트에 대해 알아보고, 성능 테스트 툴로 스크립트 작성이 쉽고, 가볍고 빠른 k6로 결정하였습니다. 다음 글에서는 k6에 대해 알아보고 설정해보도록 하겠습니다.
 
Share article

maro