동시 접속자 수에 대해 테스트를 한다고 가정한다.
A라는 포털 사이트에 100명이 동시에 로그인 기능을 실행했을 때, 서버의 성능을 테스트해본다고 하면 그럼 100개의 PC에서 100명이 하나, 둘, 셋 ! 카운트 하면서 동시에 로그인 버튼을 딱 눌러서 테스트 할 수 있을까? Apache JMeter는 이런 부분들을 해결해준다. 스크립트를 이용하여 몇 명이, 몇분 간격으로, 어떤 작업을 요청하고 그에 대한 결과를 한눈에 볼 수 있도록 기능을 지원해줍니다.
Apache JMeter란?
Apache JMeter란 Apache project에 속한 오픈소스로 무료로 사용할 수 있으며, 웹 애플리케이션처럼 서버 -클라이언트 구조로 소프트웨어의 성능테스트를 위한 도구이며 100% Java기반의 프로그램으로 설치가 용이하다. Apache를 많이 사용하는 이유는 켜뮤니티를 통해 다양한 plug-in들을 공유하고 있어, 보다 다양한 테스트를 수행할 수 있으며, 코드에 대한 깊은 지식이 없어도 쉽게 스크립트를 작성하여 사용할 수 있는 장점이 있다.
brew install jmeter
터미널에서 실행 후
open /opt/homebrew/bin/Jmeter
로 열어줘야 합니다.
open /usr/local/bin/jmeter
인텔칩은 위의 명령어로 열렸지만, M1은 The file /usr/local/bin/jmeter does not exist. 이런 경고와 함께 경로에 실행 파일이 설치되어 있지 않더군요.
https://jmeter.apache.org/download_jmeter.cgi
설치가 끝난 후
다음은 JMeter 성능테스트 지표가 무엇인지 설명은 아래와 같습니다.
Summary Report
조회 성능 측정
조회성능을 측정하기 위해 ThraedGroup 설정을 합니다.
테스트 들어가기 전 JMeter 테스트 용어부터 알아보겠습니다.
Thread Group : 테스트에 사용될 쓰레드 개수, 쓰레드 1개당 사용자 1명
Sampler : 사용자의 액션 (예: 로그인, 게시물 작성, 게시물 조회 등)
Listener : 응답을 받아 리포팅, 검증, 그래프 등 다양한 처리
Configuration : Sampler 또는 Listener가 사용할 설정 값 (쿠키, JDBC 커넥션 등)
Assertion : 응답 확인 방법 (응답 코드, 본문 내용 비교 등)
Test Plan 이란 테스트 스크립트를 말한다.
아래 설정은 10명의 유저가 1초동안 1번 요청을 실행한다는 의미이다.
스레드 개수이며, 가상 유저 수라고 생각하면 된다.
HTTP Request Sampler 가 2개일 경우, 스레드를 1로 설정해도, 2번의 request 가 발생한다. 가상 유저수가 HTTP Request Sampler 에 비례한다.
스레드 당 생성시간으로, 만약 Number of Threads = 100이고, Ramp-Up = 10 라면, 100명의 유저를 생성할 때 까지 10초가 걸린다는 말이다. 즉, 1초 동안 10명의 유저가 요청을 하는것이고, 만약 Ramp-Up = 0 으로 설정하면, 동시 접속 자 수는 100명이 된다.
하나의 스레드가 수행할 작업 수이며, 만약 Number of Threads = 100이고, Loop Count = 10 이면, 100명의 유저는 동일한 작업을 10번 수행하게 되며, 총 1000번 (총 요청횟수) 이 수행된다.
Http Request Defaults에서는 실제 요청을 보낼 페이지의 기본 정보를 설정 합니다.
주로 Sampler-Http Request에 설정 정보 중에 중복으로 작성되는 부분들을 Http Request Delfaults에서 설정하면 좀 더 간편하게 수정 등을 할 수 있다.
POST 로 요청시에는 HTTP Header 설정을 추가로 해주어야 합니다.
HTTP Request - Config Element - HTTP Header Manager를 추가하고
아래와 같이 입력 한다.
키:값 으로
content-type : application/json
참고로 여기서 Authorzation 같은 헤더 값들을 설정해줄 수 있습니다.
사용자를 만들었으니 이제 사용자가 해야 할 행동을 정의한다.
Thread Group 우클릭 -> Add -> Sampler -> HTTP Request 클릭
Controller에 요쳥을 보내는 Sampler를 만든다.
아래 예는 [Post] localhost:8080/api/user/login ( 유저 로그인 api 테스트)
PostMan 처럼 아래에 원하는 데이터를 직접 입력하거나 파라미터값으로 줄수 있다. ( Body Data, Parameter 등)
sampler가 받아오는 리턴 값을 바탕으로 그래프, 레포팅을 만들어주는 Listener를 만들어보겠습니다.
ThreadGroup(우클릭) -> Add -> Listener -> View Results Tree, Summary Report, View Results in Table 생성
응답값이 제대로 왔는지 검증을 하기위해 Assertion을 추가
ThreadGroup(우클릭)-> Add -> Assertions -> Response Assertion 클릭
상단메뉴 중 start버튼을 선택해서 실행할 수 있다.
Table 열 데이터
Sample - 그냥 ID번호다. 이 번호를 보고 몇번째로 보는 부하인지 알 수 있다.
Start Time - 보내기 시작한 시간으로 ms단위까지 나온다.
Thread Name - 쓰레드 그룹 이름
Label - 보낸 request의 이름
Sample Time(ms) - Load Time, Elapsed Time, Response Time이랑 같은 뜻이다. 요청 시작 시점부터 응답 종료 시점까지의 시간을 의미
Status - 말그대로 응답상태를 확인할 수 있다.
Bytes - 응답 데이터 바이트
Sent Byte - 요청 데이터 바이트
Latency - 지연 속도를 의미하는데 요청 시작 시점부터 응답 시작 시점까지의 시간을 의미
Connect Time(ms) - TCP Handshake를 이용해 연결하는 시간(그냥 TCP연결시간)
Table footer 데이터
No of Samples - No는 아니다라는 뜻이 아니라 number라는 뜻, 처리중인 데이터 수를 의미
Latest Sample - 가장 마지막 Sample Time
Average - 생략되있는데 Sample Time 평균
Deviation - 생략되있는데 Sample Time의 표준편차
하나하나의 데이터를 확인할 수 있으며 당연히 결과를 내보낼 수 있고 심지어 검색할 수 있다.
검색은 이 listener의 핵심이다.
검색 문자에 포함되는 모든 데이터를 뽑아준다.
각각의 눌러보면 request, response, header등의 모든 데이터를 볼 수 있다.
참고로 모든 지표는 sample time(=load time, response time, elapsed time)를 기준으로 만든다.
Label - 우리가 사용했던 request의 이름을 기준으로 모은다. 따라서 다르게 집계하고싶다면 이름을 반드시 다르게 한다.
Samples - requset 갯수
Average - Sample Time의 평균
Min - Sample Time의 최소
Max - Sample Time의 최대
Std. Dev. - Sample Time의 표준편차
Error % - 에러율
Throughput - 시간당 처리량(=쓰루풋)
Received KB/sec - 시간당(sec) 받은 데이터(KB)
Sent KB/sec - 시간당(sec) 보낸 데이터(KB)
Avg. Bytes - 평균 바이트
- Label : Sampler 명
- Samples : 샘플 수 (Number of Threads X Ramp-up period)
- Average : 평균 응답 시간
- Median : 응답 시간 중앙값
- 90% Line : 90%의 샘플은 해당 값보다 적은 시간 내에 끝나고 10%는 더 걸린다. 라는 뜻의 컬럼
- 95% Line : 95%의 샘플은 해당 값보다 적은 시간 내에 끝나고 5%는 더 걸린다. 라는 뜻의 컬럼
- 99% Line : 99%의 샘플은 해당 값보다 적은 시간 내에 끝나고 1%는 더 걸린다. 라는 뜻의 컬럼
- Min : 최소값
- Maximum : 최대값
- Error % : 에러율
- Throughput : 초당 처리량
- Received KB/sec : 초당 받은 KB
- Sent KB/sec : 초당 보낸 KB
그래프를 시각화해서 보여준다
JMeter 에서 기본적으로 제공하는 그래프도 있지만, 저는 TPS를 보기 위하여 외부 플러그인을 추가로 설치 해주겠습니다.
https://jmeter-plugins.org/?search=jpgc-graphs-basic
운 받으셨다면 /iib 폴더 안에 넣어 주세요.
서버가 초당 처리할 수 있는 요청의 개수를 나타낸다.
TPS 가 높을 수록 초당 처리할 수 있는 요청의 수가 많다.
초당 요청 수(TPS) = 동시 사용자 수 / 응답시간(Response Time) + 인지시간(Think Time)