Spring MVC - 멀티 쓰레드

YUNU·2023년 8월 10일
0

스프링

목록 보기
22/33
post-thumbnail

🪴 Spring MVC

🔵 멀티 쓰레드


🔷 클라이언트가 서버로 요청을 보낼 때

  1. 클라이언트가 서버로 요청보냄

  2. TCP/IP 커넥션 연결

  3. servlet 호출

  4. WAS가 응답

✅ 누가 서블릿 객체를 호출하는가?

➡️ 쓰레드❗


🟦 쓰레드

🔹 애플리케이션 코드를 순차적으로 실행시킴

🔹 쓰레드가 없다면 자바 애플리케이션 실행 불가능

자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행됨

🔹 쓰레드는 한번에 하나의 코드 라인만 수행

🔹 동시 처리가 필요하면 쓰레드 추가로 생성해야함

🔷 쓰레드가 1개인 경우

▪️ 단일 요청

  1. 요청이 오면 쓰레드 할당

  2. 쓰레드를 가지고 서블릿 실행

  3. 서버에서 클라이언트로 응답 보냄

  4. 쓰레드 휴식

▪️ 다중 요청

  1. 요청1이 오면 쓰레드 할당

  2. 요청1 처리 중(처리 지연)에 요청2가 들어옴

  3. 요청1이 처리 지연, 요청2는 대기

  4. 요청1과 요청2 모두 죽음

    ➡️ 쓰레드를 추가 생성하여 문제 해결


🔷 요청 마다 쓰레드 생성?

🔹 장점

  • 동시 요청 처리 O

  • 리소스(CPU, 메모리)가 허용할 때까지 처리 가능

  • 하나의 쓰레드가 지연되어도 나머지 쓰레드들은 정상 동작

🔹 단점

  • 쓰레드 생성 비용이 매우 비쌈(CPU 소모 큼)
    ➡️ 응답 속도 느려짐

  • 쓰레드는 컨텍스트 스위칭 비용 발생
    CPU는 한 번에 하나만 처리 가능

  • 요청이 너무 많으면 서버가 다운될 수 있음
    쓰레드는 생성에 제한이 없어 요청이 너무 많으면 CPU, 메모리가 버티지 못함


🟦 쓰레드 풀

쓰레드를 미리 생성, 작업 요청이 발생할 때 마다 미리 생성된 쓰레드로 해당 작업을 처리

필요한 쓰레드를 쓰레드 풀에 보관하고 관리

쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리

쓰레드 사용을 종료하면 쓰레드 풀에 해당 쓰레드 반납

➡️ 요청마다 쓰레드 생성하는 단점 보완

예시)
쓰레드 풀에 쓰레드 200개 존재, 200개의 쓰레드가 실행중

-> 추가로 들어온 요청은 대기 or 거절 

🔹 쓰레드가 미리 생성되어 있음
➡️ 쓰레드를 생성, 종료하는 비용 절약 + 응답 시간 빠름

🔹 생성 가능한 쓰레드의 최대치 제한
➡️ 너무 많은 요청이 들어와도 기존 요청들은 안전하게 처리

WAS의 주요 튜닝 포인트 -> max thread

max thread가 너무 낮음
➡️ 동시 요청이 많을 때, 서버 리소스는 여유롭지만(CPU 사용률이 낮을 것) 클라이언트는 응답 지연 

max thread가 너무 높으면
➡️ 동시 요청이 많을 때, CPU▪️메모리 리소스 임계점 초과로 서버가 다운될 것

장애 발생났을 때
➡️ 클라우드면 일단 서버를 증설하고 이후에 튜닝
➡️ 클라우드가 아니라면 튜닝 열심히

🔷 적정한 쓰레드 풀

성능 테스트를 통해서 적정 숫자를 찾아야 함
➡️ 최대한 실제 서비스와 유사하게 성능 테스트 시도

애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다름


🟦 WAS는 멀티 쓰레드를 지원함

멀티 쓰레드에 대한 부분은 WAS가 처리

➡️ 개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨❗

➡️ 서블릿 내의 비즈니스 로직 부분만!

➡️ 개발자는 싱글 쓰레드 프로그래밍 하듯이 소스 코드 개발 OK

다만, 멀티쓰레드 환경이기에 싱글톤 객체인 서블릿, 스프링 빈 사용할 때는 주의해야



인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (김영한) 참조

profile
DDeo99

0개의 댓글