반응형
Spring Boot로 웹 애플리케이션을 개발하면서 application.yml에 있는 Tomcat 설정들을 본적은 있지만 별 생각 없이 무심하게 지나쳤다. 하지만 이 설정들이 정확히 무엇을 의미하고, 어떤 역할을 하는지 궁금해 졌다.
server:
tomcat:
max-connections: 8192
accept-count: 100
threads:
max: 200
본 포스팅에서는 Tomcat의 세 가지 핵심 설정인 accept-count, max-connections, threads.max가 클라이언트 요청을 처리하는 과정에서 각각 어떤 역할을 하는지 정리했다.
설정들의 역할
그 전에 알아야 할 것
- HTTP는 TCP를 기반으로 동작한다
- 클라이언트와 서버간 연결을 위해 3-hand-shake가 이루어진다
- 클라이언트가 SYN을 보냄
- 서버가 SYN-ACK로 응답
- 클라이언트가 ACK로 확인
- 이 과정을 통해 양쪽 모두 통신 준비가 되었음을 확인
- 톰캣은 클라이언트와의 소켓 연결부터 처리를 위한 요청 처리를 위한 스레드할당까지 수행한다.
- 이 과정에 위 설정들이 필요한 것이다.
server.tomcat.accept-count
- OS의 Accept Queue 크기 설정
- 3-way handshake 중 SYN 수신 시 체크
- accept-count 초과 하면 클라이언트는 Connection refused 받는다.
- Tomcat이 accept()하기 전 연결들이 대기하는 공간
server.tomcat.max-connections
- 톰캣에서 유지하는 클라이언트의 최대 연결 수
- 톰캣과 연결되었다는 건?
- 클라이언트와 서버가 TCP 3-way handshake를 정상적으로 완료한 다음
- 톰캣에서 accept()를 호출해 연결된 클라이언트의 소켓을 가져온다.
- 소켓을 통해 클라이언트와 데이터를 주고 받을 수 있다.
- Tomcat은 최대 max-connections 개수만큼만 동시에 관리한다.
- max-connections 도달 시
- Acceptor 스레드는 accept() 호출을 멈추고 대기한다.
- 새 연결들은 Accept Queue에서 대기한다.
- 기존 연결이 종료되면 Acceptor 스레드가 accept() 호출을 재개한다.
server.tomcat.threads.max
- 실제 HTTP 요청을 처리하는 Worker Thread 수
- accept()된 소켓을 Worker Thread에 할당한다.
- threads.max 도달 시
- 소켓은 Connection Pool에 유지된다.
- Worker Thread가 생길 때까지 대기한다.
- 대기 시간이 길면 Read Timeout 발생한다.
요약
- accept-count : 연결 대기열의 크기
- max-connections : 동시 유지 가능한 연결 수
- threads.max : 실제 요청을 처리하는 작업 스레드 수
이 설정들은 서로 연관되어 있으며, 하나의 설정만 늘린다고 해서 전체 처리량이 증가하지 않는다. 각 단계의 병목 지점을 파악하고 균형있게 조정하는 것이 중요하다.
TCP 연결부터 요청 처리까지의 전체 흐름을 따라가며 각 설정이 어떻게 동작하는지 공부할 수 있었다.
반응형