Java

스레드 풀이 없으면 자바에서 왜 Thread 생성 비용이 늘어날까?

DEV_GOLF 2023. 3. 20. 22:20
반응형

스프링 MVC 구조는 tomcat 엔진에 thread pool을 사용하고 webflux 구조는 netty 엔진의 이벤트 루프를 통해 스레드를 미리 만들어놓은 환경에서 작업을 처리합니다. 이렇게 미리 만들어놓고 쓰는 이유는 스레드를 생성될 때마다 비용이 비싸기 때문에 미리 만들어 놔야 한다고 알고 있을겁니다. 이번 포스팅에서는 그 이유에 대해 알아보도록 하겠습니다.

One-To-One multi-threading model

먼저 JVM에서의 다중 Thread 모델은 one to one 모델을 따르고 있습니다. 그렇다면 이 모델은 도데체 무엇이고 thread pool 등장 배경과 무슨 관계 일까요?

 

one to one 모델은 사용자 수준의 thread와 커널 스레드가 1대 1로 연결되어있는 형태를 말합니다. 특징을 살펴보면 user thread가 생성되면 kernal thread도 같이 생성되며 각각의 사용자 스레드는 커널 스케줄링이 가능한 엔터티가 되기 때문에 병렬 처리가 수월해지고 작업 속도 성능이 매우 올라갈 수 있습니다. 

하지만 여기서 1 대 1로 연결되어있는 형태기 때문에 커널 thread를 사용자 수준 thread가 많아지면 그만큼 생성해야하고 관리도 힘들어지는 overhead가 존재합니다. 

 

결론적으로 만약 Thread pool이 없다면 매번 사용자 Thread 뿐만아니라 Kernal Thread도 만들어주어야 하며 계속 만들어주고 해제하지 않는다면 Kernal Thread와 User Thread가 너무 많이 만들어져 OS 전체의 성능 저하로 이어질 수 있습니다. 그렇다고 계속 해제 해주는 것도 비용이 적은 것은 아닙니다. 

이를 해결하기 위한 Thread Pool 

그렇기 때문에 Thread pool은 JVM 기반 언어와 이를 이용해 만들어진 애플리케이션에서는 선택이 아닌 필수 입니다. 대표적으로 Spring 같은 경우 tomcat의 200개의 이미 만들어진 Thread를 이용하여 OS의 커널 스레드를 더 이상 생성하지 않고 요청 시 이 Thread들을 이용하여 요청을 처리합니다. 그렇기 때문에 매 요청 시 마다 Thread를 생성하지 않아 요청을 보다 빠르게 처리가 가능합니다. 또한 Thread를 사용하고 해제가 아닌 반납과 재사용 개념이기 때문에 해제에 대한 오버헤드가 발생하지 않습니다.

그렇다면 왜 One-To-One 모델이여야 하는가 

JVM은 초기부터 one to one 모델은 아니었습니다. 초기에는 다대일 구조였습니다. 다대일 구조는 여러개의 user thread가 단일 kernal thread를 바라보고 있는 형태로 다대 일 구조는 user thread가 가볍고 생성에 큰 비용이 들지 않기 때문에 overhead가 적다는 장점이 있었습니다. 하지만 blocking system call을 사용하게 되면 모든 user thread가 전부 block이 되고 이러한 구조는 병렬적인 작업을 힘들게 하였습니다. 또한 control group(cgroup)이 등장하면서 다대일 구조가 아니더라도  kernel thread 자체를 그룹 단위로 묶어 제어할 수 있어져 사실 상 그나마 있던 다대일 구조의 장점도 사라져 현재는 사용하지 않는 모델이 되었습니다.

 

정리

그저 자바는 멀티 스레드 구조고 동시성 처리가 가능한 언어라고만 생각했지 그 내부에 대해선 알지 못했습니다. 오늘 찾아본 결과 그 이유는 JVM Thread model의 특성 때문에 가능했던 것이고 마냥 장점만 있는게 아닌 여러 문제점이 있다는 것을 볼 수 있었습니다. 
또한 Thread pool 같은 경우 개수를 조절할 수 있고 또 Spring 같은 경우는 여러 Thread pool group을 만들어 빈으로 등록해 빈이 등록되는 시점에 미리 갖고 있는 경우가 있는데 이 또한 overhead를 적절히 고려해 가며 사용해야한다는 생각이 들었습니다.

 

Ref. (사진)

https://sosal.kr/600.

 

Multithreading models, 스레드의 개념

/* * http://sosal.kr/ * made by so_Sal */ Thread는 CPU-utilization의 기본 단위이다. Program counter, register set, stack, thread ID로 구성되어있다. 하나의 프로세스에 다양한 스레드가 붙어있으며, 그 스레드들은 프로

sosal.kr

https://jooona.tistory.com/9

 

[운영체제] Thread (2) - Multithreading Model, Implicit Threading, and Other Issues

지난번 글에 이어서 오늘도 thread에 관하여 공부해보고자 합니다. 오늘은 thread의 종류와 다중 thread의 몇 가지 모델에 대해서 먼저 알아본 뒤, thread에 관한 여러 이슈들을 다뤄볼까 합니다. 1. User

jooona.tistory.com