이전 포스트(https://leeeeeyeon-dev.tistory.com/28)에서 nGrinder를 설치만 하고 ... JDK 18 이슈로 사용하지 못하였다 ... ㅠ
이번 포스트에서는 jMeter를 설치하고 사용까지 해보자 !!!
jMeter에 대해서
jMeter는 Java 기반 오픈소스 소프트웨어로, 웹 응용 프로그램 테스트용으로 설계되었지만 이후 다른 테스트 기능으로도 확장되었다.
jMeter에서는 아래와 같이 다양한 애플리케이션/서버/프로토콜 유형 로드 및 성능 테스트가 가능하다
- Web - HTTP, HTTPS
- SOAP / REST Webservices
- FTP / LDAP / TCP
- Database via JDBC
- Message-oriented middleware(MOM) via JMS
- Mail - SMTP, POP3, IMAP
- Native commands or shell scripts
- Java Objects
설치 및 GUI 실행
brew instrall jmeter
open /opt/homebrew/bin/jmeter
Homebrew를 사용하여 설치를 진행해주었고, open 명령어를 치면 아래와 같이 GUI가 실행된다.
jMeter의 구조
jMeter를 본격적으로 사용하기 전에 jMeter의 구조에 대해 알아보자.
- Test Plan - jMeter가 수행할 일련의 테스트 단계를 모아둔 것
- Thread Group - 요청 시 한번에 사용될 Thread 개수를 지정 및 생성한다
- Sampler - 지정된 요청수만큼 요청을 한다 (유저가 취하는 액션)
- Listener - Sampler의 요청 결과를 돌려받아 특정 형태로 출력한다 (응답을 받은 유저가 취하는 동작 - 검증, 리포트, 그래프 그리기 등 ...)
테스트 생성하기
설치 및 GUI 실행에서 본 것처럼 GUI가 들어가면 Test Plan이 존재한다. 이제 이 아래에 위 구조처럼 Thread Group, Sampler, Listener를 만들어주어야 한다.
만드는 순서는 계층 구조와 동일하다. (Thread Group > Sampler > Listener)
Thread Group
Test Plan을 선택하고 우클릭을 한 뒤, Add > Threads > Thread Group을 클릭한다.
- Number of Threads가 2면, 2명이 테스트를 한다는 의미이다.
- Ramp-up period를 통해 점진적 부하를 주는 것이 가능하다.
- Loop count는 테스트 반복 횟수로, 사용자가 요청한 횟수라고 생각하면 쉽다.
Sampler
Sampler을 만들 때는 Thread Group을 선택하고 우클릭을 해주어야 한다. Spring boot 웹 서버에 대하여 부하 테스트를 진행할 것이므로 HTTP Request를 선택해주자.
나는 간단한 health check API로 테스트를 해볼 것이다.
각 항목의 이름과 예시 사진이 있으면 무엇이 무엇을 의미하는지 파악이 되기 때문에 자세한 설명을 생략한다. 만약 파라미터나 Body가 필요하다면 추가하는 것도 가능하다.
Listener
- View Result Tree - Thread의 모든 테스트에 대한 결과와 함께 요청과 응답의 세부 사항을 보여줌
- Summary Report - 모든 테스트 결과를 종합해서 통계 데이터를 한 눈에 알아볼 수 있음
- Thread의 모든 테스트 결과를 시간 별로 그래프로 시각화
나는 Summary Report를 선택해주었다. 이제 필요한 것들이 모두 만들어졌으니 재생 아이콘을 눌러 부하 테스트를 진행시킨다.
- Samples - (Number of Threads) * (Loop count)
- Average - 평균 응답 시간 (ms)
- Min -최소 응답 시간 (ms)
- Max - 최대 응답 시간 (ms)
- Std Dev. - 표준편차
- 작을수록 요청에 대한 응답 시간이 일정하고 안정적이다
- Error - Error율
- Throughput - 처리량 (초당 처리 건수)
- KB/sec - 처리량 (초당 처리 KB)
테스트 실행 및 보고서 제작
테스트를 실행하는 것은 위에서 했던 것처럼 GUI 내에서 진행해도 된다. 하지만 부하를 크게 준다면 nGrinder에서 경고했던 것처럼 컴퓨터가 뻗을 수도 있다.
(GUI 환경을 사용할 때 메모리 사용량이 더 크다)
그렇기 때문에 공식 홈페이지에서도 GUI는 테스트 세팅용으로 사용하고, CLI 모드로 부하 테스트를 진행할 것을 권하고 있다.
CLI 모드로 테스트 실행은 jMeter 파일(.jmx)이 있는 디렉토리에서 아래 명령어를 사용하면 테스트가 실행되고, 테스트 결과를 CSV로 반환한다.
jmeter -n -t "{jmx 파일}" -l "{csv 파일}"
# ex) jmeter -n -t "/Users/leeeeeyeon/Desktop/soma_sample_test.jmx" -l "/Users/leeeeeyeon/Desktop/soma_sample_test_cli_result.csv"
아래 명령어를 사용하면 CSV 파일로 된 테스트 결과를 HTML 파일로 된 보고서로도 제작해준다.
jmeter -g "{csv 파일}" -o "{보고서를 저장할 디렉토리}"
# ex) jmeter -g "/Users/leeeeeyeon/Desktop/jmeter/soma_sample_test_cli_result.csv" -o "/Users/leeeeeyeon/Desktop/jmeter/html"
보고서를 저장한 디렉토리로 들어가서 index.html을 들어가면 보고서를 확인할 수 있다.
대시보드에 있는 정보 외에도 다양한 지표를 제공하고 있다.
리소스 사용 줄이기
노트북 로컬 환경에서 부하 테스트를 돌릴 때는 노트북이 뻗지 않도록 조심해야 한다. CLI 모드 사용하기 외에도 아래와 같은 사항들을 통해 리소스 사용량을 줄일 수 있다.
- Load 테스트 동안 "View Result Tree" 비활성화하기
- View Result Tree는 많은 메모리를 소모한다.
- 모든 jMeter 그래프 결과를 비활성화 시키기
- CSV 테스트 결과 포맷 활용하기
- 필요한 결과만 저장하기
- 자세한 테스트 결과를 저장하기 위해서는 오랜 시간이 걸릴 수 있다.
OutOfMemory Exception이 발생한다면 ...?
jmeter.bat 파일 내에서 시작(-Xms) / 최대(-Xmx) 메모리 사이즈를 증가시켜 주면 된다.
👍 Reference
- SWM 멘토링
- https://multicore-it.com/67
- https://galid1.tistory.com/374
- https://jaehoney.tistory.com/224
- https://blog.naver.com/fromyongsik/40170865815'
- https://like-tomato.tistory.com/299