본문 바로가기

Spring Boot/4. SpringMVC part1

2-2 Web 동시요청, 멀티쓰레드

앞선 2-1게시물에서 아래 사진을 설명하였다.

WAS 요청 흐름

3. Servlet Container에서 만들어진 Servlet을 호출한다.

라고 하였는데. 주체를 설명하지 않았다.

Servlet을 호출하는 주체는 바로 쓰레드이다.

Request객체와 Response객체를 쓰레드가 받고, 쓰레드가 Servlet을 호출하는 것이다.

그렇다면 쓰레드란 무엇일까?

 

쓰레드란?

  • 프로그램코드를 순차적으로 실행하는것이다
  • java의 public static void main() { } 실행시 main이라는 이름의 쓰레드가 실행된다.
  • 쓰레드는 한번에 하나의 코드만 실행한다.
  • 동시 실행이 필요할 시 쓰레드를 추가한다.

쓰레드는 위와같이 프로그램 코드를 실행한느 단위를 말한다.

 

이제 WAS의 관점에서 바라보자.


MultiThread on WAS

  1. 클라이언트로부터 요청이 들어온다
  2. WAS내에서 "쓰레드1"을 생성한다.
  3. "쓰레드1"로 Client요청을 받아들인다.
  4. "쓰레드1"이 Servlet을 호출한다.
  5. 그러던와중에... 다른 클라이언트로부터 요청이 들어온다.
  6. WAS가 "쓰레드2"를 생성한다.
  7. "쓰레드2"로 Client요청을 받아들인다.
  8. Servlet의 로직 수행 후 Client로 Response를 반환한다.

위와 같이 WAS는 Client요청시 매번 쓰레드를 생성한다.

매번 요청시 쓰레드를 생성하게 되면 장점과 단점이 존재한다.

 

* 장점.

  1. 위 그림과 같이 동시요청을 처리할 수 있다.
  2. CPU, 메모리 등 머신이 허용하는 리소스 한계 내에서 처리 가 가능하다.
  3. 하나의 쓰레드 수행이 지연되어도 나머지는 정상 동작할 수 있다.

* 단점.

  1. 쓰레드는 생성 비용이 비싸다
    • 쓰레드 생성을 많이 하게 되면 응답속도가 느려진다.
  2. 쓰레드는 컨텍스트 스위칭(Context Switching) 비용이 발생한다.
    • 컨텍스트 스위칭(Context Switching)이란?
      • 하나의 코어안에서 여러개의 쓰레드가 순서를 바꿔가며 연산을 처리 하는 행위
        • ex) 쓰레드는 코어 수 만큼 동시에 돌아간다.
        • 예를 들어 코어1개에 2개의 쓰레드를 수행 할 시 쓰레드를 바꿔가며 임무를 수행한다.
        • 이때 쓰레드를 바꾸는 작업을 컨텍스트 스위칭(Context Switching)이라고 한다.
  3. 쓰레드 생성에 재한이 없다.
    • 많은 요청이 올 때, CPU, 메모리 자원의 한계가 넘어 갈 수 있으며, 이때 서버는 죽을 수 있다.

* 쓰레드 풀(Thread Pool) on WAS

요청시 마다 쓰레드 생성에 대한 단점을 극복하고자 WAS는 쓰레드 풀(Thread Pool)을 도입한다.

 

쓰레드 풀이란?

말그대로 쓰레드가 뛰어노는(?) 풀장이라는 뜻이다.

클라이언트에서 수많은 요청이 올때, CPU, 메모리 등 서버머신의 리소스 한계를 넘어 설 수 있다.

이때 서버가 죽게 될 수도 있는데, 이때를 대비하여 WAS에서는 쓰레드 풀(Thread Pool)을 제공한다.

 

아래 그림을 보자.

Thread Pool on WAS

 

여러개의 클라이언트 요청이 들어오면 WAS는 쓰레드풀의 쓰레드를 활용한다.

그림에서는 200개의 쓰레드가 휴식을 취하고 있다고 가정한다.

 

클라이언트 요청이 들어오면 WAS는 휴식을 취하고 있는 200개의 쓰레드 중 하나를 활용하여 Servlet을 호출하여 임무를 수행한 다. 그 후 쓰레드 활용이 끝나면 쓰레드를 쓰레드풀에 반납한다.

이와 동시에 다른 요청이 들어온다고 하더라도 WAS는 당황할 필요없이, 쓰레드 풀의 쓰레드 하나를 꺼내 활용한다.

 

만약 200개 이상의 요청이 동시에 발생 할 시, WAS는 요청을 특정 갯수만큼 대기열에 등록 할 수 있기도 하며, 거절 할 수도 있다.

 

*쓰레드 풀의 특징

  • 쓰레드를 쓰레드풀에 보관하고 관리한다.
  • 쓰레드 풀에 생성가능한 쓰레드 최대갯수를 관리한다. Tomcat의 경우 200개가 기본설정 이다.
  • 쓰레드가 필요할 때, 쓰레드풀의 쓰레드를 꺼내어 활용한다.
  • 쓰레드 사용 종료시 쓰레드를 쓰레드풀에 반납한다.
  • 쓰레드 풀의 쓰레드가 모두 사용중일때 요청을 거절하거나 특정 요청갯수만큼 대기열을 설정할 수 있다.
  • 쓰레드가 미리 생성되어 있기 때문에, 쓰레드 생성,종료에 필요한 리소스를 줄일수 있으며, 빠른 응답시간을 보장 할 수 있다.
  • 생성가능한 쓰레드의 최대갯수를 설정해 놓기 때문에, 수많은 요청에도 기존에 처리하고 있는 요청은 안전하게 임무를 수행 할 수 있다.

 

 

 

'Spring Boot > 4. SpringMVC part1' 카테고리의 다른 글

4. MVC패턴  (0) 2021.06.01
2-3. CSR , SSR  (0) 2021.06.01
2-1. 서블릿(Servlet)  (0) 2021.06.01
1. Web Application 이란?  (0) 2021.06.01
0. 개요  (0) 2021.06.01