상세 컨텐츠

본문 제목

JMeter 를 이용한 성능 테스트

프로그래밍/시스템, 서버구축

by 라제폰 2020. 6. 10. 11:22

본문

* 원본 : https://hibrainapps.tistory.com/137

 

JMeter 를 이용한 성능 테스트

JMeter 는 서버의 성능을 테스트 할 수 있는 서버성능테스트 Tool 이다. 현재 최신버전(2013년 10월 최신 V2.10)은 웹프로그램뿐 아니라 FTP 서버에 대한 테스트까지 가능하다. 웹프로그램을 작성한 후 �

hibrainapps.tistory.com

 

JMeter 는 서버의 성능을 테스트 할 수 있는 서버성능테스트 Tool 이다.

현재 최신버전(2013년 10월 최신 V2.10)은 웹프로그램뿐 아니라 FTP 서버에 대한 테스트까지 가능하다.

 

웹프로그램을 작성한 후 동시접속자수가 얼마까지 가능한지 테스트하고, 성능에 대한 튜닝작업이 필요한 경우가 많다. 이럴 경우 수십명의 동료들을 동원하여 동시에 클릭하여 테스트를 진행하기도 하지만, 테스트가 단시간에 끝나는 것도 아니고, 환경설정 정보를 수정후 다시 작업을 진행하기에는 쉬운일이 아니다. 

이러한 작업을 쉽게 1인이 1대 혹은 다수의 pc에서 테스트를 진행 할 수 있는 성능테스트 툴 중 하나가 Apache 에서 만든 JMeter 라는 툴이 잇다.

 

-. 다운로드

http://jmeter.apache.org/download_jmeter.cgi 에서 다운로드 후 압축을 풀고 사용하면 된다.

http://code.google.com/p/jmeter-plugins/downloads/list  기본 plugin 이외  추가 plugin 을 설치하면 그래프와 몇가지 기능이 추가된다.

 

-. 실행

JMeter 의 압축해제된 폴더의 bin/jmeter.bat 를 실행하면 된다.(리눅스, 맥인 경우는 jmeter.sh를 실행한다.)

 

 

*. 기본 테스트

- JMeter 를 실행 후 http 를 통한 동시 접속에 대한 테스트를 진행해 본다.

- JMeter 의 기본 실행 화면은 아래와 같다.

 

 

- 실행하면 기본적으로 "Test Plan"과 "WorkBench" 가 왼쪽에 보인다.

 

1. 기본 Thread Group 을 생성한다.

-. Test Plan에서 마우스 우 클릭하여 "Add" > "Threads(Users)" >"Thread Group" 을 선택하여 추가한다.

 

 

 

*. "Action to be taken after a Sampler error" 은 실행 중 에러 발생시 어떻게 처리할 것인지에 대한 선택이다.

*. "Thread Properties" 에서의 

- "Number of Threads(users)" 는 한번에 몇개의 쓰레드를 생성할것인지, 즉 동시에 몇명의 가상 사용자로 테스트할것인지에 대한 설정값이다.  일반적으로 이 값이 커질수록 서버에 대한 부하는 커지게 된다.

- "Ramp-up Period(in seconds)" 는 한번의 실행을 한후 몇 초 후 다시 실행할것인지에 대한 설정값이고,

-  "Loop Count" 는 반복횟수 이다. 즉 "Number of Thread :5, Ramp-up Period:3, Loop Count:10" 이면 0.6(3/5)초 간격으로 5개의 스레드가 기동되고 10번을 반복 실행하라는 의미가 된다.(아래에 댓글을 달아주신 분 덕분에 오류를 수정하였습니다. 5명(thread)이 3초간격으로 10회 반복이 아니라 3초내에 5개의 Thread를 실행하고 10회반복하라는 의미로 변경합니다.)  

 참고로 schedule 를 선택하면 예약 실행도 가능하다.

 

2. 무엇을 반복하여 실행할것인지 설정하는 과정이 필요하다.

1). 여기서 사용할 예제는 출석부서버로 과목 정보를 조회하는 URL 을 호출 하도록 하겠다.

-. URL : /subject/{:subject_id}

-. method : GET

-. accessKey, serviceType 값은 Header 로 전송

-. Return Type : JSON

 

2) HTTP 로 요청 테스트 하기에 Thread Group 하위에 HTTP Request Default 를 추가한다.

 

 

-. 서버의 IP 또는 Domain 주소를 등록한다('http://classmate.brainoffcie.co.kr', 포트번호)

-. Domain 주소 하위의 경로는 path 에 등록한다.('/subjects/1')

 

3)  HTTP Request Default 아래에 HTTP Request 를 추가한다

