728x90
kotlin의 coroutin을 대체할 수 있는 Virtual Thread
출처: https://techblog.woowahan.com/15398/
탄생 배경
- 스레드는 프로세스에 비해 크기가 작아 생성비용이 적고, 컨텍스트 스위칭비용이 저렴
- 하지만 요청량이 많아지면 더 많은 스레드 필요
- 생성비용이 적지만 스레드가 많이 필요해 비용이 많이 듦
Virtual Thread의 동작원리
기존 JAVA THREAD
- Application 코드가 OS Thread를 사용하는 게 최종목적인데, 비용측면때문에, platform thread를 거쳐서 사용
Virtual Thread
가상의 thread 풀이 없고, JVM 자체적으로 virtual thread를 OS Thread 와 연결하는 스케줄링을 진행둘을 연결해주는 기존의 platform thread는 carrier thread라고 한다.
- Carrier thread가 virtual thread의 작업을 처리 중에 blocking이 발생시, 다른 virtual thread 작업 처리
- 기존 스레드는 Blocking 발생시, 그냥 기다림
Virutal Thread의 특징
- 코드 구현상으로는 virtual thread 여부를 확인하는 구간이 생겨, production 코드에서는 기존과 동일하게 코드를 작성해도 됨.
if(Thread.currentThread().isVirtual()){
// virtual_thread ...
} else {
// traditional thread
}
- Virtual Thread는 컨텍스트 스위칭 비용이 저렴
Thread | Virtual Thread | |
Stack 사이즈 | ~2MB | ~10KB |
생성시간 | ~1ms | ~1µs |
컨텍스트 스위칭 | ~100µs | ~10µs |
Virtual Thread는 JVM에 의해 생성되기 때문에
- 커널영역의 호출이 적음 (시스템 콜)
- 메모리 크기가 일반 스레드의 1%에 불과
- 컨텍스트 스위칭 비용이 적음
모델 간 비교
Virtual Thread V.S. Thread
- I/O Bound 작업에서 50%이상 성능 향상
- Context Switching이 없는 CPU Bound에서 성능낭비 발생
- platform thread 사용 비용
- virtual thread 생성 비용
- 스케줄링 비용
Virtual Thread V.S. Kotlin Coroutine
- I/O Bound 작업에서 37%이상 성능 향상
Virtual Thread V.S. Reactive Programming
- I/O Bound 작업에서 111%이상 성능 향상
728x90
'Tech 블로그' 카테고리의 다른 글
당근페이 입사 후 비로소 알게 된 것들 (0) | 2024.03.31 |
---|---|
배달의민족 광고데이터 이관기 (0) | 2024.03.22 |
통합 금칙어 시스템 (0) | 2024.03.11 |
ChatOps를 통한 업무 자동화 (0) | 2024.02.03 |
웹 접근성 준수를 통한 모두에게 배달되는 일상의 행복 (2) | 2024.01.21 |