스레딩 Java (Tomcat vs Netty)

박찬섭·2024년 12월 17일

스프링

목록 보기
11/14

프로세스
스레드
멀티 스레드
Tomcat의 멀티 스레딩
Netty의 멀티 스레딩
비교

프로세스

컴퓨터에서 처리해야 되는 프로그램의 단위이다.

여기서 프로그램이란 웹 브라우저, 게임, 채팅 앱등이 있으며 이 프로그램들을 실행 시키는 순간
컴퓨터에서 처리해야 되는 작업 즉 프로세스라고 부를 수 있다.

JAVA는 기본적으로 싱글 프로세스로 작동한다.
물론 자바에서 지원하는 ProcessBuilder를 통해 여러개의 JVM 프로세스를 만들 수 있다.
스프링부트를 통해 실행시킨 서버는 하나의 프로세스가 되는 것이다.


스레드

프로세스보다 더 작은 작업 단위이다.
프로세스에서 진행되는 모든 작업들이 스레드 단위로 세밀화되어 작업된다.
멀티 스레드를 사용하지 않는다면 메인 스레드 하나에서만 작업이 진행된다.


멀티 스레드

멀티 스레드는 프로세스에서 처리해야 되는 작업들을 하나씩 하나의 스레드로만 처리하지 않고
들어오는 작업들을 각각 스레드로 만들어 동시에 처리할 수 있게 한다.

자바는 멀티 스레딩을 지원한다.
바닐라 자바 기준 Thread 클래스를 통해 스레드를 생성 할 수 있다.
스프팅 부트는 자체적으로 멀티 스레딩 기능을 지원하고 있다.


Tomcat의 멀티 스레딩

클라이언트에서의 요청을 스프링 컨테이너보다 톰캣이 먼저 받는다.
클라이언트 -> (톰캣 -> 스프링 컨테이너)

스레드풀

톰캣은 요청 각각에 스레드를 만든다.
요청 하나에 대해 정해진 스레드풀에서 스레드를 하나씩 재사용한다.
요청에 따라 생성된 스레드들은 동기적으로 처리된다.

최대로 생성 할 수 있는 스레드와 최소로 유지할 스레드는 설정할 수 있다.

블로킹I/O

각 스레드는 CPU 스케쥴러에 의해 병렬적으로 처리된다.
이때 톰캣에서 스레드는 블로킹I/O의 특징을 가지고 있는다.
블로킹I/O는 해당 스레드가 스프링 외부 즉 DB와 접속, 외부 API 사용 같은 작업이 있다면 해당 작업이 끝날때까지 스레드는 대기 상태가 된다.
즉 해당 스레드는 정체가 된다.


Netty의 멀티 스레딩

Netty 또한 클라이언트의 요청을 스프링 컨테이너보다 먼저 받는다.
클라이언트 -> (네티 -> 스프링 컨테이너)

이벤트 루프

네티는 최소한의 스레드를 유지한다.
요청마다 스레드를 생성하는 톰캣과 달리 소수의 스레드를 순환 시키며 처리한다.

요청이 많아지면 소수의 스레드를 순환시키며 비동기적으로 처리한다.

논블로킹I/O

톰캣과 달리 스레드가 순환되면서 비동기적으로 처리되기 때문에 정체되는 스레드가 없다.
정체되는 스레드가 없기때문에 컨텍스트 스위칭도 적다.


비교

Tomcat : 요청이 적거나 요청마다 상당한 양의 CPU연산이 필요한 경우 사용하면 적합하다.
CPU 연산이 많아도 해당 Netty와 달리 해당 스레드를 집중적으로 처리하기 때문에 더 효율적이다.

Netty : 요청이 많고 해당 요청들의 작업량이 적다면 비동기적으로 빠르게 처리되는 Netty가 더 효율적이다.

profile
백엔드 개발자를 희망하는

0개의 댓글