- HTTP Request 는 HTTP Request Default 의 정보를 상속 받아 사용 가능하다(HTTP Request Default 에서 Server Name 을 등록하였으면 HTTP Request에서 추가로 Server Name 정보는 등록하지 않아도 된다.

- Method 는 GET을 선택한다.

- 전송할 Parameter 가 존재할 경우 Parameters 탭 하위의 Add를 선택하고 Name, Value 를 등록하면 된다. 고정된 값이 아닌 변수를 사용하고자 하는 경우는 ${parameterName} 형식으로 사용하고, 해당 변수의 정보는 'Config Element' 에서 선택하여 등록 후 사용 가능하다(CSV,사용자 지정파일... ) 자세한 사용예제는 뒷 부분에 추가하도록 한다.

 

4) 해당 URL 로 요청시 헤더에 정보를 추가로 전송하여야 한다.

-. HTTP Request 하위에 HTTP Header Manager 를 등록한다.

 

 

-. header value1, header value2 값을 등록한다.(value 는 마찬가지로 변수 사용 가능하며, 해당 정보가 등록된 노드를 추가하여 사용 가능하다)

 

 

5) 전송결과를 모니터링할 노드를 추가한다.

 

-. 여러가지 모니터링할 수 있는 기능 중 그래프, 전송 결과를 TEXT로 출력 할수 있는 기능등이 있다.

-. Spline Visualizer 을 이용하면 반응속도에 대한 결과를 그래프로 나타낸다. 

-. 한번에 여러개의 모니터링 노드를 등록하여 여러가지 형태의 결과를 보는 것도 가능하다.

 

6) 테스트 할 수 있는 기본 설정이 완료 되었으며,Crtl+R 또는 상단의 "Start" 버튼 을 클릭하여 테스트를 실행한다.

-. 실행결과는 실시간으로 모니터링 항목에 아래와 같이 출력된다.

-. Spline Visualizer 의 결과는 그래프 형태로 시간의 흐름에 따른 Response Time 의 변화를 나타낸다.

 

 

-. Summart Report 는 요청횟수, 응답시간에 대한 평균, 최소, 최대, 에러율 등에 대한 값을 나타낸다.

-. Throughput 는 초당 처리가능한 요청의 횟수를 나탄낸다.

 

-. View Result Tree 는 각 요청에 대한 요청 Data, 응답 Data, Header 값, 결과값 을 "Sampler Result, Request, Response data" 의 탭에서 나타낸다.

 

     - 플러그인을 이용하여 Response Time Over Time 리스너를 추가하면 보다 의미 있는 결과를 볼 수 있다.

 아래의 그래프를 보면 테스트 초기(9초 이전)에 반응시간이 일부 오래 걸렸으나 이후 부분은 안정적으로 진행되는 것을 볼 수 있다.

 하지만 가끔 테스트 중간 그래프가 튀는 구간이 있으면 그 구간은 응답시간이 오래 걸린다는 것을 의미한다.

 

- 동시 접속자수에 따른 전송데이터량을 보려면 Transaction Troughput vs Thread 챠트를 추가한다.

 

 

 

- 동시접속자수에 따른 반응 시간의 변화는 Response Times vs Threads 를 이용하면된다.

 

 

3. 변수를 사용하여 각 Request 마다 다른 정보를 요청

1) 여러사용자가 모두 동일한 정보를 요청하는 것이 아닌 각 Thread(User)마다 각각의 Request 마다 다른 정보를 요청하도록 설정해 보도록 한다.

2) HTTP Request 노드에서 Path 정보에 변수를 사용하기 위해서 "/subjects/36" =>"/subjects/${subject_id}" 로 변경한다,

3) ${subject_id}에 대한 값을 지정해 주어야 하는데 사용자 지정 변수를 사용하기 위해서는 "Config Element"내의 "User Defined Variables" 를 추가하여 name에 "subject_id", value에 "36" 과 같이 지정하면되며, 요청시마다 다른 값을 사용할 경우에는 "CSV Data Set Config" 를 이용한다.

"CSV Data Set Config" 를 이용하기 위해서는 ","  또는 "탭" 으로 각각의 데이터가 구분된  CSV형태로 된 파일이 필요하며, 해당 정보를 등록하면 된다.

 

* 현재 JMeter 를 이용하여 클래스메이트의 로그인 기능에 대한 부하 테스트를 실행 해 보았다.

 

최초 부하 테스트를 실행하였을때에는 반응 시간도 비교적 많이 소요 되었고, 예상된 결과가 아닌 에러가 많이 발생하였었다.(초기 결과에 대한 화면을 캡쳐하지 않아 비교하지는 못한게 아쉽다) 그러나 그러한 원인을 찾고 서버측 소스에 대한 리팩토링 과정을 거치면서 100명의 동시접속에 의한 약 8000번의 접속 요청 중 1.24%의 에러율이 나타났다. (10명의 동시접속에 의한 8000번의 요청시에는 에러율응 0.08%)

 

