Programming/SpringMVC

웹 애플리케이션 이해 - 동시 요청/멀티 쓰레드

rw- 2022. 12. 17. 14:05
728x90

쓰레드

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.(출저: 위키백과)

 

쓰레드에서 서블릿 객체를 호출해준다.

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

 

 

쓰레드를 하나만 사용할 경우 생기는 문제

하나의 웹 브라우저에서 요청1을 한 상황에서 쓰레드가 요청1을 서블릿을 호출해 처리하는 과정에서 어떠한 이유로 처리가 지연되는 상황이다. 이때 다른 웹 브라우저에서 요청2를 한 상황이라면 WAS에서는 요청2를 처리해줘야 하지만 쓰레드는 요청1을 처리하고 있는 상황이기 때문에 쓰레드를 대기해야한다.

이 처리는 언제까지 지연될지 모르는 상태로 계속 지연되기 때문에 결국 두 요청 다 응답을 받지 못하는 문제가 생긴다.

 

 

쓰레드를 요청마다 생성

요청1이 처리가 지연되고 있지만, 요청2를 했을 때 신규 쓰레드가 생성되어 코드가 수행되기때문에 요청2는 제대로 응답을 받을 수 있다.

 

장점

  • 동시 요청을 처리할 수 있다.
  • 리소스(CPU, 메모리)가 허용할 때까지 처리가 가능하다.
  • 하나의 쓰레드가 지연되어도, 나머지 쓰레드는 정상 동작한다.

 

단점

  • 쓰레드의 생성비용은 매우 높다.
    • 고객이 요청할 때마다 쓰레드를 생성하면, 응답 속도가 늦어진다.
  • 쓰레드는 컨텍스트 스위칭 비용이 발생한다.
  • 쓰레드 생성에 제한이 없다.
    • 고객 요청이 너 무 많아지면 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.
컨텍스트 스위칭 : CPU가 어떤 프로세스를 실행하고 있는 상태에서 인터럽트에 의해 다음 우선 순위를 가진 프로세스가 실행되어야 할 때 기존의 프로세스 정보들은 PCB에 저장하고 다음 프로세스 정보를 PCB에서 가져와 교체하는 작업을 컨텍스트 스위칭이라 한다. (출저: 위키백과)

 

 

쓰레드 풀

쓰레드 요청마다 생성하는 것의 단점을 보완하고자 나온 것이 쓰레드 풀 이다.

특징

  • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다.
  • 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다.

 

사용

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

 

장점

  • 쓰레드가 미리 사용되어 있기에 쓰레드 생성/소멸 비용이 절약되고 응답 시간이 빠르다.
  • 생성 가능한 쓰레드의 최대치가 있기에 너무 많은 요청이 들어와도 기본 요청은 안전하게 처리가 가능하다.

 

 

쓰레드풀 실무 팁

  • was의 주요 튜닝 포인트는 최대 쓰레드(max thread)이다.
  • 이 값을 너무 낮게 설정할 경우? 동시 요청이 많으면 서버 리소스는 여유롭지만 클라이언트는 금방 응답이 지연된다.
  • 이 값을 너무 높게 설정하면? 동시 요청이 많으면, CPU, 메모리 리소스 임계점 초과로 서버 다운
  • 장애 발생시? 클라우드면 일단 서버부터 늘리고 이후 튜닝, 클라우드가 아니면 열심히 튜닝을 한다.

 

쓰레드 풀의 적정 숫자

쓰레드 풀의 숫자를 너무 높게도안되고 너무 낮게도 안되면 어떻게 해야할까?

이는 애플리케이션 로직의 복잡도, CPU, 메모리, IO리소스 상황에 따라 모두 다르다. 그래서 한번에 최적화된 쓰레드 풀의 적정숫자를 찾기는 힘들고 성능테스트가 필요하다.

실제 서비스와 유사한 성능테스트를 시도하기위해 툴을 사용할수도 있는데, 대표적으로 아파치ab, 제이미터 그리고 네이버에서 오픈소르로 만든 nGrinder가 있다.

 

 

핵심

  • 멀티쓰레드에 대한 부분은 WAS가 처리한다.
  • 개발자가 멀티쓰레드 관련 코드까지 신경쓸 필요는 없다.
  • 개발자는 싱글 쓰레드 프로그래밍을 하듯이 소스 코드를 개발하면 된다.
  • 하지만, 멀티 쓰레드 환경이기에 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야 한다.

 

출처: 인프런 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
728x90
반응형