백엔드의 꽃이라고 할 수 있는 서버 성능 테스트!
하지만 처음이라면 막상 내가 만든 서버의 테스트를 어디서부터 어떻게 해야할지 감이 오지 않습니다.
그래서 기초부터 실제 적용까지 포스트하고, 공부해보려고 합니다!
이번 포스트에서는 서버 성능 테스트의 종류와 툴들에 관해 알아보려고 합니다!
그럼 시작하겠습니다!
0. 성능 테스트
성능 테스트가 정확히 무엇인지에 대해 짚고 넘어가보도록 하겠습니다
성능 테스트란
- 특정 워크로드에서 어플리케이션의 속도, 응답시간, 안정성, 확장성, 리소스 사용량을 테스트하는 테스트 프로세스
- 시스템의 요소가 특정 상황에서 어느 정도의 성능을 보이는지를 측정하는 테스트
- 결함을 찾는 것이 목표가 아님
라고 합니다.
워크로드 - 주어진 시간 안에 시스템이 처리해야 하는 작업의 양과 작업의 성격을 뜻한다.
1. 서버 성능 테스트 종류
테스트 할 수 있는 종류는 다양하지만, 실제 운영되는 서버에서는 주로 아래와 같은 네가지 종류의 테스트를 진행합니다
하나씩 살펴본다면,
- 부하 테스트 (Load Test) - 특정한 부하를 제한된 시간을 두고, 어플리케이션에 이상이 없는지 파악하는 테스트
- 지속성 테스트 (Endurance Test) - 부하 테스트와 유사하지만 오랜 기간동안 부하를 주는 테스트
- 스트레스 테스트 (Stress Test) - 부하의 임계점을 찾고, 장애 상황에서의 시스템 반응을 관찰 후 복구 여부를 확인하기 위해 점진저긍로 부하를 올리면서 진행하는 테스트
- 최고 부하 테스트 (Peak Test) - 순간적으로 큰 부하를 주고, 서버가 죽지 않고 제대로 동작하고 회복하는지 보는 테스트 (EX. 수강신청)
2. 성능 테스트 도구
성능을 테스트하기 위한 도구는 현재 굉장히 잘 마련되어 있습니다.
지금도 계속해서 새로운 테스트 도구들이 만들어지고 있는데요.
대표적인 성능 테스트 도구는 아래와 같습니다.
- LoadRunner
- JMeter
- nGrinder
- Gatling
- k6
간단하게 하나씩 알아보도록 하겠습니다
2-1. Apache JMeter
Apache JMeter는 100% 순수 Java 응용프로그램으로 테스트 기능 동작을 로드하고 성능을 측정하도록 설계된 오픈소스 소프트웨어입니다.
다른 테스트 도구들 보다 좀 더 웹 서버 테스트에 특화되어 있습니다.
또한 정적 및 동적 자원, 웹 동적 애플리케이션 모두에서 테스트하거나 서버 혹은 네트워크을 시뮬레이션하여 강도 테스트 및 다양한 부하 유형에서 전체 성능을 분석하는데 사용할 수 있습니다.
JMeter가 가진 특징은 아래와 같습니다.
- 다양한 프로토콜/서버를 테스트 할 수 있습니다.
- 웹 (HTTP, HTTPS)
- SOAP / REST 웹 서비스
- FTP
- 데이터베이스
- Mail
- 자바 객체
- CLI 를 지원합니다
- CI/CD 툴과 연동할 때 편리합니다
- UI를 사용하는 것보다 메모리 등 시스템 리소스를 적게 사용합니다.
- 시나리오 기반 테스트가 가능합니다
- 다양한 외부 플러그인을 사용하여 기능 확장이 가능합니다.
- 확장성이 뛰어난 코어를 가지고 있습니다.
JMeter를 사용하기 위해선 아래와 같은 기본 개념 지식이 필요합니다.
- Thread Group : 몇 개의 쓰레드가 동시에 요청을 보내는 지
- Sampler : 유저가 해야하는 액션
- Listener : 처리 상황 및 결과를 데이터나 그래프로 노출
- Assertion : 응답 결과의 성공 여부를 판단하는 조건
2-2. Load Runner
HP에서 제공하는 성능 테스트 도구입니다.
부하 상태에서 응용 프로그램의 성능을 테스트하는 데 사용됩니다.
수천 명의 동시 사용자를 시뮬레이션하여 실시간로드 트랜잭션을 생성하고 결과를 분석 할 수 있습니다.
또한 총 50 개 이상의 프로토콜을 사용하여 웹, HTML, Java, SOAP 및 더 많은 애플리케이션을 테스트 할 수 있습니다.
2-3. nGrinder
nGrinder는 Naver에서 만든 오픈소스 부하 및 성능 테스트 도구입니다.
스크립트 생성, 테스트 실행, 모니터링 및 결과 보고서 생성기를 동시에 실행할 수 있습니다.
nGrinder의 구성 요소는 아래와 같습니다.
- Controller
- 성능 측정을 위한 웹 인터페이스를 제공
- 테스트 프로세스 조정 및 테스트 동계 수집, 표시
- 스크립트 수정 기능 제공
- Agent
- 에이전트 모드에서 실행할 때 대상 시스템에 부하를 주는 프로세스 및 스레드를 실행
- 모니터 모드에서 실행 시 대상 시스템 성능(CPU / 메모리) 모니터링
nGrinder의 특징은 아래와 같습니다.
- Jython or Groovy 스크립트를 사용하여 테스트 시나리오를 생성하고 여러 에이전트를 사용하여 JVM에서 부하를 생성합니다.
- 프로젝트 관리, 모니터링, 결과 관리 및 보고서 관리를 위한 웹 기반 인터페이스를 제공합니다.
- nGrinder 는 컨트롤러 및 에이전트로 구성된 분산 아키텍처로 수행됩니다.
- 부하를 생성하는 에이전트와 부하를 받는 머신의 상태를 모니터링 할 수 있습니다.
- 1억 명 이상의 사용자가 있는 거대한 시스템을 테스트하는 데 사용되는 입증된 솔루션입니다.
- 클라우드 환경에서도 실행 가능합니다.
2-4. Gatling
Gatling은 부하 테스트를 통해 웹 서버의 성능을 측정하는 오픈소스입니다.
웹 브라우저, REST API 등 HTTP 기반 서비스의 성능을 테스트 하기 위해 사용되고, 실제 서비스 환경과 유사하게 요청을 시물레이션하여 테스트할 수 있습니다.
Gatling을 이용하면 수많은 유저가 정해진 시나리오대로 동작하는 것처럼 시뮬레이션 할 수 있습니다.
3. 성능 테스트 용어 정리
성능테스트를 하다보면 익숙하지 않은 용어들이 등장하게 되는데요.
어떤 용어들이 사용되는지 알아보겠습니다.
- Concurrent Users (동시사용자) - 해당 시스템을 사용하기 위한 사용자로서, Active Users와 Inactive Users로 분류할 수 있습니다.
- Active Users는 Request를 수행한 후, 응답을 기다리고 있는 사용자입니다.
- Inactive Users는 Request를 수행하지 않고 대기중인 사용자입니다.
- Load (부하) - 사용자들이 테스트하고자 하는 시스템을 단위 시간당 몇 건으로 호출 하고 있는지에 대한 빈도
- Think Time (대기시간) - 사용자가 다음 요청을 전송하기 전까지의 시간
- Response Time (응답시간) - 사용자 요청을 처리하는데 소요되는 총 시간
- Request Interval (호출 간격) - 호출간격 = Response Time + Think Time6. Throughput (처리량) - 대상 웹 서버가 부하발생 클라이언트에게 송신한 데이타량
- Vuser (Virtual user) - 시스템에 부하를 주기 위한 가상 사용자
- Transaction (작업단위) - 하나의 작업이 시작하여 완료되는 시점을 하나의 트랜잭션으로 정의
- TPS (단위시간당 처리건수) - 단위 시간에 처리 가능한 트랜잭션의 수 (TPS = ConcurrentUser/Request Interval)
- Test Script - 시스템의 성능에 대해 확인하기 위해서 레코딩한 소스
- Test Scenario - 어떤 방식으로 시스템에 부하를 줄 것인지 정하는 방식
- 병목현상 - 부하가 많이 걸려 전체 시스템에 영향을 주는 현상
이렇게 백엔드 개발자라면 알 수 밖에 없는 성능 테스트에 대해 간략하게 살펴봤습니다.
다양한 도구들이 존재하고, 각각의 사용법은 천차만별이기 때문에 본인의 프로젝트 환경에 가장 적합한 도구를 선택한 후 직접 공부하고, 적용해보는 것을 권장합니다.
백문이 불여일타!
읽어주셔서 감사합니다 :)
References
성능테스트 / 부하테스트 / 스트레스 테스트
Apache JMeter란 무엇인가? (+ 사용 방법 with 성능 및 부하 테스트)
SW 성능 테스트 툴 Apache JMeter™ 활용
성능 테스트. nGrinder
[Gatling] Gatling 성능 부하 테스트