2012년 11월 28일

jMeter 을 이용한 웹 프로그램 부하 데스트


1. 소개

JMeter는 다른 아파치 재단의 프로젝트들과 같이 공개소프트웨어이며 100% 자바기반의 성능 테스트 도구이다. 설치하는 것도 아주 간단해서 http://jmeter.apache.org/ 에서 설치파일을 다운로드하고 설치할 경로에 압축을 푸는 것만으로 설치가 끝난다. 프로그램 실행은 "bin/jmeter.bat" 파일을 더블클릭하면 된다.

그림-1. Apache JMeter 메인화면

2. 확장

널리 알려진 JMeter Plugins 을 사용하면 JMeter 에서 제공하지 않고 있는 다양한 기능들을 사용할 수 있다. 플러그인 설치는 http://code.google.com/p/jmeter-plugins/downloads/list 에서 최신 버전의 패키지를 다운로드하고 압축파일에 포함된 JMeterPlugins.jar 를 JMeter 설치 위치의 ${JMETER_HOME}/lib/ext 에 복사한다.

JMeter 는 디폴트로 드레드 카운터를 JTL 파일들에 저장하고 있지 않는다. JMeter JTL 파일을 사용할 계획이라면 아래와 같이 ${JMETER_HOME}/bin/jmeter.properties 파일을 수정하여야 한다. (아직 이해가 오지 않고 있음. )


변경전 
#jmeter.save.saveservice.thread_counts=false

변경후 
jmeter.save.saveservice.thread_counts=true
이제 JMeter  을 다시 시작한다. JMeter Plugins 에서 제공하는 기능들은 이름이 모두 jp@gc 로 시작되기 때문에 쉽게 구분이 가능하다. 


그림-2. JMeter Plugins

JMeter 에서 파일로 저장하기 기능을 사용할 계획이라면 각 플러그인 모듈에서 Configure 버튼을 클릭하고 Save Active Thread Counts 항목을 채크하고 저장한다. 
그림-3. JMeter Plugins 기능들의 Configure 화면
JMeter 을 사용하다 보면 OutOfMemoryException 이 발생하는 경우가 있는데, 이경우 $JMETER_HOME/bin/jmeter.bat 파일에서  HEAP 와 NEW 값을 아래와 같이 변경한다.

set HEAP=-Xms512m -Xmx1024m
set NEW=-XX:NewSize=256m -XX:MaxNewSize=256m

3. 부하 테스트

부하테스트는 JMeter 에서 제공하는 기본 ThreadGroup 가 아닌 JMeter Plugins 에서 제공하는 Stepping Thread Group (이하 Thread Group) 을 사용하여 단계적으로 부하를 더 많이 줄수 있도록 하였다. 여기에서 Thread 는 사용자를 의미한다. 

세로운 Test Plan 을 생성하고 아래 그림과 같이 Add > Threads(User) >jp@gc - Stepping Thread Group 을 추가한다. 

그림-4. Stepping Thread Group 추가
Stepping Thread Group 설정에서 값을 조정하여 어떻게 부하를 줄 것인가를 설정한다. 그례프를 보면 이해가 더 쉽다. 문서에서는 5초 간격으로 5명 사용자를 생성하며 최대 100 명 까지 생성한다. 이상태를 500 초동안 유지하다가 15초 간격으로 5 명씩 사용자를 제거하도록 하였다. 

그림-5. Stepping Thread Group 설정

이제 실재 HTTP 요청을 다음과 같이 실행하도록 설정한다. 
  1. 로그인 (여러 사용자로 로그인 처리를 수행하기 위하여 CSV 파일을 사용한다.)
  2. 특정 페이지 조회 
직접 HTTP Request 을 설정하지 않고  HTTP Proxy Server 를 사용하여 로컬 브라우저에서  접속하는 페이지들을 녹화하여 사용할 수 도 있다. 본 문서에서는 사용하지 않았다. 

HTTP 페이지 호출은 아래 그림-6과 같이 좌측 트리에서 jp@gc - Stepping Thread Group 을 선택하고 Add > Sampler > HTTP Request 을 클릭하여 추가한다.

그림-6. HTTP Request 추가
 이제 어떻게 해당 URL 을 호출할 것인가를 지정한다. 여기에서는 POST 방식으로 username, password 파라메터 값을 전달하도록 하였다.

그림-7. HTTP Request 설정

그림-7에서 값을 표시할 때 ${username} 형식으로 설정한 것은 CSV 파일에서 데이터를 읽어 사용하기위서이다. CSV 파일 데이터는 그림-8과 같이 CSV Data Set Config 를 추가하여 정의할 수 있다. (CSV Data Set Config 는 로그인 HTTP Request 와 동일한 레벨에 위치하여야 한다.)

