최근 JMeter를 사용하여 부하테스트를 진행하였다. 직접 JMeter 를 사용해보며 주의 해야할 점과 참고하면 좋을 만한 부분이 몇개 있어 공유하고자한다.
참고로 이 글은 JMeter 의 기본적인 사용방법을 설명하는 글은 아니다. 따라서 JMeter의 사용법을 전혀 모르시는 분이라면 구글링을 통해 사용법을 익히는 것을 추천한다. 아래에 처음 사용할때 읽어보면 좋은 링크를 첨부한다.
[Spring] JMeter 사용법 - JMeter란?, 테스트 방법
초보자도 따라할 수 있는 Apache JMeter 웹 성능 테스트 가이드
터미널을 사용하여 jmeter
명령어를 치면 GUI 툴이 실행된다. 하지만 jmeter 에서는 부하 테스트 용도로 GUI 사용을 권장하지 않는다. 위 사진 처럼 Don't use GUI mode for load testing !
문구가 표기된다. 따라서 GUI 는 테스트 시나리오를 작성하거나, 디버깅 할 때만 사용하도록 하자.
jmeter -n -t [jmx file] -l [results file]
/home/result/load_test.csv
JMeter 에서는 테스트 결과를 분석하기 쉽게 리포트 형식으로 만들어주는 기능이있다.
위와 같이 html 파일 형식으로 만들어주어 브라우저에서 쉽게 열어보고 확인할 수 있다. 대시보드에서는 평균 응답 시간, 최소 응답 시간, 최대 응답 시간, Throughput, Network, 에러 비율 등을 확인 할 수 있다.
또한 위 그래프들 처럼 꽤나 다양한 그래프를 제공 해주어 분석하는데 편하다.
이미 부하 테스트를 진행해 결과 csv 파일이 생성된 경우
jmeter -g [results file] -o [report folder]
부하 테스트와 동시에 리포트까지 생성하는 경우
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
부하 테스트를 진행하면서 시나리오의 특정 값을 계속 해서 바꾸어 실행한다면 GUI 를 열어 값을 바꾸는 것이 상당히 번거롭다. 예를 들어 스레드 수를 각 테스트 마다 바꾸어 사용하는 경우가 있을 수 있겠다. 이런 경우는 바뀌는 값을 스크립트 변수로 할당해두면 편하게 테스트를 할 수 있다.
Number of Threads 값을 스크립트 변수로 할당하는 방법을 예시로 설명한다.
${THREAD_COUNT}
로 설정한다.User Defined Variables 를 추가한다.
THREAD_COUNT
${__P(THREAD_COUNT, 10)}
(여기서 10은 기본값이다. CLI에서 전달된 값이 없을 경우 사용된다.)
jmeter -n -t [jmx file] -l [results file] -JTHREAD_COUNT=100
JMeter 에는 부하 정도를 조절 할 수 있는 3가지 변수가 있다. Number of Threads, Ramp-up period, Loop Count 이다.
이때 스레드 300, loop count 10 와 스레드 30, loop count 100 으로 설정 하면 어떤 차이가 있을까?
일단 두가지 경우 모두 요청은 300 * 10 = 3000, 30 * 100 = 3000 으로 총 3000개의 요청이 나가게 된다.
하지만 서버에 미치는 부하패턴에서 차이가 있다. 각각의 차이를 살펴보자.
300개의 스레드가 동시에 작동하므로, 특정 순간에 최대 300개의 요청이 한꺼번에 서버로 전송될 수 있다. 따라서 서버는 순간적으로 높은 동시성 부하를 처리하고, 트래픽이 짧은 시간에 몰리게 된다.
스레드 수가 30 이므로, 한 번에 동시에 보내는 요청 수는 30개로 제한된다. 따라서 30개의 스레드가 여러번 요청을 반복하므로, 서버에는 더 지속적이고 고르게 분포된 부하가 가해진다.
그래서 정리하자면 스레드 수가 많을수록 순간적인 동시성 부하고 높아지고, 스레드 수가 적을 수록 부하가 고르게 분포된다. 위 두가지 경우에 알맞은 경우를 예를 들자면 아래와 같다.
같은 요청이라도 다른 패턴이 만들어질 수 있으니 테스트 하고자하는 상황에 맞게 설정하는 것이 중요한것 같다.
끝으로 여러개의 부하테스트를 돌려야 된다면 sh 스크립트를 사용해서 자동화하는 것을 추천한다. 시간이 꽤나 걸리기 때문에 일일이 수동으로 테스트를 진행하면 낭비되는 시간이 많다.