클라이언트가 서버로 요청보냄
TCP/IP 커넥션 연결
servlet 호출
WAS가 응답
🔹 애플리케이션 코드를 순차적으로 실행시킴
🔹 쓰레드가 없다면 자바 애플리케이션 실행 불가능
자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행됨
🔹 쓰레드는 한번에 하나의 코드 라인만 수행
🔹 동시 처리가 필요하면 쓰레드 추가로 생성해야함
▪️ 단일 요청
요청이 오면 쓰레드 할당
쓰레드를 가지고 서블릿 실행
서버에서 클라이언트로 응답 보냄
쓰레드 휴식
▪️ 다중 요청
요청1이 오면 쓰레드 할당
요청1 처리 중(처리 지연)에 요청2가 들어옴
요청1이 처리 지연, 요청2는 대기
요청1과 요청2 모두 죽음
➡️ 쓰레드를 추가 생성하여 문제 해결
🔹 장점
동시 요청 처리 O
리소스(CPU, 메모리)가 허용할 때까지 처리 가능
하나의 쓰레드가 지연되어도 나머지 쓰레드들은 정상 동작
🔹 단점
쓰레드 생성 비용이 매우 비쌈(CPU 소모 큼)
➡️ 응답 속도 느려짐
쓰레드는 컨텍스트 스위칭 비용 발생
CPU는 한 번에 하나만 처리 가능
요청이 너무 많으면 서버가 다운될 수 있음
쓰레드는 생성에 제한이 없어 요청이 너무 많으면 CPU, 메모리가 버티지 못함
쓰레드를 미리 생성, 작업 요청이 발생할 때 마다 미리 생성된 쓰레드로 해당 작업을 처리
필요한 쓰레드를 쓰레드 풀에 보관하고 관리
쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리
쓰레드 사용을 종료하면 쓰레드 풀에 해당 쓰레드 반납
➡️ 요청마다 쓰레드 생성하는 단점 보완
예시)
쓰레드 풀에 쓰레드 200개 존재, 200개의 쓰레드가 실행중
-> 추가로 들어온 요청은 대기 or 거절
🔹 쓰레드가 미리 생성되어 있음
➡️ 쓰레드를 생성, 종료하는 비용 절약 + 응답 시간 빠름
🔹 생성 가능한 쓰레드의 최대치 제한
➡️ 너무 많은 요청이 들어와도 기존 요청들은 안전하게 처리
WAS의 주요 튜닝 포인트 -> max thread
max thread가 너무 낮음
➡️ 동시 요청이 많을 때, 서버 리소스는 여유롭지만(CPU 사용률이 낮을 것) 클라이언트는 응답 지연
max thread가 너무 높으면
➡️ 동시 요청이 많을 때, CPU▪️메모리 리소스 임계점 초과로 서버가 다운될 것
장애 발생났을 때
➡️ 클라우드면 일단 서버를 증설하고 이후에 튜닝
➡️ 클라우드가 아니라면 튜닝 열심히
성능 테스트를 통해서 적정 숫자를 찾아야 함
➡️ 최대한 실제 서비스와 유사하게 성능 테스트 시도
애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다름
멀티 쓰레드에 대한 부분은 WAS가 처리
➡️ 개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨❗
➡️ 서블릿 내의 비즈니스 로직 부분만!
➡️ 개발자는 싱글 쓰레드 프로그래밍 하듯이 소스 코드 개발 OK
다만, 멀티쓰레드 환경이기에 싱글톤 객체인 서블릿, 스프링 빈 사용할 때는 주의해야
인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (김영한) 참조