본문 바로가기
개발/Apache JMeter

Apache JMeter로 성능 테스트하기

by 꼼냥냥 2023. 11. 15.
728x90

안녕하세요. 이번 포스팅에서는 성능 테스트가 무엇인지 알아보고, 성능 테스트 도구인 Apache JMeter를 이용해 테스트 방법을 소개하려고 합니다. Apache JMeter의 설치방법부터 스크립트 작성 안내 그리고 결과 확인까지 상세히 설명해 드리니 잘 따라와 주세요!


●성능 테스트란 무엇일까요?

‘성능 테스트’란 서비스 및 서비스 시스템의 성능을 확인하기 위해 실제 사용 환경과 비슷한 환경에서 테스트를 진행하는 것을 말합니다. 성능 테스트를 통하여 응답시간(Response Time), 처리량(Throughput), 병목 구간 등을 확인할 수 있고, 성능 테스트로 얻은 정보로 서비스나 시스템의 문제점을 확인하고 이를 개선(Tuning)하여 보완할 수 있습니다. *출처 : Apache JMeter 오픈소스로 대용량 웹 서비스 성능 테스트하기

●성능 테스트는 왜 해야 할까?

2019년 열린 ‘MSC 2019’ 행사에서 발표된 내용 중 “디지털 마케팅 시대, 웹에서 속도가 고객 경험을 결정한다. 마케터들의 핵심성과평가(KPI) 개선에는 고객 경험이 중요하고 이는 웹 속도가 좌우한다.” 라는 내용이 있었습니다. "49%의 고객이 2초 이하의 로딩 속도를 기대하고, 18%의 고객은 1초도 지체 없는 로딩 속도를 기대한다는 2년 전 자료가 있다"라며 "로딩 속도 1초가 빨라지면 아마존 판매량이 1% 증가하고 구글 검색량 0.2% 증가, 월마트의 전환율이 2% 증가 한다"고 설명했습니다.

덧붙여 "아마존 판매량을 환산하면 68억 달러, 구글의 검색량 증가로 4억 5천만 달러의 광고 노출, 월마트의 2억 4천400만 달러의 매출이 늘어나는 셈"이라고 강조했습니다. 그만큼 웹 서비스의 응답 시간, 즉 성능이 중요하다는 거겠죠?

또, 쉽게 주변에서 일어나는 상황을 예로 들어보면 대학 수강 신청, 인기 있는 아이돌의 콘서트 예매, 프로야구 한국시리즈 예매 등 순간적으로 동시 접속자들이 늘어날 때 예매 사이트 서버가 다운되는 경우들을 많이 볼 수 있습니다.

성능 테스트는 서비스 및 서비스 시스템이 작업 부하 상태에서 제대로 작동하는지 확인하는 일종의 소프트웨어 테스트입니다. 성능 테스트의 목적은 버그를 찾는 것이 아니라 성능 병목 현상을 제거하는 것입니다.

성능 테스트는 서비스 및 서비스 시스템의 속도, 확장성 및 안정성에 대한 정보를 이해 관계자에게 제공 해당 제품이 시장에 출시되기 전에 필요한 개선이 필요하다는 것을 보여줍니다. 성능 테스트를 통해 여러 사용자가 동시에 사용하는 동안 서비스 및 서비스 시스템이 다운되거나 느리게 실행되지 않도록 할 수도 있습니다.

쉽게 주변에서 일어나는 상황을 예로 들어보면 대학 수강 신청, 인기 있는 아이돌의 콘서트 예매, 프로야구 한국시리즈 예매 등 순간적으로 동시 접속자들이 늘어날 때 예매 사이트 서버가 다운되는 경우들을 많이 볼 수 있습니다.

위 상황들은 1회성이 아닌 다분히 발생하고 있는 Case임에도 불구하고 이벤트가 있을 때마다 서버 다운이 불가피한 상황입니다.

특정 이벤트에 대해 미리 동시 접속자 수에 대한 성능 테스트를 수행함으로써 서버가 몇 명까지의 동시 접속자 수를 케어할 수 있는지, 어디에서 부하가 많이 발생하는지 사전에 미리 예측하고 대비할 수 있습니다.

●성능 테스트 유형

일반적으로 성능 테스트의 유형은 다음 4가지로 정의하고 있습니다.

1) Load Test : 동시 사용자 또는 프로세스 수에 의해 생성되는 트랜잭션의 요청으로 인해 현실적인 부하 수준을 처리하는지에 대한 시스템 성능 측정

2) Stress Test : 임계값 이상의 요청이나 비정상적인 요청을 보내 비정상적인 상황의 처리 상태를 확인하고 시스템의 최고 성능 한계를 측정하기 위한 테스트

