본문 바로가기

카테고리 없음

spring webflux reactive-mongo 성능 테스트

Env

1. 환경

- spring framework: 2.1.9

- mongodb: 4.2.0 (docker)

- java: openjdk-12-jdk

 

2. 로직

- input test

: spring이 시작 되면 기존의 db를 삭제

: request 1건당 test model을 만들어 insert 함

 

3. setting

- 기본 세팅

 

4. load: jmeter

- thread: 10000

- rampup time: 1

- loop: 3

 


결과

1. respose 분석

  • 총평: web server와 db 모두 reactive를 지원하는 경우 월등한 성능을 보이는 것을 볼 수 있다. 평균 반응시간은 webflux + reactive mongo driver를 사용 한경우 평균 8ms 최대 반응시간 96ms로 월등하며 through put로 583 가장 좋은 점수를 나타냈다.
  • error: webflux가 아닌 web을 사용하는 경우 에러 비율이 30%로 나타나는 것으로 보였으며, webflux를 사용 하는 경우 에러는 발생하지 않았다.
  • webflux와 reactive가 아닌 driver를 사용하는 경우가 특이한 경우 인데, 에러도 발생하지 않았고, 전체적으로 무난한 결과를 보였으나, 최대 반응 시간 면에서 reactive driver를 사용한 경우보다 10배이상 지연 시간이 발생한 것으로 보였다.

Load test 결과

web dbdriver Samples

Average

Min Max Std.Dev. Error % Throughput KB/sec Avg. Bytes
web mongo 30000 9 0 1019 52.11 30.99% 420.6 337.39 821.4
web reacitve 30000 100 0 1676 330.43 29.80% 342.9 267.34 798.3
webflux mongo 30000 8 0 1334 73.39 0.00% 491.3 78.08 162.7
webflux reacitve 30000 8 0 96 13.98 0.00% 583 92.65 162.7

* trough put 단위 시간당 처리 숫자 (transaction per second)

 

2. 리소스 사용량

  • cpu 사용량은 43~47% 수준으로 모두 비슷한 수준을 보였다.
  • 메모리 사용량은 기본 160mb ~ 220mb 수준, 최대 463 ~ 810 mb를 보였는데, webflux + reactive drive를 사용한 경우 기본 220mb 최대 600mb 로 다소 많은 리소스를 차지 하였다.
  • 쓰레드는 가장 많이 사용한 조합은 web + reactive 의 경우 300개 가까운 숫자를 보였으며, 이는 1 req = 1 thread 를 기본으로 하는 방식때문에 thread가 매우 크게 늘어난 것으로 보인다. 이에 비에 webflux를 사용하는 경우는 비동기 방식을 사용하여, 적은 숫자의 쓰레드로 많은 request를 처리 할 수 있었던 것으로 보인다.
  • db connection의 경우 reactive driver를 사용한 경우 105 connection 까지 올라갔으며, reactive driver를 사용하지 않은 경우 12 connection으로 최대치를 보였다.

리소스 사용량

web dbdriver

기본
메모리 system mb

Test
메모리system mb

기본
heap
(used) mb

test
heap
(used) mb

기본 쓰레드
live+daem

test 쓰레드
live+daem

CPU 사용률 con
web mongo 220 573 250(50) 430(300) 25+4 215+4 46% 12
web reactive 160 810 300(50) 827(500) 38+4 268+4 47% 105
webflux mongo 188 463 55(32) 110(85) 9+2 21+2 43% 12
webflux reactive 220 599 290(28) 292(210) 12+2 23+18 43% 105

* thread와 dbconnection을 조정하여, 반응 속도를 테스트 해 볼 것.

 

 


결과 상세

1. web + mongo

 

기본: 220mb 메모리 사용

- systeam 최대 메모리: 573.0MB

 

 

Resource  사용률 visualVm

Thead는 기본적으로 daemon thread 25 + live thread 4 개로 29 개 메모리는 250mb(used 50mb) 정도 사용한다.

Test 중의 쓰레드는 215 + 4 개까지 증가 했다. 메모리는 최대 430mb(300mb) 정도까지 증가했다.

cpu 46%

 

 

2. web+reactive mongo

테스트 전

메모리는 800mb 정도를 점유하는 것으로 보임

 

heap size: 300mb (used: 50mb)

thread: 38 + 4 (42 thread)

heap size: 827mb (used: 500mb)

thread: 268 + 4 (272 thread)

cpu: 47%

 

3. webflux + mongo

테스트 전 메모리 사용량 188mb

메모리 사용량 463mb

 

메모리 55mb(used 17~32mb), 쓰레드(9+2)

 

메모리 사용량: 110mb(85mb)

쓰레드: 21 + 2

cpu 최대: 43%

 

4. webflux-reactive-mongo

기본 메모리: 219mb

 

 

heap: 290mb(28mb)

쓰레드: 12+2

메모리: 292mb(210mb)

쓰레드 23+18 (db connection 15, 기본 3)

cpu:43%