그림-8. CSV Data Set Config 추가
여기에서는 CSV 파일은 엑셀데이터를 CSV 파일로 변환하고 헤더데이터만을 제거하여 사용하였다. 설정은 아주 간단하며 읽어들일 파일이름과 내부적으로 사용할 데이터 이름을 지정하면 된다. 이름을 앞의 HTTP Request 설정에서 파라메터 값으로 설정하면 된다.

그림-9. CSV Data Set Config 설정
이제 Thread Group 에 HTTP Cookie Manager 을 추가하여 로그인 이후 일정동안 세션이 유지될 수 있도한다. HTTP Request 는 순차적으로 발생되기 때문에 로그인 이후에 인증이 필요한 페이지 요청을 설정하여 사용하는 경우에 필수 적이다.

그림-10. HTTP Cookie Manager 추가


이제 마지막으로 부하테스트 결과를 다양한 그래프로 볼 수 있도록 Thread Group 에 필요한 Listener 를 추가한다. 추가는 좌측 트리에서 Thread Group 를 선택하고 그림-11 과 같이 추가하면 된다.

그림-11. 결과 리포팅을 위한 Listener 추가
부하 테스트 결과는  문서에서는  그림-12 과 같이 다양한 결과 뷰를 추가하였다. 기본적으로 차트 결과는 기본으로 제공되는 Graph Results 는 보기가 어렵기 때문에 JMeter Plugins 에서 제공하는 다양한 그래프를 사용하는 것이 더 도움이 될 것 같다.


그림-12. 결과 리포팅 Listener


부하테스트는 Run 메뉴를 사용하거나 아래와 같이 실행 아이콘을 클릭하면 된다.

그림-13. 테스트 실행 메뉴


4. 부하 테스트 결과 

4.1 View Results Tree 

테스트된 결과들에 대한 상세 정보를 볼 수 있다. 여기에서는 실제 테스트 계획을 수행하기 이전에 등록된 HTTP Request 가 올바르게 동작하는가를 확인하는데 유용하게 사용되었다. 



4.2 Summary Report

테스트된 결과들에 대한 요약 정보를 보여준다. 

그림-15. Summary Report 

4.3 jp@gc - Response Times Over Time

테스트 시간에 따른 응답 시간을 그래프로 보여준다. 문서에서는 5초 간격으로 5명 사용자를 생성하며 최대 100 명 까지 생성한다. 이상태를 500 초동안 유지하다가 15초 간격으로 5 명씩 사용자를 제거하도록 하였다. 

그림-16. Response Times Over Time
4.4 jp@gc - Response Times vs Threads 

사용자 변화에 따른 응답 속도 

그림-17. Response Times vs Threads

4.5 jp@gc - Transaction Throughput vs Threads

사용자 변화에 따른 초당 처리 건수


그림-18. Transaction Throughput vs Threads
4.6 jp@gc - Composite Graph

여러 결과 그래프를 함께 보여준다. 문서에서는 다음 결과 그래프들을 함께 보여주도록 설정하였다.
  • jp@gc - Active Threads Over Time
  • jp@gc - Response Times Over Time
  • jp@gc - Transactions per Second 

그림-19. Composite Graph

5. 리모트 

JMeter 의 remote 기능을 사용하여 여러 시스템을 사용하여 부하테스트를 수행할 수 있다.
이를 위하여 다음과 같은 사항을 점검하여야 한다. 

  • 부하 테스트를 실행할 모든 클라인언트 장비들의 방화벽을 OFF 한다.
  • 부하 테스트를 실행할 모든 클라인언트 장비들은 동일한 서브넷이여야 한다.
  • 부하 테스트를 실행할 모든 클라인언트 장비에서 부하 테스트 대상 서버에 접근이 가능하여야 한다. 
  • 부하 테스트를 실행할 모든 클라인언트 장비에 동일 JMeter 버전이 실행되어야 한다.
앞에서 사용되었던 JMeter 프로그램 폴더를 압축하여 부하 테스트를 실행할 원격 클라인언트 장비에 설치한다. 설치는 압축을 푸는것으로 충분하다.

이제 각 클라인언트 장비에서 ${JMETER_HOME}/bin/jmeter-server.bat 을 더블 클릭하여 프로그램을 실행한다. 

JMeter GUI 가 실행되는 장비에서  ${JMETER_HOME}/bin/jmeter.properteis 파일을 수정하여 원격 클라이언트 장비 IP 을 설정한다. remote_hosts 값에 IP 를 적어주면 된다. 

remote_hosts=112.136.181.44,112.136.181.45,112.136.181.46

설정이 완료되면 JMeter 을 실행한다. Run 메뉴의 Remote Start 에서 특정 IP 을 선택하면 
해당 IP 의 리모트 JMeter 을 통하여 테스트가 실행된다. Remote Start All 을 클릭하면 등록된 모든 리모트 JMeter 을 통하여 부하테스트가 진행된다.






댓글 없음:

댓글 쓰기