Skip to content

Latest commit

 

History

History
35 lines (20 loc) · 2.77 KB

69.md

File metadata and controls

35 lines (20 loc) · 2.77 KB

톰캣의 NIO Connector의 동작 방식에 대해 설명해주세요.

tomcat

우선 Connector의 역할은 브라우저(혹은 클라이언트)로부터 TCP 커넥션을 받아 Request, Response 객체를 생성하여 서블릿이 이를 처리할 수 있도록 만드는 것입니다.

image

NIO Connector는 Tomcat 4.0 버전부터 추가되었으며 Java의 Nio API를 사용합니다.

기존 BIO 방식은 Http Connection과 작업 쓰레드가 1대1로 매핑되어 처리를 담당했습니다. BIO Connector의 문제는 커넥션이 열리고 데이터를 읽는동안 해당 작업 쓰레드가 block된다는 것입니다. (커넥션이 열렸다고 바로 작업을 할 수 있는 것은 아니기 때문. 클라이언트가 데이터를 소켓에 모두 write할 때까지 작업 쓰레드는 그냥 기다려야됨)

NIO의 경우 Poller라는 중간 계층 쓰레드에 커넥션을 캐싱해놓고, 해당 소켓의 데이터를 읽을 수 있는 상태일때만 작업 쓰레드에 할당됩니다.

NIO Connector

따라서 기존의 BIO와 비교할 때, 쓰레드가 지금 당장 데이터를 읽을 수 없음에도 불구하고 쓸데없이 idle되는 일이 없습니다.

Nio Endpoint

Acceptor는 소켓을 accept하고 이를 PollerEvent로 캡슐화해 큐에 담아놓습니다. Poller는 해당 큐에서 Event를 가져온 후 데이터가 이용 가능한 상태일 때 Worker 쓰레드에게 넘겨줍니다.

NIO Connector의 경우 이렇게 하나의 쓰레드가 소켓들을 큐에 담아놓고 작업이 가능할 때 작업 쓰레드가 하나씩 가져가 처리할 수 있기 때문에 쓰레드를 더 적게 사용할 수 있습니다.

즉, BIO의 경우 커넥션이 열릴 때마다 작업 쓰레드를 생성해야되는데 NIO는 커넥션을 큐에 담아놓으면 idle 상태인 작업 쓰레드가 꺼내서 처리하면 됩니다.

따라서 같은 쓰레드 개수를 사용한다면 NIO 방식이 더 많은 커넥션을 처리할 수 있습니다. 실제로 tomcat 7.0버전의 문서를 보면 maxConnections 의 default 값이 Nio가 훨씬 더 큰 것을 확인할 수 있습니다.

참고자료

https://tomcat.apache.org/tomcat-9.0-doc/config/http.html https://www.programmersought.com/article/1699692284/ https://howtodoinjava.com/tomcat/tomcats-architecture-and-server-xml-configuration-tutorial/ https://www.baeldung.com/spring-webflux-concurrency https://velog.io/@jihoson94/BIO-NIO-Connector-in-Tomcat