Spring 직.병렬처리 Test

무지성개발자·2023년 9월 24일
0

병렬처리 Test

RestTemplate을 이용하여 하나씩 직렬 처리 할 때와 별렬 처리 할 때 Thread의 상태가 어떻게 차이 나는지 확인하는 테스트.

조건

  • blackBox 서버 : 요청을 받으면 Thread.sleep으로 1초 있다가 응답.
  • remote 서버 : 쓰레드 10개로 제한. RestTemplate으로 blackBox서버에 요청.
  • RestTemplate : Connection을 조절하여 직렬, 병렬 처리.
    • 직렬 처리 할 땐 connection을 1개로 제한.
    • 병렬 처리 할 땐 conection을 10개로 제한.
  • jmeter : 100개의 요청을 한 번에 실행.

결과

직렬 처리

jmeter에서 100개의 요청을 보냈지만 10개의 쓰레드만 이용가능해서 요청은 최대 10개씩 이루어 지는 걸 알 수 있다.

10개의 쓰레드가 RestTemplate을 이용하여 BlockBox서버로 요청을 보낼 땐 1개의 Connection제한이 걸려있어 1개의 쓰레드만 Running 상태가 되고, 나머지 9개의 쓰레드는 Waiting상태인걸 확인 할 수 있다.

Running이 끝난 쓰레드는 쓰레드 풀에 반납이 되고 곧 바로다른 요청을 받아 작업을 시작 하지만 RestTemplate을 사용하지 못하여 Waiting상태가 되는 걸 알 수 있다.

Blocking 작업 때문에 한 쓰레드씩 Running상태가 되어 총 100초가 걸릴걸 확인 할 수 있었다.

병렬 처리

jmeter에서 100개의 요청을 똑같이 보냈지만 Waiting 없이 10개의 쓰레드가 Running 상태다.

100개의 요청 중 10개의 씩 작업이 시작되고 RestTemplate의 connection 제한도 10개여서 모든 쓰레드들이 바로바로 작업을 하고 반납이 되면 다음 요청이 실행되는 걸 알 수 있다.

Blocking 작업을 병렬로 처리하여 Waiting없이 모든 쓰레드가 Running 상태여서 10초에 작업이 끝난걸 확인 할 수 있었다.

결과

직렬처리와 병렬처리 결과를 보면 작업 속도가 크게 차이 났지만 성능이 올라간게 아니고 시간당 처리하는 량의 차이로 봐야한다. 이 테스트로 인해서 왜 컨텍스트 스위칭의 비용을 감수하며 여러게의 쓰레드를 사용하는지 좀 더 알게 된 것 같다.


한 줄평 : 적정한 크기의 쓰레드를 정하는 것 까지는 아직 감이 잘 안오는것 같다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글