[4월 우아한테크세미나] ‘Java의 미래, Virtual Thread’ 보고 요약

June·2024년 4월 24일
0

컨퍼런스

목록 보기
1/1

https://www.youtube.com/watch?v=BZMZIM-n4C0

Virtual Thread 소개

배경

당시 Loom은 정식 피처도 아니어서 코루틴 선택. JDK 21에 Project Loom이 정식 피처로 나옴.

기존 자바 스레드는 생성 비용이 크다

-> 스레드 풀의 존재 이유
-> 사용 메모리 크기가 크다 (최대 2mb사용)
-> os에 의해 스케줄링 (시스템콜이 호출되기 때문에 오버헤드 존재)

Virtual Thread는 생성 비용이 작다

  • 스레드 풀 개념이 없다. 항상 요청이 오면 새로운 생성
  • 사용 메모리 크기가 작다
  • OS가 아닌 jvm 내에서 스케줄링.

Non Blocking I/O

최근 논블로킹의 필요성 대두로 스프링 웹플럭스가 나옴.

웹플럭스는 네티의 이벤트루프로 IO의 시간을 획기적으로 줄임.

가상 스레드는 논블로킹인데 jvm 스레드 스케줄링과 continuation을 통해서 nio를 구현했다.

기존 스레드 상속

리스코프 치환 원칙에 따라 가상스레드는 스레드를 사용하는 곳에서 호환이 되어야 한다.

Virtual Thread 동작 원리

일반 스레드 특징

JNI는 java native interface다.

스레드 생성 요청을 하면 os의 스레드가 생성됨.

Virtual 스레드 특징

JVM에 의한 스케줄링

JVM내에 스케줄러가 있을 것이라고 추측할 수 있다.

ForkJoinPool로 스케줄러가 만들어져있고, 캐리어 스레드 사용. Work Stealing 방식으로 수행. 워커 스레드에 워커 큐를 가지고 있고, 순차대로 처리. 본인 큐가 비어있으면 다른 작업을 훔쳐옴.

jvm 스케줄링으로 커널 영역을 접근하지 않으므로 오버헤드가 줄어든다.

Continuation 작업단위

  • 실행 가능한 작업흐름
  • 중단 가능
  • 중단 지점으로부터 재실행 가능

예전에는 커널 스레드가 블라킹 되었는데, 가상스레드에서는 continuation의 yield가 호출된다.

기존 스레드 모델과 비교

스레드 풀이 다 차면 다음 요청은 기다려야 한다.

가상 스레드에선 park를 호출하면 yield가 호출되므로 가상스레드가 캐리어 스레드로부터 분리되고, 다음 요청이 오면 가상 스레드를 새로 만들고 스케줄러에 의해 두번째 캐리어 스레드와 연결된다.

테스트

기존 스레드 vs 가상 스레드

cpu bound는 더 낮은데, 가상 스레드를 생성하고 스케줄링하는데 비용이 들어서 그렇다.

WebFlux vs Virtual Thread

주의사항

캐리어 스레드가 블록되는 상황 (Pin)

synchronized나 parallel을 다른 락을 이용하도록 지원한다.

no pooling

풀링을 하면 안된다. 생성 비용이 저렴하기 때문에 개수 제한 같은 것이 더 비용이 들 수 있다.

Cpu bound task

경량 스레드

스레드 로컬을 최대한 가볍게 유지해야 한다.

배압 조절 기능이 없다.

예전 스레드는 스레드풀이 가득차면 기다리는 등 배압 효과가 있었으나 가상스레드는 최대한으로 만들려한다. 하드웨어에 대한 충분한 검증을 해야한다. 가상스레드를 썼다가 db 커넥션이 문제가 생길 수도 있다.

결론

Q&A

코루틴 vs 가상스레드

코루틴은 루틴이다. 루틴은 메서드나 함수.
가상스레드는 스레드다.

근본적인 패러다임이 차이가 있고, 가상스레드는 스레드 / 처리량을 늘리기 위한 것이다.
코루틴은 메서드 단위로 쪼개서 스케줄링을 한다. 코루틴은 종료, 취소 등이 가능하나 가상스레드는 아직 프리뷰 기능.

웹플럭스는 이제 사라질까?

웹플럭스도 패러다임이 다른거다.

가상스레드는 배압조절이 안된다. 웹플럭스는 배압 조절이 가능하고 함수형 프로그래밍을 적용했다면 웹플럭스가 유리할 것.

db 커넥션 풀이 부족하다면?

애플리케이션 레벨에서 배압을 해야할 것.

network io가 없는 서버에서는?

쓰면 안티패턴이 될 것 같다.

0개의 댓글