ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vritual Thread - Kakao tech meet 
    Spring/Framework 2023. 12. 12. 19:21

    2024-12-12 Kakao tech meet 에서 Virtual Thread 를 다루었습니다

    이번 동영상을 보며알게 되었는데, 

    지난 Virtual Thread 공부시 참고한 Soo Story 저자님이 카카오 안정수(James.star) 님이였습니다

    https://findstar.pe.kr/about/

    JDK 21의 신기능 Virtual Thread 알아보기

     

    https://festa.io/events/4327

     

    Kakao Tech Meet #4 | Festa!

    Festa에서 당신이 찾는 이벤트를 만나보세요.

    festa.io

    (1) JDK 21의 신기능 Virtual Thread 알아보기

    JDK 21(LTS)에서 소개된 새로운 기능 중 주목받고 있는 Virtual Thread에 대해서 소개합니다. Virtual Thread가 탄생한 배경과 목적, 구조, 사용법, 주의사항에 대해서도 알아봅니다.
    Java 또는 Kotlin을 다루는 서버 개발자 중 애플리케이션의 처리량(Throughput)을 높이는 데 관심 있는 분들이라면 누구나 들으시길 추천합니다.

    #java #Kotlin #jdk21 #virtualthread 

    목차
    •Virtual Thread란 무엇인가?
    •탄생 배경
    •해결하고자 하는 문제
    •Virtual Thread의 구조
    •사용 방법
    •성능 테스트
    •생각해 볼 점

    발표자: 안정수(@james.star) | 블로그
    카카오에서 AI 플랫폼을 만드는 플랫폼 엔지니어링 업무를 맡고 있습니다. 새로운 것을 배우고 공부하는 일을 좋아합니다. 하루하루 조금 느리더라도 저만의 속도로 눈앞에 구덩이를 메우고 있습니다.

     

     

     

    https://www.youtube.com/watch?v=JZqF-QKY6GM

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    blocking 발생 ; CPU 이외의 작업 ( Network IO 등 )

     

    blocking 된 thread 를 unmount 시키고 

     

    다른 쓰레드를 Mount 시킵니다

     

     

    기존에는 Blocking 발생시 기다렸으나, 

    Virtual thread 는 다른 쓰레드로 바꾸어 작업하게 됩니다

     

    사용법

    오른쪽은 실행 결과

     

     

    Spring Boot 3.2 이상에서 사용법

    spring.threads.virtual.enabled: true

     

    3.0 ~ 3.1  에서 사용법

    아래처럼 bean 을 등록하여 사용

     

     

    기존 Thread 를 virtual thread 로 바꾼다고 생각하지 말고, Task 별로 Virtual Thread 에 할당한다고 생각하는게 좋습니다

     

     

    Virtual Thread 를 수천, 수만개 만들고 ThreadLocal 사용을 남발하게 되면, Memory 이슈가 발생할 수 있습니다

     

    synchronized 또는 jni navtive call 을 하면 carrier thread 를 타고 있는 상태에서 waiting 하기 때문에, virtual thread 효과가 없어지게 됩니다

    코드 상태값 전이표에 보면, parked indefinitely on carrier 로 설명되어 있습니다

    PARKING -> PINNED          // cont.yield failed, parked indefinitely on carrier

    https://github.com/openjdk/loom/blob/fibers/src/java.base/share/classes/java/lang/VirtualThread.java#L89C3-L155

     

    pinning 체크용 디버그 코드

     

     

     

    Platform Thread : 199 

    •  tomcat 의 기본 thread 가 200 이기 때문  <- 이걸 바꾸고 테스트 하셨어야 하지 않나요?

    virtual thread 2975  ( 15배 )

     

     

    성능테스트2

     

     

    Platform Thread : 149

    * database max connection 150 지정되었기 때문

     

    Virtual Thread : 149

     

    Tomcat 은 다 처리하고 3천 유저를 HikariPool 로 넘겼는데, 

    HikariPool 에서 처리못하고 TimeoutException 발생

    → overwhelming 이라고 부릅니다

     

     

    tomcat 이 throttle(queue) 역할을 해 주었는데, Traffic 을 다 넘겼을 때 application 이 받아 주는지 고민하며 작성해야 합니다.

     

     

     

    CPU Intensive 작업 ( image 처리, 동영상 인코딩) 에는 적합하지 않음

     

     

     

    예 : DB 사용시 견딜 수 있는 connection 수 만큼만 traffic 이 넘어가도록

     

     

     

    패널 토의

    Java 21 의 사내 도입 계획이 있으신지?

    시간이 지나면 점진적 도입, Java & Spring boot EOL 맞춰서 진행

     

    Coroutine vs Virtual Thread ?

    coroutine : compile level, 명시적으로 suspend fuction 을 지정하여 사용

    virtual thread : jvm 차원 지원, continuation 기능으로 구현

     

    댓글

Designed by Tistory.