본문 바로가기

Spring

스레드 풀

1) 클라이언트로부터의 다중 요청

- 서버 어플리케이션을 운영하다 보면 클라이언트로부터 다중 요청이 발생합니다.

  자바는 기본적으로 멀티 스레드를 지원하므로, 다중 요청에 대해 여러 개의 스레드를 통해서 처리가 가능합니다.

  이 때, 요청에 대해 응답하기 위한 스레드를 관리하는데는 2가지 방식이 있습니다.

  (1) 요청마다 스레드 생성  

  (2) 스레드 풀 

 

2) 요청마다 스레드 생성

- 요청마다 스레드를 생성하는 것은 장단점이 있습니다. 

  

  장점

  (1) 동시 요청을 처리할 수 있음

  (2) 리소스(CPU, 메모리 등)가 허용하는 범위에서 처리할 수 있음

  (3) 하나의 스레드가 지연되어도 나머지 스레드가 정상 동작함

 

  단점

  (1) 스레드는 생성 비용이 매우 비쌈

   -> 고객의 요청이 올때마다 스레드를 생성하면, 응답 속도가 늦어짐

  (2) 스레드는 컨텍스트 스위칭 비용이 발생함

  (3) 스레드 생성에 제한이 없음

  -> 고객 요청이 너무 많으면 CPU, 메모리의 임계점이 넘어서 서버가 죽을 수 있습니다. 

 

 

3) 스레드 풀

- 스레드 풀은 요청마다 스레드 생성의 단점을 보완하는 기술입니다.

  

 (1) 특징

- 스레드 풀의 특징은 필요한 스레드를 스레드 풀에 넣고 관리하며,

  스레드 풀에 생성 가능한 최대치의 스레드를 관리하는 것입니다. 

  예를 들어, 톰캣의 경우는 최대 200개로 기본 설정이 가능합니다 .

 

(2) 사용

- 스레드 풀의 사용 순서는 다음과 같습니다.

  (1) 스레드가 필요하면, 이미 생성되어 있는 스레드를 스레드 풀에서 꺼내서 사용합니다.

  (2) 스레드 사용을 종료하면, 스레드 풀에 해당 스레드를 반납합니다. 

  (3) 만약 최대 스레드가 모두 사용중이어서, 스레드 풀에 스레드가 없으면

       기다리는 요청은 모두 거절하거나, 특정 숫자만큼만 대기하도록 할 수 있습니다. 

 

(3) 장점

- 스레드 풀은 요청마다 스레드를 생성하는 방식 대비 2가지 장점을 갖고 있습니다.

  (1) 스레드가 미리 생성되어 있으므로, 스레드를 생성하고 종료하는 비용이 절약되고, 응답이 빠릅니다. 

  (2) 생성 가능한 스레드의 최대치가 있으므로, 너무 많은 요청이 와도 기존 요청을 안전하게 처리할 수 있습니다. 

 

(4) 실무 팁

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

  이 경우, 최대 스레드 수를 너무 낮게 설정하거나, 너무 높게 설정하면 문제가 발생할 수 있습니다.

  (1) 너무 낮게 설정할 때

  - 최대 스레드 수를 너무 낮게 설정하면, 동시 요청이 많을 때,

    서버 리소스는 여유가 있지만, 클라이언트는 금방 응답 지연이 발생합니다. 

  (2) 너무 높게 설정할 때

  - 최대 스레드 수를 너무 높게 설정하면, 동시 요청이 많을 때,

    CPU, 메모리 리소스 초과로 서버가 다운 될 수 있습니다. 

  (3) 스레드 풀의 적정 숫자

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

  -> 결국은 최대한 실제 서비스와 유사하게 성능 테스트를 시도해야 합니다. 

 

(5) WAS의 멀티 스레드 지원

- 멀티 스레드에 대한 부분은 WAS가 처리해줍니다.  

-> 개발자는 멀티 스레드 코드를 신경 쓰지 않아도 되고,

    마치 싱글 스레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발할 수 있습니다. 

-> 단, 멀티 스레드 환경이므로 싱글 스레드(서블릿, 스프링 빈)는 주의해서 사용해야 합니다. 

 

 

참고

김영한 스프링 MVC 1편 

 

 

'Spring' 카테고리의 다른 글

컴포넌트 스캔  (0) 2022.08.19
웹 서버와 WAS  (0) 2022.08.14
싱글톤 컨테이너  (0) 2022.08.13
Spring 로깅  (0) 2022.08.08
서블릿  (0) 2022.07.27