Back-End/Spring

[MVC-1편] 동시 요청 - 멀티 쓰레드, 쓰레드 풀

COBI-98 2023. 3. 14. 01:12

해당 포스팅은 인프런스프링 MVC1편 강의를 듣고 적은 강의 노트를 정리하며 기록하기 위한 글입니다.

강의를 시청하며, 프로젝트에 적용할 수 있는 부분들이나 궁금한 기능들을 정리하며 포스팅할 예정입니다. 

 

제 개인적인 의견이 더해져 올바르지 않은 정보가 들어가 있다면, 피드백이나 댓글로 남겨주시면 감사하겠습니다.

자세한 강의 내용은 인프런 스프링 MVC에서 만나보실 수 있습니다.

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

웹 브라우저에서 WAS에 요청하고 응답받는 과정

  • 클라이언트가 서버로 요청을 하면 WAS는 응답을 한다.
  • TCP/IP 커넥션이 연결되고 서블릿이 호출된다.

여기서 서블릿은 누가 호출하는가? 바로 '쓰레드'이다.

 

쓰레드

  • 애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드
  • 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행
  • 쓰레드가 없다면 자바 애플리케이션 실행이 불가능
  • 쓰레드는 한 번에 하나의 코드 라인만 수행
  • 동시 처리가 필요하면 쓰레드를 추가로 생성

단일 요청 - 쓰레드 하나 사용


 

  1. 클라이언트에서 서버로 요청이 온다.
  2. WAS는 이 요청에 놀고 있는 쓰레드를 할당해 준다.
  3. 쓰레드는 이 요청에 대한 서블릿을 호출한다.
  4. 쓰레드는 응답을 반환해 주고, 다시 휴식한다.

다중 요청 - 쓰레드 하나 사용

 


  1. '요청 1'을 처리하기 위해  휴식하고 있던 쓰레드는 요청 1에 할당된다.
  2. '요청 1'의 쓰레드가 서블릿에서 처리가 지연되고 있다.
  3. 서버에 '요청 2'가 들어오면, '요청 2'는 사용 가능한 쓰레드가 없기 때문에 쓰레드를 위해 대기한다.

1번 요청은 비즈니스 로직이 느리다는 이유로 처리가 지연되고 있을 수 있고, 

2번 요청은 1번 요청이 처리될 때까지 쓸 수 있는 쓰레드가 없기 때문에 계속 지연된다.

위 그림과 같은 상황이 발생하면 어떠한 요청도 제대로 처리할 수 없고, 서버가 죽게 된다는 것을 알 수 있다.

 

요청마다 쓰레드 생성


요청마다 쓰레드 생성은 말 그대로 '요청이 올 때마다 새로운 쓰레드를 생성해서 배정해 준다'이다. 

그렇다면 처리 지연이 되는 '요청 1'과 '요청 2'가 할당되는 쓰레드가 다르기 때문이다. 하지만 이는 장단점이 있다.

  • 장점
    • 동시 요청을 처리할 수 있음.
    • 하나의 쓰레드가 지연되어도, 다른 쓰레드는 정상 동작한다.
  • 단점
    • 쓰레드는 생성 비용이 매우 비싸다. (매번 생성하면 응답속도가 느려질 수 있음)
    • 쓰레드는 컨텍스트 스위칭 비용이 발생함. (코어 개수만큼 CPU 있고, CPU 개수만큼 동시 쓰레드 처리 가능함. 코어가 1개만 있다면 1개의 쓰레드를 실행 후, 그 다음 쓰레드로 넘어가게 되는데 이 때 컨텍스트 스위칭 비용이 발생한다.)
    • 쓰레드 생성에 제한이 없다. (고객 요청이 한번에 많이 오면, CPU, 메모리 등의 임계점이 넘어서 뻗을 수 있음)

이것을 해결하기 위해 나온 것이 쓰레드 풀이다.

 

쓰레드 풀 - 요청마다 쓰레드 생성의 단점 보완

필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다.
쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 최대 200개 기본 설정되어 있다고 한다.

 

사용

  1. 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
  2. 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.
  3. 최대 쓰레드가 모두 사용 중이어서 쓰레드 풀에 쓰레드가 없으면?
  4. 기다리는 요청은 거절하거나 특정 숫자만큼만 대기하도록 설정할 수 있다.

장점

  1. 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠르다.
  2. 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.

예매 사이트 접속 대기 (트래픽 제어)

그렇다면 쓰레드 풀을 최소한으로 사용하려면 어떻게 해야 할까

 

성능 튜닝

  • WAS의 주요 튜닝포인트는 최대스레드(max thread) 수이다.

이 값을 너무 낮게 설정하면?

  • 동시요청이 많으면, 서버리소스는 여유롭지만, 클라이언트는 금방응답지연한다.

이 값을 너무 높게 설정하면?

  • 동시요청이 많으면, CPU, 메모리리소스임계점초과로서버다운된다.

 

값 초과, 미달 장애 발생 시  

  • 클라우드면일단서버부터 늘리고, 이후에 튜닝한다.
  • 클라우드가 아니면 열심히 튜닝하면 된다.

 

쓰레드 풀

쓰레드풀의 적정숫자는 애플리케이션로직의복잡도, CPU, 메모리, IO 리소스상황에 따라 모두 다르다.

 

그렇기에 최대한 실제서비스와유 사하게 성능테스트를 시도해야 한다 

• 툴: 아파치 ab, 제이미터, <nGrinder> -> naver에서 나온 tool을 사용하는 추세.

 

하지만 WAS(Web Application Server)는 멀티 쓰레드 지원한다. (핵심)

  • 멀티 쓰레드에 대한 부분은 WAS가 처리한다.
  • 개발자가 멀티 쓰레드 관련 코드를 신경 쓰지 않아도 된다.
  • 개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발한다.
  • 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용한다.