WAS와 Multi thread
02 Apr 2023스프링 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가 처리함
- 멀티 스레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)은 주의해서 사용