김영한 대장님의 스프링MVC1 편을 참고해서 작성 한 글 입니다.
우리가 네이버 메인 페이지에 접속하듯, 웹 클라이언트에 접속을하면
1. 메인 화면에 필요한 자료들을 보내달라며 http 요청 메소드를 was 에 보낼 것이다.
2. 그러면 우리 서버는 tip/ip 커넥션 연결 후 소캣을 기다리고 있다가 메세지를 받고
이 값을 서블릿 컨테이너로 보낸다.
3. `서블릿`을 누가 호출하는데???? -> 쓰레드가 호출한다.
프로세스
는 프로그램을 실행,
쓰레드
는 프로그램 실행 안에서 동작하는 것을 의미한다.
- 애플리케이션 코드 하나 하나 순차적으로 실행하는 것이 쓰레드이다.
- 자바 메인 메서드를 처음 실행하면 main 이라는 이름의 쓰레드가 제일 처음 실행된다.
- 쓰레드는 한번에 하나의 코드라인만 생성한다.
- 동시 처리가 필요하면 쓰레드를 추가로 생성한다.
요청이 오면, 쓰레드를 할당
하고, 그 쓰레드가 서블릿을 호출함.
그럼 서블릿이 작업을
하고 나서 결과물을 http 응답에 담아서 웹에 보낸다.
요청이 오면 쓰레드를 할당하고, 그 쓰레드가 처리 중에
시간이 오래 걸려서 처리 지연
이 발생함.
2번은 쓰레드 대기 상태로 기다리다가 타임 아웃 상태
가 와서 결국 2번 요청도 죽고 1번 요청도 제대로 수행이 안된 상태로 타임 아웃 상태로
죽게 되면 제대로 된 수행이 어려워짐.
요청이 오면 쓰레드를 할당하고, 그 쓰레드가 처리 중에
시간이 오래 걸려서 처리 지연
이 발생함.
2번도 쓰레드를 할당해줘서 개발을 진행하도록 함. (was) 가 구현 해줄거임.
컨텍스트 스위칭 비용
이 발생이런 단점을 극복할 수는 없을까?
위에 단점을 해결하기 위해서 was는 내부에 수영장 같은 쓰레드 풀이 있다.
1. 쓰레드 풀에서 쓰레드가 놀고 있다.( 맨처음 프로그램 실행하면 쓰레드를 미리 만들어 둠)
(톰캣은 최대 200개 기본으로 설정함)
2. 클라이언트 요청이 들어오면 놀고 있는 쓰레드 중 하나를 할당해준다.
3. 다쓰면 쓰레드를 죽이는게 아니라 쓰레드 풀에 반납한다.
WAS의 주요 튜닝 포인트는 최대 쓰레드(MAX thread) 수이다.
따라서 값을 너무 낮게 설정하면 동시 요청이 많을 때 클라이언트 응답이 지연될 수 있다.
값을 너무 높게 설정하면 cpu 임계점 초과로 서버가 다운 될 수도 있다.
장애 발생시에는
- 클라우드면 일단 서버부터 늘리고, 이후에 튜닝한다.
- 클라우드가 아니면 열심히 튜닝한다.
핵심은 와스가 멀티 쓰레드에 대한 부분을 해결해준다.
개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨
멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈) 는 주의해서 사용해야 한다.
-> 멤버 변수가 공유되기 때문에 싱글톤은 주의해서 해야함.
지난 시간에는 서블릿에 대해서 배웠었는데, http 요청과 응답 메세지를
대신 만들어주는 것까지 이해 했는데, 누가 이걸 호출하는가에 대해서는
명확하게 몰랐다. 이번 시간을 통해서 호출하는 주체가 쓰레드이고, 요청이 여러개 일 때
멀티 쓰레드를 사용하면 동시 요청 처리가 가능하게 해주며 멀티 쓰레드는 요청이 들어올 때마다 쓰레드를 생성해줘야하는데, 그 비용이 비싸고, 임계점을 넘으면 죽을수도 있어서
이런 점들을 해결하기 위한 수영장인 쓰레드 풀이 있다는 것을 알게 되었고, 쓰레드 풀은
처음부터 쓰레드를 만들어주고, 그 쓰레드를 활용해서 빌리고 반납하며 써서
쓰레드를 많이 필요로 할 경우 생성할 때 발생하는 비용을 줄이고, 최대로 호출 가능한
횟수도 제한 할 수 있어 효율적인 방법인 것을 알게 되었다.