스레드

bo04·2022년 5월 31일
0

spring-mvc1

목록 보기
3/9


결과적으로 클라이언트가 요청하고 was가 응답하는건 알겠는데 was에서 tcp/ip로 클라이언트와 연결되고나서 도대체 누가 servlet을 호출해주는걸까? 그 중간다리가 뭘까? -> 쓰레드가 연결해준대! 근데 쓰레드는 뭐야?

쓰레드

애플리케이션 코드를 순차적으로 하나식 실행하는것. 자바의 main()도 쓰레드임.

was와 연결되고나서 맞는 쓰레드를 할당해주고 그 쓰레드가 servlet을 호출함.

만약 멀티 스레드가 아니라면?


한 스레드가 지연될때마다 새로운 스레드를 만들어서 지연되는동안 다른 스레드에서 작업을 하려고 하면 어떤 일이 발생할까

  • 동시 요청을 처리할 수 있으나 한 스레드가 먹는 리소스가 상당하기 때문에 비용적으로나 속도면에서 효율이 좋지 않음
  • cpu core가 스레드의 수보다 훨씬 작다면, 여러 스레드를 계속 전환하면서 수행하려고 하면 컨텍스트 스위칭 비용이 발생함
  • 스레드 생성에 제한이 없어서 갑자기 클라이언트 요청이 몰리면 임계점을 넘어서 서버가 죽을 수 있음

스레드 풀

스레드 생성이 제한이 없어서 문제라면 그 제한만큼 미리 스레드를 만들어놓고 그 스레드만 사용하면 되지 않을까? -> 스레드 풀 등장!

사용하지 않는 미리 만들어놓은 스레드들을 스레드 풀에 넣어놓고 필요할때마다 꺼내서 스레드를 사용함. 모든 스레드가 사용중이라서 스레드 풀에 있는 스레드가 없다면 스레드를 다 써서 다시 반납될때까지 요청은 대기하거나 거절당하는 상태에 처함.

  • 미리 스레드가 스레드풀에 생성되어 있으므로 스레드를 생성, 종료하는 비용이 적어서 응답 시간이 빠름
  • 스레드 생성 제한 때문에 서버가 죽는걸 예방할 수 있음

그러므로 was의 주요 튜닝 포인트는 최대 스레드로 설정하는 것임. 너무 적게 설정하면 서버 리소스는 여유로운데 클라이언트 요청은 너무 오래 지연되고, 반대로 너무 높게 설정하면 서버가 죽어버림.
그럼 이 적절한 수는 어떻게 찾을까?

  • 일단 모두 다 다름.
  • 최대한 비슷한 환경에서 성능 테스트하면서 맞추면 됨

멀티 스레드

was의 가장 큰 좋은점은 멀티 스레드를 지원해준다는 점인데 개발자는 스레드 풀에서 최대 스레드의 수만 잘 설정해주기만하면 그외 나머지 미리 스레드 할당이라던가 요청마다 스레드 할당해주는 모든 작업들은 was가 알아서 처리해줌.

하지만 멀티 스레드를 지원해주므로 개발자는 서블릿이나 스프링 빈같은 싱글톤 객체를 주의해서 사용해야됨

0개의 댓글