3) Spike Test : 갑자기 사용자가 몰렸을 때 요청이 정상적으로 처리되는지, 또는 업무 부하가 줄어들 때 정상적으로 반응하는지를 확인

3) Scalability Test / Soak Test : 긴 시간 동안 테스트를 진행해서 테스트 시간에 따른 시스템의 메모리 증가, 성능 정보의 변화 등을 확인

●성능 테스트 용어

성능 테스트에서 사용하는 용어를 살펴보도록 하겠습니다.

1) Active User : 실제 서버에 연결된 상태로 요청을 처리 중인 사용자

2) Inactive User : 웹브라우저에 결과 화면이 출력된 상태에서 화면의 내용을 읽거나 정보를 입력하고 있는 사용자

3) Concurrent User : 특정 시점에 시스템에 접속하여 사용하고 있는 사용자

※ Concurrent User = Active User + Inactive User

4) Virtual User : 가상 사용자 수, Apache JMeter에서는 Thread 수로 표현하기도 함

5) Response Time/Load Time : 응답시간 또는 처리시간, 요청을 보낸 후 응답이 완료되어 사용자 화면에 출력될 때까지의 시간

6) Latency : 요청을 보낸 후 데이터를 받기 시작할 때까지 시간

7) Think Time : 하나의 요청에 응답을 수신하고 다음 요청을 보낼 때까지 시간

8) Request Interval Time : 요청을 보낸 후 다음 요청을 보낼 때까지 시간

9) Ramp-Up Period : Thread 생성에 걸리는 시간

10) Transaction : 업무 처리의 단위, 화면 조작 및 응답을 트랜잭션으로 정의

11) Throughput : 단위 시간당 대상 서버에서 처리되는 요청의 수, Apache JMeter에서는 시간 단위를 보통 TPS(Transaction Per Second)로 표현하며 TPM(Transaction Per Minute), TPH(Transaction Per Hour) 등이 있음

●성능 측정 도구

성능 측정 도구에는 어떤 것들이 있을까요?

1. Perfmon : Windows에서 제공하는 성능 모니터로 CPU 점유율, 메모리 사용량 등을 측정할 수 있음

2. HP LoadRunner : 응용 프로그램, 시스템 동작 및 부하 상태에서의 성능을 측정할 수 있는 프로그램. 소프트웨어를 동시에 사용하는 수천명의 사용자에 대해 시뮬레이션 가능

3. Apache JMeter : 다양한 서비스의 성능 분석 및 측정을 위한 성능 및 부하 테스트에 사용할 수 있는 오픈소스 툴. 주로 웹 및 웹 서비스 응용 프로그램에 사용

4. PostMan : 개발한 API를 테스트하고, 테스트 결과를 공유하여 API 개발의 생산성을 높여주는 플랫폼

http 주소에 대해 get과 post의 응답을 확인할 수 있는 프로그램. 서버와 DB에 제대로 신호가 가는지 확인할 수 있는 도구

이 외에도 많은 성능 측정 도구들이 있습니다. 측정하려는 대상이나 목적에 따라 적당한 성능 측정 도구를 선택하여 사용할 수 있겠죠?

●성능 측정 도구 : Apache JMeter

왜 성능 측정 도구를 사용해야 할까?

그렇다면 성능 테스트를 할 때 왜 성능 측정 도구를 사용해야 할까요?

동시 접속자 수에 대해 테스트를 한다고 예를 들어보겠습니다.

A라는 포털 사이트에 100명이 동시에 로그인 기능을 실행했을 때, 서버의 성능을 테스트해본다고 하면 그럼 100개의 PC에서 100명이 하나, 둘, 셋! 카운트하면서 동시에 로그인 버튼을 딱! 눌러서 테스트 할 수 있을까요? Apache JMeter는 이런 부분들을 해결해줍니다. 스크립트를 이용하여 몇 명이, 몇분 간격으로, 몇분 동안, 어떤 작업을 요청하고 그에 대한 결과를 한눈에 볼 수 있도록 기능을 지원해줍니다.

Apache JMeter란?

Apache JMeter란 Apache Project에 속한 오픈소스로 무료로 사용할 수 있으며, 웹 애플리케이션처럼 서버-클라이언트 구조로 소프트웨어의 성능 테스트를 위한 도구이며 100% Java 기반의 프로그램으로 설치가 용이합니다. Apache JMeter를 사용하는 많은 사람들이 커뮤니티를 통해 다양한 Plug-in들을 공유하고 있어, 보다 다양한 테스트를 수행할 수 있으며, 코드에 대한 깊은 지식이 없이도 쉽게 스크립트를 작성하여 사용할 수 있다는 장점이 있습니다.

간단하게 Apache JMeter 사용 방법에 대해 알아보겠습니다.

(1) Apache JMeter 설치하기

