동시 요청 - 멀티 쓰레드

수달·2021년 4월 24일
3

WEB

목록 보기
3/4

김영한 대장님의 스프링MVC1 편을 참고해서 작성 한 글 입니다.


😉 서버의 동작 과정 요약

우리가 네이버 메인 페이지에 접속하듯, 웹 클라이언트에 접속을하면


1. 메인 화면에 필요한 자료들을 보내달라며 http 요청 메소드를 was 에 보낼 것이다. 
2. 그러면 우리 서버는 tip/ip 커넥션 연결 후 소캣을 기다리고 있다가 메세지를 받고
	이 값을 서블릿 컨테이너로 보낸다. 
3. `서블릿`을 누가 호출하는데???? -> 쓰레드가 호출한다. 

🏃‍♀️쓰레드

프로세스는 프로그램을 실행,
쓰레드는 프로그램 실행 안에서 동작하는 것을 의미한다.

- 애플리케이션 코드 하나 하나 순차적으로 실행하는 것이 쓰레드이다. 
- 자바 메인 메서드를 처음 실행하면 main 이라는 이름의 쓰레드가 제일 처음 실행된다. 
- 쓰레드는 한번에 하나의 코드라인만 생성한다. 
- 동시 처리가 필요하면 쓰레드를 추가로 생성한다. 
 

단일 요청 - 쓰레드 하나 사용

요청이 오면, 쓰레드를 할당하고, 그 쓰레드가 서블릿을 호출함.
그럼 서블릿이 작업을
하고 나서 결과물을 http 응답에 담아서 웹에 보낸다.

다중 요청 - 쓰레드 하나 사용

  1. 요청이 오면 쓰레드를 할당하고, 그 쓰레드가 처리 중에
    시간이 오래 걸려서 처리 지연이 발생함.


  2. 2번은 쓰레드 대기 상태로 기다리다가 타임 아웃 상태가 와서 결국 2번 요청도 죽고 1번 요청도 제대로 수행이 안된 상태로 타임 아웃 상태로
    죽게 되면 제대로 된 수행이 어려워짐.

👩‍💻 이 문제점을 해결하려면 요청마다 쓰레드를 생성해주자.

  1. 요청이 오면 쓰레드를 할당하고, 그 쓰레드가 처리 중에
    시간이 오래 걸려서 처리 지연이 발생함.


  2. 2번도 쓰레드를 할당해줘서 개발을 진행하도록 함. (was) 가 구현 해줄거임.

요청마다 쓰레드를 생성하는 것에 장단점

  • 장점
    - 동시 요청 처리가 가능
    • 리소스가 허용할 때 까지 처리 가능
    • 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다.
  • 단점
    - 쓰레드 생성 비용은 매우 비쌈.
    (고객의 요청이 들어 올 때마다 쓰레드를 생성하면 응답속도가 느려짐)
    • 쓰레드는 컨텍스트 스위칭 비용이 발생
      -> 쓰레드가 여러개 일 때 코어 하나가 쓰레드 하나 실행하고 다음 것을 실핼 할 때
      실행 쓰레드를 전환할 때 발생하는 값이 컨텍스트 스위칭 비용
    • 쓰레드를 너무 많이 생성하면 cpu 가 감당할 수 있는 메모리 임계점을 넘어 서버가 죽을 수 있음

이런 단점을 극복할 수는 없을까?

🏖쓰레드 풀

위에 단점을 해결하기 위해서 was는 내부에 수영장 같은 쓰레드 풀이 있다.
1. 쓰레드 풀에서 쓰레드가 놀고 있다.( 맨처음 프로그램 실행하면 쓰레드를 미리 만들어 둠)
(톰캣은 최대 200개 기본으로 설정함)
2. 클라이언트 요청이 들어오면 놀고 있는 쓰레드 중 하나를 할당해준다.
3. 다쓰면 쓰레드를 죽이는게 아니라 쓰레드 풀에 반납한다.

쓰레드 풀 장점

  1. 쓰레드 풀에 생성되어있는 쓰레드 개수보다 요청이 더 많이 들어오면
    요청을 대기 상태 or 거절을 할 수 있다.
  2. 쓰레드가 미리 생성되어 있으므로 쓰레드를 생성하고, 종료하는 비용(CPU)가 절약되고,
    응답 시간이 빠르다.
  3. 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 와도 기존 요청을 안전하게 처리할 수 있다.

영한님의 꿀팁

  1. WAS의 주요 튜닝 포인트는 최대 쓰레드(MAX thread) 수이다.
    따라서 값을 너무 낮게 설정하면 동시 요청이 많을 때 클라이언트 응답이 지연될 수 있다.

    값을 너무 높게 설정하면 cpu 임계점 초과로 서버가 다운 될 수도 있다.

장애 발생시에는
- 클라우드면 일단 서버부터 늘리고, 이후에 튜닝한다.
- 클라우드가 아니면 열심히 튜닝한다.

쓰레드 풀의 적정 숫자

  • 애플리케이션 로직의 복잡도, cpu, 메모리, IO 리소스 상황에 따라 모두 다르다.
  • 성능 테스트
    - 최대한 실제 서비스와 유사하게 성능 테스트를 시도한다.
    • 툴( 아파치 ab, 제이미터, nGrinder)

WAS의 멀티 쓰레드 지원

핵심은 와스가 멀티 쓰레드에 대한 부분을 해결해준다.
개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨
멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈) 는 주의해서 사용해야 한다.
-> 멤버 변수가 공유되기 때문에 싱글톤은 주의해서 해야함.

느낀점

지난 시간에는 서블릿에 대해서 배웠었는데, http 요청과 응답 메세지를
대신 만들어주는 것까지 이해 했는데, 누가 이걸 호출하는가에 대해서는
명확하게 몰랐다. 이번 시간을 통해서 호출하는 주체가 쓰레드이고, 요청이 여러개 일 때
멀티 쓰레드를 사용하면 동시 요청 처리가 가능하게 해주며 멀티 쓰레드는 요청이 들어올 때마다 쓰레드를 생성해줘야하는데, 그 비용이 비싸고, 임계점을 넘으면 죽을수도 있어서
이런 점들을 해결하기 위한 수영장인 쓰레드 풀이 있다는 것을 알게 되었고, 쓰레드 풀은
처음부터 쓰레드를 만들어주고, 그 쓰레드를 활용해서 빌리고 반납하며 써서
쓰레드를 많이 필요로 할 경우 생성할 때 발생하는 비용을 줄이고, 최대로 호출 가능한
횟수도 제한 할 수 있어 효율적인 방법인 것을 알게 되었다.

profile
짜장면 쟁이

0개의 댓글