* 위와 같은 방식으로 출석체크에 대한 부하 테스트를 진행해 보겠다.

1. Thread Group 하위에 출석체크를 위한 "HTTP Request" 를 하나더 추가한다.(Thread Goup > Add > Sampler > HTTP Request 선택)

- 출석체크시 요청할 URL 을 Path에 등록하고 함께 전송된 Parameter가 있을 경우 Parameter 에 변수명과 값을 등록한다. 등록된 값이 변수(변하는 수)인 경우 ${} 를 이용하여 요청시마다 다른 값을 전송할 수 있다. 이 때 사용되는 변수는 CSV Data Set Config 에서 등록한 CSV 파일을 이용할 수 있다.(CSV 파일 이용은 아래에 다시 설명)

2. 출석체크시 Header로 전송해야할 Data가 있기에 "HTTP Header Manager" 를 추가한다(HTTP Request > Add > Config Element > HTTP Head Manager  선택)

 

 

- Header로 전송한 값을 입력한다. header 로 전송될 Name와 Value 를 입력하는데 Value에는 상수와 변수도 사용 가능하다(변수 사용시에는 ${send_value} 와 같이 "${}" 를 이용하면 된다. 

3. 출석체크에서 사용할 변수에 대한 정의를 하기 위하여 "User Defined Variable" 를 추가한다.(Add > Config Element >  User Defined Variable)

 

- 출석체크에서 전송할 subject_id 값에 변수를 사용하기 위하여 마찬가지로 ${} 를 이용하여 등록한다.

 

4. 위의 과정에서 등록한 변수에 대한 값이 저장되어 있는 CSV 파일을 등록하여야 한다. "CSV Data Set Config"를 추가한다.(Add > Config Element >  CSV Data Set Config)

 

- FileName에는 JMeter 가 실행되는 bin 폴더를 기준으로 CSV 파일이 저장된 상대경로를 입력하면 된다.

- Variable Names 에는 CSV파일에서 ","/"tab" 으로 구분되어 저장되어 있는 값에 대한 변수명을 입력한다.(ex:check_key,menu_name,class_name)

- Delimiter :  tab으로 구분된 CSV 파일인 경우 "\t", ","로 구분된 경우 ","와 같이 구분자를 입력한다.

 

5. 기본 설정이 되었으므로 출석체크를 실행하기 전에 현재 등록된 "로그인"테스트에 대하여 비활성화를 한다("로그인"에서 마우스 우클릭 "Disable" 선택)

- 테스트 실행시 비활성화된 항목을 실행하지 않고 활성화된 항목만 진행된다.

- 기존에 테스트 된 결과를 지우고자 하는 경우 상단에 있는 빗자루 버튼(Clear/Clear All) 을 클릭하여 초기화 할 수 있다.

 

6. 테스트 실행 결과는 아래 그림과 같다.(동시 접속자 수 100명으로 8000회 호출시)

- 100명의 동시접속자수로 8000회를 호출한 결과 반응시간은 최소 48ms, 최대 9763ms, 평균, 2415ms, 에러율 1.22% 인것으로 나온다.

 

- 시간 경과에 따른 반응시간은 초기 접속시 비교적 많은 시간이 소요되었으나,  이 후의 과정에서는 비교적 짧은 반응시간을 보인다.

 

 

- 동시접속자수에 따른 전송 데이터량의 결과는 아래와 같다.

 

- 동시접속자수에 따른 반응시간에 대한 결과 그래프이다.

 

 

이상으로 JMeter 를 사용하기 위한 가장 기본적인 방법, 서버측으로 동시 요청횟수, 반복횟수등을 지정하여 특정 URL 로 요청을 하고, 각 요청시마다 다른 변수를 사용할수 있는 방법과 각 요청에 대한 결과를 모니터링하는 방식을 정리하였다. 

두가지(로그인, 출석체크)를 통한 테스트 결과 

- 각각의 테스트가 동시접속자수 100명을 기준으로 8000회를 호출했을때 기준으로 테스트를 진행하였다.

- 테스트가 서버 튜닝(아파치, DB)이 아닌 1차적으로 소스 리팩토링을 통한 확인을 하였고, 보다 빠른 반응시간을 위하여 서버 튜닝의 과정이 필수 인것으로 파악된다.



출처: https://hibrainapps.tistory.com/137 [하이브레인넷 부설연구소]

관련글 더보기