(2) Apache Jmater 실행하기

(3) 스크립트 작성하기

(4) 스크립트 실행하기

(5) 결과 확인하기

●Apache JMeter 설치하기

우선 Apache JMeter를 사용하기 위해서는 설치를 해야겠죠?

Apache JMeter는 Apache Software 홈페이지에서 다운로드할 수 있습니다.

▶ Link - https://Apache JMeter.apache.org/download_Apache JMeter.cgi

위 Link에 접속하여 압축파일을 다운로드하고 압축을 풀면 설치는 완료됩니다.

너무 간단하죠?

※ 참고 : 다운로드할 수 있는 파일의 종류가 Binaries와 Source가 있는데, 변경 없이 그대로 사용하려면 Binaries 버전을, 소스 코드를 수정 또는 추가하거나 컴파일해서 사용하려면 Source 버전을 받으면 됩니다.

Apache JMeter는 100% Java 기반의 프로그램이기 때문에 Java 또한 PC에 설치되어 있어야 합니다.

현재 최신 버전의 Apache JMeter는 Java 8 버전 이상을 요구한다고 하네요.

PC에 설치되어 있는 Java의 버전을 확인해보면 되겠죠? ※ Java 버전 확인 명령어 : java –version

PC에 Java가 설치되어 있지 않다면 하단의 Link를 통해 설치할 수 있습니다.

▶ Link – https://Java.com/ko/download/

●Apache JMeter 실행하기

Apache JMeter 설치가 끝났으면 실행해볼까요?

Apache JMeter 실행은 압축 해제한 폴더에서 bin 폴더에 진입하여 Apache JMeter.bat 파일 또는 Apache JMeterw.cmd를 통해 실행하면 됩니다.

○ 경로 – C:\apache-Apache JMeter-5.3\bin\Apache JMeter.bat

- C:\apache-Apache JMeter-5.3\bin\Apache JMeterw.cmd

※ Apache JMeter.bat으로 실행하면 cmd 창이 뜬 상태로 실행되고, Apache JMeterw.cmd로 실행하면 cmd 창 없이 실행됩니다.

Apache JMeter를 실행하면 위와 같은 화면이 보입니다. ※ 버전 5.2.1에서 진행함

●스크립트 작성하기

Test Plan 이란 테스트 스크립트를 말합니다. 간단하게 서버에 부하 테스트를 해볼 건데요. 우선 테스트 대상이 될 서버가 필요하겠죠? 저는 Apache Tomcat을 통해 제 PC에 테스트용 서버를 만들어 URL을 사용하도록 하겠습니다.

○ 테스트용 URL

- http://127.0.0.1:8080/sample/

- http://127.0.0.1:8080/sample/hello.jsp

- http://127.0.0.1:8080/sample/hello

5명의 사용자가 위 3개의 테스트용 페이지에 5회 요청을 보내는 스크립트를 작성해보겠습니다.

첫 번째, 우선 Thread Group을 추가해 줍니다.

○ Test Plan → Add → Threads (Users) → Thread Group

Thread Group은 가상 사용자(Thread)의 숫자와 반복 횟수, 반복 시간을 설정합니다.

Thread Group 구성

1) Number od Thread (users) : Thread 수 (동시에 접속하는 가상 사용자 수)

2) Ramp-up period (seconds) : 전체 Thread 유입 시간

3) Loop Count : 반복 횟수

두 번째, HTTP Request Defaults를 추가해 줍니다.

○ Thread Group → Add → Config Element → HTTP Request Defaults

HTTP Request Defaults에서는 실제 요청을 보낼 페이지의 기본 정보를 설정합니다.

Sampler-HTTP Request에 설정할 정보 중에 중복으로 작성되는 부분들을 HTTP Request Defaults에서 설정하면 좀 더 간편하게 수정 등을 할 수 있습니다.

HTTP Request Defaults 구성

1) Protocol[http] : http 또는 https 입력

2) Server Name or IP : Host 또는 IP 입력

3) Port Number : Port 번호 입력

4) Path : Path 입력

5) Parameters : 파라미터 값 입력

세 번째, HTTP Request를 추가해 줍니다.

○ Thread Group → Add → Sampler → HTTP Request

HTTP Request에서는 HTTP Request Defaults에서 설정한 기본값 외에 요청을 보낼 상세 값들을 설정해 줍니다.

앞서 확인했던 테스트 페이지가 3개의 URL이므로 Sampler도 3개가 필요합니다.

○ 테스트용 URL - http://127.0.0.1:8080/sample/

- http://127.0.0.1:8080/sample/hello.jsp

- http://127.0.0.1:8080/sample/hello

Sampler-HTTP Request를 3개를 생성했으면 각각 정보들을 설정해 줍니다.

HTTP Request 구성

