아래 영상을 보고 정리한 내용입니다.
🎥 톰캣 #09 쓰레드
🗒️ Tomcat - 09 톰켓 쓰레드
Thread란?
간단한 예시 )
- 하나의 길 == 하나의 쓰레드 라고 생각하면, 이 길에는 같은 동시간대에 차량 두대만이 지나갈 수 있다.
- 즉, 자동차가 지나가는 것 == 요청이라 한다면, 동시간 대에는 동시에 처리할 수 있는 요청의 수가 정해져 있다는 것이다.
- 만약 들어오는 요청이 많다면? 이러한 도로를 넓히는 작업, 도로를 증가시키고 생성한다.
Thread 설정
- 기본적으로 커넥터에 종속된다.
- 커넥터에 기본적으로 들어있는 것
- 8080 port HTTP Protocol
- 8009 port AJP Protocol
- 각 커넥터에 별도로 쓰레드를 각각 정하기 보다는, shared excuter에 정의하는 쓰레드를 상속받아서 하나의 쓰레드 풀에서 관리할 수 있게 한다.
기본값으로 최대 쓰레드 200개의 설정을 가지고 있다.
- Default Max Thread Value = 200
Attribute | Description |
---|
maxSpareThreads | Idle 상태로 유지할 max thread pool size |
maxThreads | 동시 요청에 의해 Connector가 생성 할 수 있는 최대 request 수 |
minSpareThreads | tomcat을 실행할때 최소로 유지할 Idle Thread 수 |
maxIdleTime | Thread를 유지하는 시간(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에서 제공하는 툴으르 사용하여 할 수도 있다.