본문 바로가기
스프링 부트

[스프링] 톰캣의 NIO Connector

by illlilillil 2022. 10. 8.

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"

  • 파일을 가져올때 압축해 패킷 크기가 줄어 속도 증가

 

 

참고자료

 

톰켓(Tomcat) 성능 튜닝하기

Server.xml maxThreads 기본값 200 maxThreads 값이 최대 값인 750을 넘을 경우 두 대의 Tomcat을 이용해 클러스터링 구성을 하는 것이 좋다. active user 수 순간처리할수있는 트랜잭션 수 일반적으로 100내외로..

datajoy.tistory.com

 

BIO, NIO Connector Architecture in Tomcat

Servlet 과 Servlet Container를 소개할 때 대표적인 Servlet Container인 Tomcat을 소개했습니다. Tomcat의 Servlet Container Framework인 Catalina가 핵심적인 요소입니다. 하지만 Tomcat에서 핵심적

velog.io

 

댓글