본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : Thread, 쓰레드에 대해서

by 오주현 2022. 1. 18.
반응형

  • 클라이언트에서 서브를 요청하면 WAS가 응답을 하는 게 보통이다.
  • 서블릿은 누가 호출하지? 쓰레드가 호출한다.
  • 쓰레드란?
    • 애플리케이션 코드를 순차적으로 실행한다.
    • 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다.
      • 자바에서는 메인 메서드를 실행하게 되면 main이라는 이름의 쓰레드가 실행하게 된다.
    • 쓰레드는 한 번에 하나의 코드 라인만 수행한다.
    • 동시 처리에 경우 필요에 따라 쓰레드를 추가 생성한다.
  • 단일 요청 : 쓰레드를 하나만 사용한다.
    • 요청이 들어온다. → WAS에서 쓰레드를 할당한다. → 쓰레드는 서블릿을 호출한다. → 서블릿이 요청에 응답한다.
    • 위와 같은 원리로 움직이지만 만약 쓰레드 요청이 여러개 들어왔을 경우를 보자.
      • 요청이 들어왔고 쓰레드를 할당 받아서 서블릿을 호출하고 있는데 어떤 이유로 호출 처리가 지연되고 있다. 그 와중에 새로운 요청이 들어오면 새로운 요청은 아직 일 중인 쓰레드가 신경써주지 못 하기 때문에 대기하게 되고 이러다 둘 다 오류가 떠버리는 상황이 생기게 된다.
      • 이런 문제를 해결하기 위해 요청마다 쓰레드를 생성하게 된다.
  • 요청 마다 쓰레드 생성 : 요청에 맞춰 쓰레드를 생성해 준다.
    • 리소스(CPU, 메모리)가 허용될 때 까지 처리가 가능하고 하나의 쓰레드가 지연이 된다고 해도 나머지 쓰레드는 정상 동작하니 동시 요청을 처리할 수 있게 된다.
    • 하지만, 쓰레드 생성 비용은 매우 비싸고 요청마다 쓰레드를 생성하게 되면 응답 속도가 늦어지게 된다. 그리고 쓰레드 생성에 제한이 없기 때문에 요청이 급격하게 많아지면 리소스가 임계점을 넘어서 서버가 다운될 수가 있다.
    • 이런 문제를 해결하기 위해 쓰레드 풀이란 개념이 있다.
  • 쓰레드 풀 : 쓰레드를 미리 생성하여 모아두는 방식이다.
    • 쓰레드 풀에 쓰레드를 미리 생성해 두고 요청이 들어오면 쓰레드 풀에서 꺼내어 할당해 준다.
    • 쓰레드가 다 사용되고 나면 다시 쓰레드 풀로 쓰레드를 반납해서 재활용할 수 있다.
    • 요청이 들어왔을 때 만약, 쓰레드 풀에 쓰레드가 없다면 대기하거나 거절할 수가 있다.
    • 특징
      • 쓰레드 풀에 보관, 관리한다.
      • 쓰레드 풀에 생성 가능한 쓰레드 최대치를 관리하는데 톰캣은 최대 200개가 기본 설정이다.(변경이 가능하다.)
    • 장점
      • 쓰레드가 미리 생성되어 있기 때문에 쓰레드를 생성하고 종료하는 비용(CPU)이 절약이 된다. 또, 응답 시간 또한 빠르다.
      • 생성 가능한 쓰레드의 최대치가 있기 때문에 많은 요청이 들어와도 기존 요청은 안전하게 처리가 가능하다.
    • 실무 팁
      • WAS의 주요 튜닝 포인트는 최대 쓰레드, Max Thread 수 이다.
      • 값이 낮다면 → 동시 요청이 많으면 서버 리소스는 여유롭다. 하지만 클라이언트는 금방 응답 지연이 될 것이다.
      • 값이 높다면 → 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버가 다운된다.
      • 장애가 생기면 → 클라우드면 서버를 늘리고 후에 튜닝한다. 클라우드가 아니라면 열심히 튜닝하면 된다고 한다.
  • 쓰레드 풀 : 적정 숫자
    • 로직 복잡도, CPU, 메모리, IO 리소스 상황에 따라 모두 다르다.
  • WAS의 멀티 쓰레드 지원
    • 핵심
      • 멀티 쓰레드는 WAS가 처리한다. → 개발자가 신경을 안 써도 된다.
      • 싱글 쓰레드 프로그래밍 하듯이 개발하면 된다. → 하지만 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야한다.


스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부한 내용입니다.

반응형

댓글