Connector란?
서블릿 컨테이너가 외부와 소통이 가능하게 하는 것을 말한다.
톰캣은 통신을 위해 자바의 IO 기술을 이용하는데 BIO와 NIO 기술이 있다.
JAVA Blocking IO
Blocking IO는 바이트 스트림을 기반으로 하며, 배열처럼 인덱스가 없고 단순한 데이터의 연속된 흐름이다.
Blocking IO 작업을 하게 되면 해당 쓰레드가 진행하는 작업을 중지해야 한다. 따라서 클라이언트 별로 분리된 연결 쓰레드가 생성되야 한다. 그러나 갑자기 접속자가 많아질 경우 쓰레드 수가 늘어나게 된다. 쓰레드가 많으면 많을수록 CPU의 컨텍스트 스위칭이 늘어 오버헤드가 증가하게 되고, 성능에 악영향을 일으키게 된다.
JAVA NIO
Java.nio는 소켓 연결을 위한 비차단 API로 스레드 수에 제한이 없고, 하나의 스레드가 여러 연결을 처리할 수 있다.
또한 BIO는 스트림으로 단방향이지만 NIO는 채널과 버퍼를 이용해 양방향 통신이 가능하다.
NIO의 구성요소
1. Channel
2. Buffer
3. Selector
Channel
채널은 비동기로 데이터를 읽는다. 채널은 버퍼에게 연결되어 읽거나 쓸 수 있다.
Buffer
버퍼는 데이트를 임시 저장하는 메모리 블록이다.
Selector
Selector는 NIO 기반의 커넥터의 핵심으로 하나의 스레드가 여러 채널을 다룰 수 있다. 이를 통해 하나의 스레드가 여러 연결을 담당할 수 있다.
톰캣의 IO Connector 종류
톰캣 9.0부턴 NIO 기반의 커넥터가 Default가 되었다. 또한 스프링 부트 2.x부턴 톰캣 9.0이 적용되었다.
NIO EndPoint Process
구성 요소
1. Acceptor
2. Poller
3. Worker
Acceptor는 소켓 연결을 승인하는 역할을 한다.
PollerEvent Queue는 acceptor를 통해 데이터들이 전달되는데 poller가 소비할 수 있도록 담아두는 역할을 한다.
Poller는 PollerEvent Queue의 Event를 받는다. 가장 중요한 Selector 역할을 맡고 있다. 따라서 Event의 Channel을 등록하는 행위를 한다. Worker Thread Pool에서 가용한 쓰레드를 얻어 해당 채널을 연결한다.
톰캣 튜닝 방법
사용자가 급격히 늘었을때 톰캣 튜닝을 해주어야 한다.
maxThreads
- 기본값 200 최대 750까지 설정 가능
acceptCount=10
- 대기 큐 길이 설정
maxConnection="8192"
- 하나의 톰캣인스턴스가 유지할 수 있는 Connection의 수
- 현재 연결되어 있는 실제 Connection의 수가 아니라 현재 사용중인 socket fd (file descriptor)의 수
tcpNoDelay="true"
- 작은 패킷들을 모아서 버퍼 사이즈가 다 차면 모아서 보내는 로직을 사용
- 해당옵션을 사용하면 버퍼가 차기전에 바로바로 전송하기때문에 전송속도가 빨리진다.
- 전송속도는 빨라지나 여러번보내기때문에 네트워크 트래픽은 증가된다.
compression="on"
- 파일을 가져올때 압축해 패킷 크기가 줄어 속도 증가
참고자료
'스프링 부트' 카테고리의 다른 글
[스프링] 동시성 문제를 처리하는 2가지 방법 (0) | 2022.10.11 |
---|---|
[스프링] 히카리CP란? (0) | 2022.10.07 |
[스프링] TestContainer란? (0) | 2022.10.04 |
[스프링] String 클래스 자동 trim 메서드 적용하기 (0) | 2022.10.02 |
[개발방법론] DDD란 무엇인가? (0) | 2022.09.10 |
댓글