-
Spring Boot Tomcat의 Thread, Connection, Queue 이야기 (1)Spring 2025. 3. 23. 18:13
Spring Boot를 사용해 개발하시는 분들이라면 한번쯤은 이런 고민을 해보셨을겁니다.
동시에 몇개가 처리 가능할지, 나의 서버에서는 Thread, Connection, Queue에 대해 어느 정도로 설정해야 최적화된걸까?
이런것들을 알기위해선 어떻게 동작하고 있는지를 먼저 정확하게 파악할 필요가 있다고 생각하였습니다.
이 글에서는 TCP, Thread Pool, NIO 에 대해서 다뤄집니다.아무런 설정을 하지 않는다면 몇개의 thread로 동시에 처리할 수 있을까?
기본적으로 Spring Boot를 실행하게 되면 톰캣은 아래와 같은 기본 설정값을 가지고 있습니다.
server: tomcat: threads: max: 200 # 생성할 수 있는 thread의 촛 갯수 min-spare: 10 # 항상 활성화 되어있는 (idle) thread 개수 max-connections: 8192 # 수립가능한 connection의 총 갯수 accept-count: 100 # 작업큐의 사이즈 connection-timeout: 20000 # timeout 판단 기준
그럼 각 설정들이 어떤것을 의미하는지 분석해보겠습니다!
threads.max
- 쓰레드 풀이 동시에 사용할 수 있는 최대 쓰레드 갯수
- 동시에 100개의 요청이 온다면 대기 상태인 10개의 쓰레드를 제외한 90개의 쓰레드가 생성되어 100개의 요청을 동시 처리합니다.
threads.min-spare
- 기본적으로 쓰레드 풀에 대기 상태로 존재하는 쓰레드의 수
max-connections
- 8200 개의 요청이 온다면 8192개의 까지 요청을 받을 수 있고 나머지 8개는 받지 않습니다.
accept-count
- max-connections 이상의 요청이 들어왓을 때 사용되는 Queue입니다. 해당 설정은 OS에서 관리되는 설정으로 무시될 수 있습니다.
그러면 클라이언트 호출부터 Tomcat에서 요청을 받을때까지 어떻게 동작하는걸까..?
동작 순서의 경우는 서버 호출 시점부터 작성해보겠습니다.
클라이언트가 서버 Application 에 호출 (ex : serverDomain:8080 호출)
- 커널이 DNS로 IP 확인 후 connect() 호출 -> SYN 패킷 전송
- 서버 커널은 포트 8080에서 listen() 상태로 대기
(3번 ~ 6번 까지는 서버 커널 레벨입니다)
3. 커널이 SYN 패킷을 수신 -> SYN queue 에 보관
4. 서버 커널이 클라이언트에 SYN-ACK 전송
5. 클라이언트가 ACK 응답 -> 3handshake 완료
6. 커널이 Accept Queue에 커넥션 올림 (톰캣 설정에서 accept-count 가 여기에 해당됩니다)(7번 ~ 9번 까지는 WAS (Tomcat) 영역입니다)
7. Tomcat의 Acceptor 쓰레드가 accept() 호출 -> 이때 Socket FD가 생성됩니다.
8. Tomcat의 Poller 쓰레드가 FD를 Selector로 감시 (데이터가 수신되면 read() 호출해서 HTTP 파싱)
9. 요청 파싱 -> Request 객체로 생성 -> Controller로 위임 (이 이후는 Dispatcher Servlet과 연관되어있습니다)이런식으로 동작합니다.
accept count -> max-connections 순서이고,
max-connection이 꽉 차게 되면 Tomcat은 더이상 요청을 받지 않고 Accept-count (Accept Queue) 에 보관하고 FD도 생성되지 않습니다.실제로 테스트한 과정을 작성해보겠습니다.
FD 정보 (Socket FD 1개) max-connection 을 1으로 설정하고 3개의 요청을 하게되면 아래와 같이 fd가 1개만 생성됩니다.
FD 정보 (socket FD 3개) max-connection 을 3으로 설정하고 4개의 요청을 하게되면 아래와 같이 fd가 3개만 생성됩니다.
패킷 전송 과정 1번 2번 3번 과정을 통해 3handshake 과정이 일어난걸 확인할 수 있습니다.
근데 여기서 의문이 생겼습니다..
max-thread가 200개이면 동시에 처리할 수 있는 요청이 200개일까..?
다음편에서는 이거에 대해서 확인해보겠습니다!
'Spring' 카테고리의 다른 글
[Spring]Group, Artifact이란? (0) 2021.05.09