JMeter
목차
[Apache JMeter]
웹 성능을 측정하기 위해 대중적으로 가장 많이 사용한다고 한다.
Apache 재단에서 제공하는 오픈소스.
다양한 플러그인 제공
Master - Slave 개념으로 대량 부하 테스트도 가능.
아래 블로그 참조하여 기본적인 세팅 진행해봄
[전제조건]
JDK 8이상 설치
Windows 환경에서는 GUI 기반으로 구동가능 (.bat 파일제공)
[설치]
https://jmeter.apache.org/download_jmeter.cgi
binaries - zip 파일 다운로드 후 압축 풀기
/bin/jemeter.bat 로 실행
[플러그인 설치]
jmeter plugin manager 설정
https://jmeter-plugins.org/get/
다운로드 받은 후 ./lib/ext에 넣고 확인
Options-Plugins Manager 추가된 것 확인
Plugin Manager에서 아래 추가로 설치
- 5 Additional Graphs
- Custom Thread Groups
Transactions Per Second Plugin 설치
TPS 측정을 위해 많이 사용한다고 한다.
https://jmeter-plugins.org/?search=jpgc-graphs-basic
다운로드 후 ./lib 폴더와 ./lib/ext 폴더에 넣기
Add-Listener-jp@gc 3개 추가된 것 확인
[기본 세팅]
User Defined Variables
변수 세팅해놓고 여기저기서 쓸 수 있다.
Transactions per Second, Thread Group 추가
Number of Threads (users): 스레드 수
Ramp-up period (seconds): 사용자의 Think Time으로 사용자가 몇초에 한 번 서비스를 클릭하는지에 대한 값이다. 또한 지정한 수 만큼의 Thread가 실행되기까지 걸리는 시간을 의미한다.
(ex: Thread 수가 300이고, Ramp-up period가 1이면 300개의 Thread가 1초만에 생성된다)
Loop Count: 몇 번 반복해서 요청할 것인가?
예제세팅) 100개의 스레드가 100초 간격으로 요청하니까 스레드당 1초 단위로 100회씩 request threads를 발생시킨다 (TPS: 100)
number of threads: 100
Ramp-up period: 100
Loop Count: 100
=> 총 요청수 number of threads * loop count = 10000 이 된다.
Specify Thread lifetime
- Duration
- startup delay (seconds): 설정한 시간 후 테스트 시작
HttpRequest 추가
Protocol: http
Server Name: ${server_ip}
Port Number: ${server_port}
HTTP Request: GET/POST
Path: "/test"
Body Data
Advanced - Implementation - HttpClient4 선택
POST 호출인 경우 아래 Http Header Manager 추가 세팅
Content-Type: application/json
Result Viewer 추가
View Results Tree, Summary Report 2개 추가
[Remote Test (부하 분산 테스트)]
대용량 테스트를 할 때는 JMeter 한 대로는 성능이 안나와 힘들 수 있어서 여러 대의 부하발생기를 연결해서 동시에 테스트 해야한다.
JMeter에서 제공하고 있다.
- JMeter Controller: 부하 발생기들에 명령을 전달하는 Master 역할
- JMeter Server: 실제 부하를 발생시키는 노드들. Controller에서 명령을 받고 수행 후 결과를 다시 Controller에 반환한다.
/bin/jmeter.properties 파일에서 역할별로 설정을 수정 한 후 구동하게 된다.
Master 설정
remote_hosts=remote_server:2099, remote_server2:2099 client.rmi.localport=2099 server.rmi.ssl.disable=true |
설정 후 JMeter.bat 실행시켜서 Remote 목록 확인
Slave 설정
server_port=2099 server.rmi.localport=4000 #내부적으로 사용하는 포트인듯 server.rmi.ssl.disable=true |
설정 후 /bin/Jmeter-server.bat 실행.
아래처럼 나오면 성공
명령 수행
Master 서버에서 Run - Remote Start (All)
Slave 서버에서 아래처럼 나오면 성공
Linux 환경에서 구동하기
Windows 서버를 Master로 두고, Linux 서버를 Slave로 두어 구동해보기
세팅방식은 동일하나 linux 서버에서 아래 명령어로 구동한다.
$ cd ./bin
$ sudo ./jemeter-server
#아래처럼 나오면 구동 성공
Using local port: 4000
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[ip:4000](local),objID:[49488e19:17e08b4de07:-7fff, -4386202146275920573]]]
#Windows에서 구동 후 아래같은 로그가 찍힌다.
Starting the test on host server:2099 @ Thu Dec 30 09:22:56 KST 2021 (1640823776010)
Finished the test on host server:2099 @ Thu Dec 30 09:22:57 KST 2021 (1640823777494)
[기타 플러그인들]
jp@gc - Ultimate Thread Group
- Start Thread Count: 스레드 수
- Initial Delay: 시작 시 지연
- StartUp Time: 모든 스레드가 올라오는데 걸리는 시간
- Hold Load For: 부하 유지 시간
- Shutdown Time: shutdown을 해당 시간만큼 시간들여서 수행
Timer
일정한 TPS를 내기위해 timer를 써야하는듯하다.
Target Throughput
60: 초당 1번 요청한다는 의미
=> 스레드수 1000이고 Target Throughput이 60인 경우 스레드 1000개가 초당1번 요청하므로 TPS = 1000으로 유지된다.
600이면 TPS 10000을 기대할 수 있음.
[Trouble Shootings]
java.net.BindException: Address already in use: connect
테스트 과정에서 위 오류가 발생하면서 실패하는 경우가 빈번히 있었다.
찾아보니.. 아래처럼 해결하라고 함.
https://blog.naver.com/yeom7707/90047989629
- cmd - regedit
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
- MaxUserPort 10진수로 65564로 설정
- 재부팅
[Test Plan 샘플 파일]
[참조]
Jmeter 설치 & Jmeter를 이용한 부하분산테스트
서버 부하테스트를 하는 툴은 시중에 많이 있지만 이번엔 Jmeter를 사용해서 테스트를 실행해보았다. Jmeter는 다른 툴에 비해 다양한 기능과 플러그인이 존재하고 빠른 시나리오 작성이 가능하다.
velog.io
JMeter Timer
컴퓨터는 반복 작업을 빠르게 수행하지만 실제 사용자들은 중간에 서버에 내용을 보내지 않고 대기하는 시간이 발생합니다 이 시간을 Thinking Time이라 합니다 Test Plan을 세울 때 Thinking Time까지 고
sooo-9.tistory.com
https://blog.naver.com/yeom7707/90047989629
java.net.BindException: Address already in use: connect
포트가 TIME_WAIT 상태일 때 같은 포트로 같은 목적지에 접속하려고 하면 나타나는 예외인 것으로 ...
blog.naver.com