1) Protocol[http] : http 또는 https 입력

2) Server Name or IP : Host 또는 IP 입력

3) Port Number : Port 번호 입력

4) Path : Path 입력

5) Parameters : 파라미터 값 입력

HTTP Request Defaults와 입력하는 내용은 크게 다르지 않죠?

자, 이제 네 번째! Listener를 추가해야 합니다.

Listener는 Sampler에서 요청한 것에 대한 결과를 수집해서 결괏값을 보여주는 기능인데요. Listener를 추가하지 않으면 요청에 대한 성공/실패 여부나 응답 시간 등을 확인할 수 없습니다.

기본적으로 많이 사용하는 Listener는 2가지가 있습니다.

먼저 View Result Tree를 추가해보도록 하겠습니다.

○ Thread Group → Add → Listener → View Result Tree

View Result Tree는 각 Sampler에 대한 Sampler result, Request data, Response data 등을 확인할 수 있으며 Text, HTML 등의 형태로 확인이 가능합니다.

그리고 Summary Report를 추가해 줍니다.

○ Thread Group → Add → Listener → Summary Report

Summary Report는 실시간으로 요청 결과에 대한 응답시간 통계, 에러율, 처리량 등을 확인할 수 있습니다.

●스크립트 실행하기

Listener까지 추가가 완료되었으면 스크립트를 실행해볼까요?

스크립트를 실행하는 방법은 상단 메뉴 중 Start 버튼을 선택해서 실행할 수 있습니다.

●결과 확인하기

실행이 완료되었으면 Listener를 통해 결과를 확인해볼까요?

먼저 View Result Tree를 확인해봅시다.

우측에 Sampler 목록이 나타나고 이 중에서 하나를 선택하면 오른쪽 화면의 Sampler Result 탭에 상세 결과가 출력됩니다. Sampler Result에는 성공/실패 여부와 응답시간, Size, Response code 등을 볼 수 있습니다.

Request 탭을 선택하면 해당 Sampler가 테스트 페이지에 보낸 요청 정보를 확인할 수 있습니다.

마지막으로 Response data 탭을 선택하면 해당 Sampler의 요청에 대한 응답 메시지를 확인할 수 있습니다.

Response data 탭을 HTML 형식으로 확인하면 아래와 같이 확인이 가능합니다.

이번엔 Summary Report를 확인해봅시다.

Summary Report는 말 그대로 테스트한 결과를 요약하여 보여주는데요. 각 Sampler에 대한 결과와 Total 결과를 함께 보여줍니다.

Summary Report 구성

1) Label : HTTP Request Sampler에서 설정한 Name

2) #Samples : 호출 건수

3) Average/Min/Max/Std.Dev. : 응답시간 통계 (1/1000초 단위로 표시됨)

4) Error% : 오류율

5) Throughput : 단위 시간당 처리량(TPS)

Apache JMeter로 성능 테스트하는 방법, 그렇게 어렵지 않죠?

ISO/IEC 25023의 품질 주특성 중 Performance efficiency measures(성능 효율성) 항목이 성능 테스트에 해당하게 됩니다.

Performance efficiency measures(성능 효율성)의 부특성으로는 Time behaviour measures(시간 반응성), Resource utilization measures(자원 효율성), Capacity measures(용량성) 항목이 있으며 그에 따른 세부 항목은 아래와 같습니다

1) Time behaviour measures(시간 반응성)

- Mean response time(평균 응답 시간)

- Response time adequacy(응답 시간 적절성)

- Mean turnaround time(평균 소요 시간)

- Turnaround time adequacy(처리 시간의 적절성)

- Mean throughput(평균 처리량)

2) Resource utilization measures(자원 효율성)

- Mean processor utilization(평균 프로세서 사용률)

- Mean memory utilization(평균 메모리 사용률)

- Mean I/O devices utilization(평균 I/O 장치 사용률)

- Bandwidth utilization(대역폭 사용률)

3) Capacity measures(용량성)

- Transaction processing capacity(트랜잭션 처리 용량)

- User access capacity(사용자 액세스 용량)

- User access increase adequacy(사용자 액세스 증가 적절성)

이 중 Apache JMeter를 이용하여 측정 가능한 매트릭은 평균 응답 시간, 평균 소요 시간, 평균 처리량, 사용자 액세스 용량이 있습니다. Average 값으로 평균 응답시간, 평균 소요 시간을 측정할 수 있으며, TPS 값으로 평균 처리량을, 그리고 Thread 수(동시 접속자 수)를 설정하여 스크립트를 실행하고 Error%를 확인하여 사용자 액세스 용량을 측정 할 수 있습니다.

간단한 스크립트 작성 예제와 함께 Apache JMeter 사용법을 알아보았습니다.

728x90

댓글