동시요청 - 멀티 쓰레드

Mina Park·2023년 6월 20일

1. 쓰레드란?

  • 애플리케이션 코드를 하나씩 순차적으로 실행
  • 한번에 하나의 코드 라인만 수행
  • 동시 처리가 필요하다면? 쓰레드 추가 생성

2. 요청에 따른 쓰레드 사용 예시
1) 단일 요청: 쓰레드 하나 사용

  • 요청 > 연결 > 쓰레드 할당 > servlet 호출 > 응답 > 쓰레드 휴식
    2) 다중 요청: 쓰레드 하나 사용
  • 요청1 > 연결 > 요청1 처리중 > 요청2 > 연결 > 처리 지연(요청1 처리중)
    3) 요청시마다 쓰레드 생성
  • 장점
    • 동시 요청 처리 가능
    • 리소스(CPU, 메모리) 허용할 때까지 처리 가능
    • 하나의 쓰레드가 지연되어도 나머지 쓰레드 정상 동작
  • 단점
    • 높은 쓰레드 생성 비용, 컨텍스트 스위치 비용 발생
    • 쓰레드 생성 제한 없음 => 요청이 많아지면 리소스 임계점을 넘어 서버가 죽을 수 있음

3. 쓰레드 풀

  • 특징
    • 필요한 쓰레드를 쓰레드풀에 보관,관리
    • 쓰레드풀에 생성 가능한 최대 수: 톰캣의 경우 최대 200개(default)
  • 사용
    • 쓰레드 필요 > 생성되어 있는 쓰레드 꺼내 사용 > 사용 종료 후 반납
    • 최대 쓰레드가 모두 사용중이라면?
      • 기다리는 요청은 거절 or 특정 숫자만큼 대기하도록 설정 가능
  • 장점
    • 이미 생성된 쓰레드를 사용하므로 쓰레드 생성/종료 비용 절약 가능, 응답시간 단축
    • 생성 가능한 쓰레드 최대치가 있음 => 너무 많은 요청이 와도 기존 요청 안전하게 처리

실무에서의 쓰레드풀 사용 TIP

  • WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread) 수!
  • 최대 쓰레드 수 too low?
    • 동시요청이 많아지면 서버 리소스는 여유 but 클라이언트는 응답 지연
  • 최대 쓰레드 수 too high?
    • 동시요청이 많아지면 CPU/메모리 시소스 임계점 초과로 서버 다운
  • 쓰레드풀의 적정 숫자는 어떻게 설정할까?
    • 애플리케이션 로직의 복잡도, CPU/메모리, IO 리소스 상황에 따라 다름
    • 성능 테스트 진행

4. WAS의 멀티 쓰레드 지원

  • 사실상 WAS가 멀티 쓰레드에 대한 부분은 처리하므로, 개발자는 관련 코드를 신경쓸 필요는 없음
  • 마치 싱글 쓰레드 프로그래밍을 하듯 편리하게 소스 개발 가능
  • 단, 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 공유에 주의하여 사용 필요

0개의 댓글