티스토리 뷰

반응형

WebSocket Single Write Sampler.jmx
0.02MB

 

locust로 끝내려다가 JMeter 찍먹

다운로드 받고, plugin manager 다운받고 ext에 넣고, websocket 전용 plugin까지 추가하는 글은 엄청나게 많으니 아무거나 봐도 됨

 

이후에 첨부한 파일 open으로 열어서 참고하면 됨

 

아래 과정은 참고만 하고 자신의 서버 로직에 따라 구현하면 됨

 

코드가 필요하면 BeanShell Sampler

  • 무작위 변수(Random Variable)라는 게 있긴 한데, 이걸로 안될 것 같음

 

내부의 변수를 다른 Sampler?에서 사용하려면

  • vars.put("YOUR_VAR", str_java_var);

 

DB 연결이 필요하면 JDBC Connect

쓰레드 이름:Thread Group 1-1
표본 시작 시간:2024-11-14 10:01:21 KST
로드 시간:10
연결 시간:10
대기시간:0
바이트 크기:505
전송 바이트 크기:0
헤더들의 바이트 크기:0
Body의 바이트 크기:505
표본 수:1
오류 수:1
데이터 타입 ("text"|"bin"|""):text
응답 코드:null 0
응답 메시지:java.sql.SQLException: Cannot create PoolableConnectionFactory ("encrypt" 속성이 "true"(으)로 설정되고 "trustServerCertificate" 속성이 "false"(으)로 설정되었지만 드라이버가 SSL(Secure Sockets Layer) 암호화를 사용하여 SQL Server에 대한 보안 연결을 설정할 수 없습니다. 오류: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. ClientConnectionId:3a806772-e68b-44b4-88b0-dd9a2dc5e8e9)

쓰레드 이름:Thread Group 1-1
표본 시작 시간:2024-11-14 10:00:25 KST
로드 시간:1
연결 시간:1
대기시간:0
바이트 크기:178
전송 바이트 크기:0
헤더들의 바이트 크기:0
Body의 바이트 크기:178
표본 수:1
오류 수:1
데이터 타입 ("text"|"bin"|""):text
응답 코드:null 0
응답 메시지:java.sql.SQLException: Cannot create PoolableConnectionFactory (속성 trustServerCertificate에 잘못된 부울 값이 포함되어 있습니다. true 또는 false 값만 사용할 수 있습니다.)
  • jdbc connect 맨 아래 연결 속성에 MARS_Connection=Yes;TrustServerCertificate=true;Encrypt=no;

 

쿼리 실행은 JDBC Request

  • insert 완료, 질의 타입 update
  • 다른곳들과 다르게 생성한 변수를 쿼리에서 사용할때는 좀 다름
  • ${__BeanShell(vars.get("YOUR_VAR"))}

 

중간에 결과 필요하면 View Results Tree 추가해서 봐야함

 

Header추가 필요하면 HTTP Header Manager 추가

  • 헤더 Value에는 ${VAR} 로 사용하면 됨

추가한 헤더와 함께 Websocket Open

 

서버메시지 수신 및 응답을 JSON Extractor로 처리하여 변수로 저장

 

저장한 변수를 json에 포함하여 request

 

특정 Sampler 반복은 Thread Group에 Add>Logic Controller>While or Loop 추가 후 해당 Controller에 Sampler 드래그 해서 넣어주기

 

While or Loop 반복의 Sleep을 주려면 Add>Timer>Constant or Uniform

  • 4초 안쪽의 랜덤한 시간에

 

연결이 갑자기 다 끊겨서 보니, 이렇고 찾아보니 서버에서 ping 보냈는데 client에서 pong 안해서 그런듯

Thread Name:Thread Group 1-10
Sample Start:2024-11-14 11:51:11 KST
Load time:0
Connect Time:0
Latency:0
Size in bytes:6
Sent bytes:599
Headers size in bytes:2
Body size in bytes:4
Sample Count:1
Error Count:1
Data type ("text"|"bin"|""):
Response code:Sampler error
Response message:Sampler error: java.lang.ClassCastException: class eu.luminis.websocket.PingFrame cannot be cast to class eu.luminis.websocket.DataFrame (eu.luminis.websocket.PingFrame and eu.luminis.websocket.DataFrame are in unnamed module of loader org.apache.jmeter.DynamicClassLoader @548c4f57)

SampleResult fields:
ContentType: 
DataEncoding: null

 

websocket ping/pong sampler 추가(ping 응답을 위한)

  • 서버랑 타이밍이 안 맞는지 별 효과 없음

Thread Name:Thread Group 1-1
Sample Start:2024-11-14 12:09:07 KST
Load time:1
Connect Time:0
Latency:0
Size in bytes:0
Sent bytes:0
Headers size in bytes:0
Body size in bytes:0
Sample Count:1
Error Count:1
Data type ("text"|"bin"|""):
Response code:Websocket I/O error
Response message:WebSocket I/O error: 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다

SampleResult fields:
ContentType: 
DataEncoding: null

 

Websocket ping/pong frame filter(add>config element)

  • 일단 both 체크, 그리고 아래 automatically respond 체크

이러니까 해결됨

 

thread: 64 ramp-up:64

- 1초에 하나씩 늘어나도록 일단 테스트 문제 없음

 

클라이언트에 따른 서버 성능이 궁금해서 물어보니 PerfMon 쓰라고함

plugin manager에서 perfmon 다운로드

  • 원래 available에 있음

서버에서 실행할 agent 다운로드

ServerAgent-2.2.1.zip

http://jmeterplugins.com/downloads/index.html

이걸 서버로 잘 옮겨서 sh파일 실행하면 4444로 열림

나는 docker compose에 volume 추가해서 다시 빌드시킴

그리고 실행하려면 java 필요함, 지금은 dockerfile에 설치하는 과정은 넣지 않았음

docker exec -it <container_id> /bin/sh

apt update
apt install -y openjdk-17-jre

cd jmeter_perfmon_agent
chmod +x startAgent.sh

./startAgent.sh

 

그냥 저냥 나오기는 하는데 y축이 백분율이 아니라서 직관적이지가 않음, 설정을 못하겠음

그리고 x축도 opened socket connection count면 좋을텐데

 

thread:512개 1~4초 간격으로 메시지 주고 받는 경우에 locust에 비하면 훨씬 가벼움, peak가 6.3%정도, i7-8700

locust가 2~30%정도 나왔었음

 

일단 각 thread마다 동작 기록이 모두 있어서 너무 편함

그러니까 뒤에서 에러난 thread가 보이면 해당 thread를 전부 찾아서 거슬러 올라갈 수 있음

docker exec -it <container_id> /bin/sh

apt update
apt install -y openjdk-17-jre

cd jmeter_perfmon_agent
chmod +x startAgent.sh

./startAgent.sh

 

thread:512, ramp-up:32, loop: 10, up:16/s(512/32)

 

thread:512, ramp-up:32, loop:inf, up:16/s(512/32)

 

댓글

티스토리 방명록

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday