WAS와 Multi thread

스프링 MVC 1편 강의 정리

요청 & 응답 과정

  • 클라이언트에서 요청
  • TCP/IP 연결이 됨
  • WAS 내에서 스레드가 서블릿 객체를 호출하게 됨

Thread

  • 애플리케이션 코드를 하나 하나 순차적으로 실행하는 것
  • 자바 메인 메서드를 처음 실행하면 main이라는 이름의 스레드가 실행됨
  • 스레드가 없으면 자바 애플리케이션 실행이 불가능함
  • 스레드는 한 번에 하나의 코드 라인만 수행
  • 동시 처리가 필요하면 스레드를 추가 생성
  • 스레드 하나 사용해서 단일 요청 처리할 경우
    • 스레드가 휴식 중일 때 요청이 오면 스레드 할당
    • 스레드를 가지고 서블릿 코드를 실행
    • 응답을 한 후 스레드 휴식
  • 스레드 하나 사용해서 다중 요청 처리할 경우
    • 스레드가 하나의 요청을 처리중일 때, 또 다른 요청이 있으면 스레드를 대기하게 됨
    • 처리가 지연되면 모든 요청이 지연이 생기게 됨
  • 위의 문제를 해결하기 위해 요청마다 스레드 생성

요청마다 스레드 생성

  • 장점
    • 동시 요청 처리 가능
    • 리소스(CPU, 메모리)가 허용할 때까지 처리 가능
    • 하나의 스레드가 지연되어도 나머지 스레드는 정상 동작
  • 단점
    • 스레드 생성 비용이 매우 비쌈
    • 요청이 올때마다 스레드를 생성하면 응답 속도가 늦어짐
    • 스레드는 컨텍스트 스위칭 비용 발생함
      • 스레드 전환할 때 드는 비용
    • 스레드 생성에 제한이 없음
      • 요청이 너무 많을 경우, CPU나 메모리 임계점을 넘어서 서버가 죽을 수 있음

Thread Pool

  • 필요한 스레드를 스레드 풀에 보관하고 관리
  • 생성 가능한 최대치 관리 (톰캣은 최대 200개 기본)
  • 요청이 오면 스레드 풀에서 이미 생성된 스레드를 사용하게 됨
  • 응답을 한 후에는 스레드를 다시 스레드 풀에 반환
  • 스레드 풀을 초과하는 요청이 올 경우, 대기하거나 거절할 수 있음
  • 장점
    • 스레드가 미리 생성되어 있어 생성 & 종료 비용(CPU)가 절약되고 응답 시간이 빠름
    • 생성 가능한 스레드의 최대치가 있어 너무 많은 요청이 들어와도 기존 요청을 안전하게 처리 가능

Thread Pool 성능 튜닝

  • WAS의 주요 튜닝 포인트는 최대 스레드 수
  • 이 값이 너무 낮을 경우
    • 동시 요청이 많을 때 서버 리소스는 여유롭지만, 클라이언트는 응답 지연
  • 이 값이 너무 높을 경우
    • 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버 다운
  • 장애 발생할 경우
    • 클라우드이면 서버 늘리고 이후에 튜닝
    • 클라우드가 아닐 경우 튜닝
  • 적정 값은 애플리케이션 로직의 복잡도, CPU, 메모리, I/O 리소스 상황에 따라 다름
  • 최대한 실제 서비스와 유사하게 성능 테스트를 시도해서 찾을 수 있음
    • Apache ab, JMeter, nGrinder

WAS & Multi Thread

  • 멀티 스레드에 대한 부분은 WAS가 처리함
  • 멀티 스레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)은 주의해서 사용