요청이 오면 servlet과 연결을 해야하는데, 요청마다 쓰레드를 할당받고 쓰레드가 servlet을 호출하여 code를 실행한다.
즉, servlet을 호출할 때, 서블릿 객체를 호출하는 것은 쓰레드 단위이다.
동시 요청이 필요하다면 요청마다 쓰레드를 생성해서 멀티쓰레드를 사용하면 된다.
동시 요청을 처리할 수 있다.
리소스(CPU,메모리)가 허용될 때 까지 요청을 처리할 수 있다.
하나의 쓰레드가 지연되어도 나머지 쓰레드가 정상적으로 동작한다.
쓰레드의 생성 비용이 비싸고 오래 걸려서 클라이언트에게 응답하기까지 속도가 늦어진다.
컨텍스트 스위칭 비용이 발생한다.
쓰레드 생성에 제한이 없다. -> 고객의 요청이 너무 많으면 CPU,메모리 임계점을 넘어서 서버가 죽을 수 있다.
요청마다 쓰레드 생성의 단점을 보완 하기위해 쓰레드 풀은 생성 가능한 쓰레드의 개수의 최대치를 관리한다.
예를들어 쓰레드 풀을 200개라면 200개의 요청까지는 쓰레드 풀에 있는 쓰레드를 사용하여 서블릿을 호출할 수 있다.
사용을 종료하면 쓰레드 풀에 해당하는 쓰레드를 반납한다.
200개의 요청이 실행중일 때, 더 많은 요청이 오면 쓰레드 풀에서 대기하거나 거절한다.
쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용이 절약되고 응답시간이 빠르다.
생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
WAS의 주요 튜닝 포인트는 최대 쓰레드의 수이다.
최대 쓰레드를 너무 낮게 설정하면 동시 요청이 많을 때, 서버 리소스는 여유롭지만 클라이언트는 응답 지연 상태가 된다.
그렇다고 최대 쓰레드를 너무 높게 설정하면 동시 요청이 많을 때, CPU, 메모리 리소스 임계점 한계로 서버가 다운된다.
최대 쓰레드의 값은 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다르다.
그러므로 최대한 실제 서비스와 유사하게 성능 테스트가 중요하다.
툴: 아파치 ab, 제이미터, nGrinder
멀티 쓰레드에 대한 부분은 WAS가 처리한다.
멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)은 사용을 주의해야한다.