Apache JMeter를 이용한 부하 테스트

박수민·2024년 4월 25일
1

Apache JMeter란?

Apache JMeter는 서버가 제공하는 성능 및 부하를 측정할 수 있는 테스트 도구이다. JMeter는 순수 Java 애플리케이션 오픈소스이며 서버나 네트워크 또는 개체에 대해 과부하를 시뮬레이션하여 강도를 테스트하거나 다양한 부하 유형에서 전체 성능을 분석하는 데 사용할 수 있다.

기술적 의사결정

최근에는 다양한 성능 테스트 도구들이 존재하지만, 주변에서 많이 들었던 JMeter, nGrinder라는 그래도 익숙한 도구에 초점을 맞추었습니다. 각 도구는 다양한 기능과 장점을 제공하지만. 그 중에서도 JMeter를 선택한 결정에 이유에 대해 먼저 말해드리려고합니다.

JMeter의 선택 이유
1. JMeter는 설치와 사용이 간단합니다. GUI 기반의 인터페이스는 사용자가 테스트 케이스를 쉽게 만들고 실행할 수 있게 해줍니다. 이는 특히 성능 테스트 분야에 처음 입문하는 사용자에게 큰 이점입니다.

  1. JMeter는 오랜 기간 동안 유지보수되어 온 프로젝트로, 여러 커뮤니티와 레퍼런스를 자랑합니다. 사용자는 문제 해결을 위해 다양한 경험을 공유하는 커뮤니티의 도움을 받을 수 있습니다.

  2. JMeter에서 생성되는 HTML 형식의 보고서를 통해 다양한 정보를 제공하여, 성능 테스트의 결과를 쉽게 해석하고 공유할 수 있게 해줍니다.

JMeter 사용방법

먼저 Apache JMeter를 설치해야 한다. (앞서 언급했듯 JMeter는 순수 자바 애플리케이션이다. Java 8 문법을 내부적으로 사용하기 때문에 자바 8 버전 이상이 설치되어 있어야한다.)

공식 홈페이지에서 zip 파일을 다운 후 .zip 압축을 풀면 bin 폴더에 jmeter.sh 파일과 jmeter.bat 파일이 있습니다.
맥에선 .sh파일로, 윈도우에선 .bat파일을 실행하면 됩니다.
(brew를 사용하신다면 brew install jmeter 를 사용할 수 있습니다. 실행 -> jmeter)

JMeter의 구성요소

Jmeter의 구성요소를 간단히 알아보겠습니다!

Thread Group: 몇 개의 쓰레드가 동시에 요청을 보내는 지

Sampler: 어떤 유저가 해야 하는 요청

Logic Controller : 테스트 계획의 실행 흐름을 제어

Listener: 응답을 받았을 때 어떤 동작을 취하는 지 (검증, 리포트, 그래프 그리기 등)

Configuration: Sampler 또는 Listener가 사용할 설정 값 (쿠키, JDBC 커넥션 등)

테스트 환경에 사용되는 주요한 요소들에 대해서만 알아봤습니다.
앞서 언급한 Thread Group, Samples, Logic Controllers, Listeners, Congiruation Elements 등을
모두 JMeter 내에선 Element라고 부릅니다.

이제 대략적인 구성요소까지 알아봤으니, 실제 테스트를 구성하고 실행해보겠습니다.

테스트 만들기

  • 테스트 계획 우클릭 -> 추가 -> 쓰레드들 -> 쓰레드 그룹을 선택하여 쓰레드 그룹을 생성합니다.

  • 쓰레드 그룹 우클릭 -> 추가 -> 표본추출기(Sampler) -> HTTP 요청을 선택하여 샘플러를 하나 생성합니다.

현재 개발중인 프로젝트의 API를 호출해보겠습니다.
GET http://localhost:8080/products 요청은 최신 물건 10개를 조회하는 엔드포인트입니다.

(여기서는 localhost로 되어있지만 저는 ec2 인스턴스를 빌려 사용했기때문에 퍼블릭 IPv4 DNS의 주소를 서버이름쪽에 넣어주시고 사용하는 포트를 입력하시면 됩니다.)
이미지처럼 서버이름, 포트등 입력해주면 GET, POST등 여러 요청을 보낼 준비를 할 수 있습니다.

앞서 생성했던 쓰레드 그룹을 클릭해서 설정해줍니다.
쓰레드들의 수는 가상 사용자를 몇 명으로 설정할지를 의미합니다.
Ramp-up 시간은 쓰레드 수들을 얼마 시간 동안 테스트할지에 대한 설정입니다.
가령 쓰레드 수에 100, Ramp-up에 10을 입력하면 1초에 10번씩 요청이 전송됩니다.
부하 테스트 목적이므로 저는 1로 그대로 두겠습니다.
자세한 내용은 공식 문서를 참고하시면 도움이 될 것 같습니다.
루프 카운트는 사용자들이 몇번 요청할지 설정합니다.
(예를들어 쓰레드 100, 루프 카운트 10이면, 100명이 10번씩 요청해서 총 1000번의 요청이 전송됩니다.)
무한을 체크하면 중단할 때까지 전송됩니다.

여기까지해서 간단한 테스트 환경 설정이 완료되었습니다!

리스너 만들기

쓰레드 그룹 우클릭 -> 추가 -> 리스너 -> 결과들의 트리 보기, 요약 보고서

실행하고 나면 위 예시처럼 결과가 나오는걸 확인할 수 있습니다.

브라우저 개발자 도구의 네트워크 탭을 본다고 생각하시면 될 것 같습니다.
개별 요청에 대한 요청, 응답 정보를 확인할 수 있습니다.
응답 body까지 확인할 수 있습니다.

  • 캐싱처리 전

  • 캐싱처리 후

저는 위와 같은 30만건의 조회를 300명의 유저가 300번 루프를 돌았을때의 정도로 부하를 줘 테스트를 진행해서 얻은 결과입니다.
이런식으로 값의 비교도 할 수 있고 서버의 임계치를 찾는 용도로도 사용가능합니다. 테스트를 진행할때는 자신이 확인해보고자 하는 API를 정하고 적절한 수치를 찾아가는 과정이 중요합니다.
또한 중간중간 서버의 상태를 확인해주면서 진행해야 오차 및 편차를 줄일 수 있습니다.

0개의 댓글