nGrinder
, JMeter
등 다양한 툴이 존재한다.
이번 프로젝트에서 사용할 성능 테스트 툴에 대해서 알아보자.
성능 테스트란?
특정 상황에서 시스템이 어느 수준의 퍼포먼스를 내는지 측정하기 위한 테스트 방식이다.
가상의 유저를 시뮬레이션하여 실제와 비슷한 환경을 만들고, 서버에 일정 규모의 부하를 주는 방식으로 테스트한다.
일반적으로 애플리케이션의 성능을 측정하고, 최적화하기 위해 사용한다.
부하 테스트, 스트레스 테스트를 포함하는 포괄적인 의미이다.
부하 테스트란?
동시 요청이나 시스템의 성능을 측정하고자 할 때 사용하는 테스트이다.
부하 테스트는 시스템이나 애플리케이션의 최대 용량을 결정하거나, 결과를 예측하거나, 다른 성능 관련한 정보를 얻기 위해 특정 부하와 요청을 시스템에 가하는 테스트이다.
스프링 웹 애플리케이션의 경우, 동시 사용자나 초당 요청 수 등 다양한 요청 시나리오에 대한 애플리케이션의 응답 시간, 처리 능력, 에러 발생 빈도 등을 측정할 수 있다.
JMeter
Apache 에서 만든 java 기반 오픈 소스로, 오래된 테스트 툴 중 하나이기 때문에 안정적이다. 웹 서비스, 데이터베이스, FTP, 메일 서버 등 다양한 프로토콜에 대한 테스팅을 지원한다.
서버, 서버 그룹, 네트워크 또는 개체에 대한 과부하를 시뮬레이션하여 강도를 테스트하거나 다양한 부하 유형에서 전체 성능을 분석하는 데 사용할 수 있다.
BeanShell
, Jython
, Groovy
등을 이용하여 스크립트를 작성할 수 있다.
GUI 를 제공하고, 테스트 플랜을 직접 구성할 수 있다.
장점
- GUI, 이메일, DB, SSL 등 지원하는 기능과 플러그인이 많다.
- 다양한 프로토콜을 지원한다.
- 큰 사용자 커뮤니티, 많은 플러그인으로 확장성이 뛰어나다.
- 여러 기계에서 테스트를 동시에 실행하여 대규모 부하 테스트를 실행할 수 있다. 단, 각 에이전트를 수동으로 설정해야 한다.
단점
- 모든 기능이 다 필요한 지 의문
- 모니터링이 불편하다.
- 스레드 기반이라 성능 제약이 있다.
nGrinder
네이버에서 만든 오픈 소스이다.
스크립트 생성과 테스트, 모니터링 등 성능 지표에 대한 보고서를 Web UI 로 사용할 수 있다. 여러 테스트를 동시에 실행하고, 결과를 중앙에서 모니터링할 수 있다.
nGrinder 를 사용하기 위해 Controller
, Agent
, Target Server
가 별도의 서버로 구성되어야 한다.
한 서버에 모두 몰려있는 경우, 서버의 자원을 나눠서 사용해야 하고, 그만큼 Context Switching 이 발생하여 순수 성능을 끌어올릴 수 없다.
groovy
스크립트로 테스트 시나리오를 작성할 수 있다.
용어
Controller
: Web UI 를 제공하고 테스트를 구성할 수 있도록 하며, 테스트를 모니터링하거나 보고서를 시각화 해주는 역할Agent
: 부하를 발생시키는 역할로, Process 와 Thread 를 사용하여 vUser (가상 사용자) 를 생성한다.Controller
가 생성한 테스트 스크립트에 의해Target Server
에 부하를 발생시킨다. 복수의 머신에 설치하여Controller
의 신호에 따라 일시에 부하를 발생시킨다.Target Server
: 테스트하고자 하는 서버. 테스트 중 발생한 오류나 CPU, Memory 의 점유율 등을 확인하고 싶다면 nGrinder Monitor 를 설치할 수 있다.
Controller
, Agent
, Target Server
는 모두 각각 구축하는 것이 좋다. 세 가지 요소들을 하나의 서버로 구동한다면, 서버가 성능 테스트만을 위해 자원을 사용할 수 없게 되기 때문에 정확한 수치를 산출해내기 어렵다.
장점
- 설치만 하면 사용하기 쉽다.
- 예약, 모니터링, ramp up, 스크립트 기능을 지원한다.
- docker 에서 사용할 수 있다.
- 특정 목적 (대규모 웹 애플리케이션 테스팅) 을 위해 최적화된 도구이다.
- 웹 UI 에서 에이전트를 쉽게 관리하고 분산 테스팅을 구성할 수 있다.
- 예약을 통해 주기적인 테스트가 가능하다.
- WAS 기반으로 동작하여 젠킨스, 소나큐브 대시보드 같이 개발자 각각의 계정을 가질 수 있고, 계정 별 부하 테스트 히스토리를 관리할 수 있다.
단점
- agent 와 controller 를 각자 실행해야 된다.
- controller 가 tomcat 을 필요로 한다.
- 스레드 기반이라 성능, 동시성 제한이 있다.
- 커뮤니티가 활발하게 활성화되지 않아 한국어로 작성된 문서가 거의 없다.
Locust
Python 기반의 부하 테스팅 도구이다. 사용자 정의 테스트 시나리오를 Python 코드로 작성하여 실행할 수 있다.
- 총 요청에 대한 RPS 와 실패율 관련 정보
- 응답 시간과 95% percentile
- 투입된 유저 수
등을 보여준다.
장점
- 테스트 시작, 중지, 모니터링 및 결과 보고를 위한 웹 사용자 인터페이스를 제공한다.
- 여러 머신에서 테스트를 동시에 실행하여 대규모 부하 테스트를 수행할 수 있다.
- 별도의 큰 설치나 설정 없이 간단하게 실행 가능하다.
- 스크립트 기반으로 성능 테스트가 진행된다. 명시적인 코드로 테스트 시나리오를 확인할 수 있고, 시나리오 형상 관리도 용이하다.
- Event Driven 방식으로 사용하기 때문에 적은 리소스로도 많은 트래픽을 생성할 수 있다.
- 통계를 다운로드 받을 수 있다.
단점
- JMeter 같은 Java 기반 도구와 달리, Python 기반이기 때문에 스프링 애플리케이션과의 통합이 덜 하다고 할 수 있다.
- 다양한 프로토콜에 대한 내장 지원이 부족할 수 있다.
- 파이썬 러닝 커브가 존재한다.
Pinpoint
Java 로 작성된 대규모 분산 시스템 용 APM 도구이다.
Transaction
의 추적을 제공하는 APM 중 하나이다.
결론
nGrinder 를 사용하기 위해서는 Agent
, Controller
가 각각 서버로 구성되어야 하기 때문에 서버가 2대 이상 필요하게 된다. 로컬에서 Agent
를 실행하게 된다면 JMeter 와 차이점이 없어진다.
JMeter 는 2023년 7월에도 Release 가 올라왔기 때문에, 꾸준하게 오픈소스 업데이트가 이루어진다고 할 수 있다.