톰캣 - 쓰레드

김멉덥·2023년 8월 5일
0

TIL

목록 보기
4/4
post-thumbnail

아래 영상을 보고 정리한 내용입니다.

🎥 톰캣 #09 쓰레드
🗒️ Tomcat - 09 톰켓 쓰레드


Thread란?

간단한 예시 )

  • 하나의 길 == 하나의 쓰레드 라고 생각하면, 이 길에는 같은 동시간대에 차량 두대만이 지나갈 수 있다.
  • 즉, 자동차가 지나가는 것 == 요청이라 한다면, 동시간 대에는 동시에 처리할 수 있는 요청의 수가 정해져 있다는 것이다.
  • 만약 들어오는 요청이 많다면? 이러한 도로를 넓히는 작업, 도로를 증가시키고 생성한다.

Thread 설정

  • 기본적으로 커넥터에 종속된다.
  • 커넥터에 기본적으로 들어있는 것
    • 8080 port HTTP Protocol
    • 8009 port AJP Protocol
  • 각 커넥터에 별도로 쓰레드를 각각 정하기 보다는, shared excuter에 정의하는 쓰레드를 상속받아서 하나의 쓰레드 풀에서 관리할 수 있게 한다.

기본값으로 최대 쓰레드 200개의 설정을 가지고 있다.

  • Default Max Thread Value = 200
AttributeDescription
maxSpareThreadsIdle 상태로 유지할 max thread pool size
maxThreads동시 요청에 의해 Connector가 생성 할 수 있는 최대 request 수
minSpareThreadstomcat을 실행할때 최소로 유지할 Idle Thread 수
maxIdleTimeThread를 유지하는 시간(ms)

ex) minSpareThreads = 10, maxSpareThreads = 5, maxThreads = 15 라고 한다면,

  • 서비스를 하다가 서비스가 지연되는 상황이 발생한다고 가정해보자.
  • 앞서 설정한 10개의 쓰레드에서 지연을 해결하기 위해 maxSpareThreads인 5개를 추가적으로 사용한다. 즉, 요청이 계속하여 증가한다면 예비 쓰레드를 생성하게 되는 것이다.
  • 그러나 10개+5개 = 15개이기 때문에 요청이 더 들어온다 해도 그 이상은 만들지 못한다. 아무리 요청이 많이 들어와도 톰캣에 있는 쓰레드는 maxThreads 값을 넘지 못한다.
  • 나중에 부하가 줄어들면 동시에 사용하는 쓰레드도 줄어들게 된다. 따라서 maxIdleTime을 벗어나면, 남아있는 쓰레드 중에서 안쓰는 쓰레드 일부를 자원적으로 반환한다. 그리고 minSpareThreads 수 만큼은 대기로 남아있는다.

이러한 설정값을 정하는 방법은 이렇게 커넥터에 넣어주면 된다.

그러나 커넥터가 실제로 받는 양이나 프로토콜 종류가 정해져있지 않을 수도 있고, 공통으로 관리되어야 할 필요가 있기 때문에 나온 디스크립터가 바로 executor이다.

  • executor에서는 쓰레드를 미리 정의하고, 각 커넥터에서 해당 executor 를 상속받아서 쓰레드 풀을 사용하게 되어있다.
  • 각 커넥터에서 별도로 쓰레드를 관리할 필요가 없다.

Thread Dump

  • 앞서 든 예시에 덧붙여 표현하자면, 길에 여러가지 종류의 차량이 다니는데 이러한 차에 대한 정보를 알려주는 역할이다.
  • 실행중인 Thread의 종류와 시작점, 실행한 클래스와 메소드 순서, 현재 상태등을 기록하는 JVM의 고유 기능이다.
  • 쓰레드 덤프로 서비스의 흐름과 서비스 지연시 수행중인 작업, 병목등을 확인할 수 있다.
  • 쓰레드 덤프의 시작에는 쓰레드 이름과 쓰레드의 정보가 기록되며 이후 쓰레드 상태에 대해 설명해준다.
  • 트레이스의 읽는 순서는 위가 최근 실행한 클래스와 메소드이기 때문에 아래서부터 위로 읽습니다.

쓰레드 덤프를 남기는 방법

  • 쓰레드 덤프 남기기
  • JVM에서 제공하는 툴으르 사용하여 할 수도 있다.
profile
데굴데굴

0개의 댓글