기존에 서비스하던 코드들을 리팩토링 하면서
문득 코드 리팩토링 후 과연 성능 차이가 있을까? 궁금해졌다.
많은 성능 테스트 Tool들이 있었는데 JMeter, nGrinder, k6..
그 중 오랜기간 릴리즈 하고 있고, 다양한 기능과 플러그인, 자료도 풍부한 Apache JMeter를 선택하였다.
선행 지식
성능 테스트시 꼭 알고 가야하는 개념이 있는데, 바로 응답시간과 TPS다.
이 둘은 성능 테스트의 중요한 지표이다.
응답시간(Response Time)
- 클라이언트가 서버에 요청을 하고 그 요청에 대한 응답을 받을 때까지 걸린 시간을 의미한다.
- 응답 시간은 아래의 두가지로 분류 가능하다.
- 처리 시간(Processing Time) : 실제 서버가 요청을 처리하는데 걸린 시간
- 대기 시간(Latency Time) : 클라이언트와 서버간에 데이터를 주고 받는데 걸리는 시간
응답시간(Respose Time) = [동시 사용자 수 / 초당 요청 수(TPS)] - 인지시간(Think Time)
TPS(Throughput)
- 서버가 초당 처리할 수 있는 요청의 개수를 나타낸다.
- TPS 가 높을 수록 초당 처리할 수 있는 요청의 수가 많다.
초당 요청 수(TPS) = 동시 사용자 수 / 응답시간(Response Time) + 인지시간(Think Time)
JMeter 설치
아파치 재단이 제공하는 오픈소스로 공식 사이트 에서 다운로드 가능하다.
JMeter는 JAVA 기반이기 때문에 자바가 깔려 있어야 한다!
모든 설치/실행 과정은 Mac OS를 기반으로 진행
설치는 여러 방법으로 진행할 수 있지만, 필자는 직접 파일을 다운받는 방법을 선택하였다.
- 압축 파일을 다운로드 받고 압축을 풀어주자.
- /bin 디렉터리 이동 -> cd /bin
- jmeter 실행 -> ./jmeter
+ 한글 깨짐 방지
Request 나 Response Data에 한글이 있다면 설정 해주세요.
/bin/jmeter.properties 에 아래 구문 추가해주시고 재시작 해주시면 적용됩니다.
#sampleresult.default.encoding=ISO-8859-1
sampleresult.default.encoding=UTF-8
아무래도 외국에서 만든거라 Default Encoding이 ISO-8859-1로 되어있네요.
+ 그래프 플러그인 (Graph Plugin)
JMeter 에서 기본적으로 제공하는 그래프도 있지만, 저는 TPS를 보기 위하여 외부 플러그인을 추가로 설치 해주겠습니다.
https://jmeter-plugins.org/?search=jpgc-graphs-basic
다운 받으셨다면 /iib 폴더 안에 넣어 주세요.
Listener 밑에 추가된 것을 확인할 수 있습니다.
JMeter 설정
실행 하게되면 볼 수 있는 기본 화면 입니다.
Thread 그룹 생성
Test Plan -> Add -> Threads(Users) -> Thread Group
- Number of Threads (users) : 스레드수 - 유저 수
- Ramp-up period (seconds) : 지정된 유저가 모두 로딩될 시간
- Loop Count : 반복 횟수
저는 1초에 50번의 부하를 100번 반복하도록 설정했습니다.
Sampler 생성
Http 요청을 해야하니 HTTP Request를 생성하겠습니다.
Thread Group -> add-> Sampler -> HTTP Request
Web Server란에 서버 이름 or IP와 포트 번호를 넣고
Path에 나머지 URI를 입력하면 됩니다. 프로토콜은 http가 Default 인거 같네요.
저는 POST 요청을 보내야 해서 Body Data도 추가로 설정 해주었습니다.
+ 내용이 많을 경우에는 jmter가 응답없음 상태로 변경될 수도 있다하니 files Upload를 씁시다 !
POST 요청시 추가 설정
POST 로 요청시에는 HTTP Header 설정을 추가로 해주어야 합니다.
생성한 Sampler -> Add -> Config Element -> HTTP Header Manager
여기서 Add를 클릭하여 Content-type : application/json 값을 넣어 줍니다.
참고로 여기서 Authorzation 같은 헤더 값들을 설정해줄 수 있습니다.
Listener 생성
Listener는 Test Plan, Thread Group, Sampler 까지 단위별로 설정 가능한거 같습니다.
저는 이번 포스팅에선 Thread Group에 Listener 설정하겠습니다.
Listener 종류가 많은데 저는 3가지만 소개하겠습니다.
- View Results Tree
- Summary Report
- TPS Graph
상단의 초록색 스타트 버튼(누가봐도 시작 버튼)을 누르면 요청이 갑니다.
비교를 위해 테스트 케이스를 2개 생성했습니다.
View Results Tree
브라우저의 개발자 도구라고 생각하시면 됩니다.
개별 요청의 Request / Response를 볼 수 있습니다.
응답 body 까지만 확인 가능합니다.
Summary Report
전체적인 요약본 입니다.
평균, 최소, 최대의 단위는 ms입니다.
Label - Sampler 이름
Samples - requset 개수
Average - 응답 평균
Min - 응답 최소
Max - 응답 최대
Std. Dev. - 응답 표준편차
Error % - 에러율
Throughput - 시간당 처리량
Received KB/sec - 시간당(sec) 받은 데이터(KB)
Sent KB/sec - 시간당(sec) 보낸 데이터(KB)
Avg. Bytes - 평균 바이트
TPS Graph
TPS 수치를 그래프로 볼 수 있습니다.
이렇게 JMeter 설치, 설정, 사용까지 해보았습니다 !
이제 성능 튜닝을 통해 유의미한 결과를 얻어내는 일만 남은거 같군요..!
'Server & Infra' 카테고리의 다른 글
[Docker] Ubuntu에 Docker로 웹서비스 구축하기 (0) | 2023.11.29 |
---|---|
[Redis] Redis Master-Slave 구축하기 (0) | 2023.07.23 |