프로그래밍/Java 33

Java Virtual Thread (13), 병목 현상(bottleneck)

Virtual Thread를 적용했을 때 운영적인 측면에 대해 생각해보자.    1) tomcat-biz 가 하나의 spring boot application이다. 즉 두 개의 서버가 있고, 하나의 db가 있다.2) client 요청이 오면 톰켓이 받고 biz 로직에 따라 db 쿼리를 처리한다.   여기에 virtual thread를 사용하여 성능을 높일 수 있다. 그리고 서버 한 대를 줄이는 것을 고민하였다.  이 경우 아무런 이슈가 생기지 않을까?   tomcat 은 200개의 요청이 400개로 늘어났다. 다만 virtual thread이기 때문에 thread의 개수 제한이 거의 없다고 볼 수 있기 때문에 이는 문제가 되지 않는다.   생각해야할 지점은 DB이다. 기존은 HikariCP를 이용해 Co..

Java Virtual Thread (12), custom Executor, Scheduler

하나의 Spring Boot Application 인데, 이 안에 주문과 배송 등이 구현되어 있다고 가정해보자.   이 때 주문은 Virtual Thread를 사용하고, 다른 비즈니스에서는 CPU를 많이 사용하기 때문에 Platform Thread 를 사용하면서 사용할 수 있다. 만약, yml에 spring-virtual-enable-true로 설정한다면 virtual thread 로 바뀌기 때문에 Platform thread를 사용할 수 없다.  @Configuration@Slf4jpublic class SchedulerConfig { @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler() { ThreadPoolTaskS..

Java Virtual Thread (11), @scheduled 어노테이션

스케줄러에서 virtual thread가 잘 종료되는지 확인해보자.  import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Service;@Service@Slf4jpublic class VirtualScheduler { @Scheduled(fixedRate = 5000) public void fixedRate() { log.info("fixedRate. thread: {}", Thread.currentThread()); }}import org.springframework.boot.SpringAppli..

Java Virtual Thread (7), Virtual Thread Dump

기본적으로 인텔리제이에서는 Thread Dump와 비슷한 기능을 제공하고 있다.  현재 인텔리제이에서는 디버그 모드를 통해 Virtual Thread가 몇개 떠 있는지 정확하게 알 수 없다. (2024.01 버전 기준)   @Slf4j// jcmd Thread.dump_to_file -format=text public class VirtualThreadDump { private static final Runnable runnable = new Runnable() { @Override public void run() { log.info("1) run. thread: " + Thread.currentThread()); try { ..

Java Virtual Thread (5), Pinned Virtual Thread

Pinned Virtual Thread를 직역하면 고정된 가상 스레드이다.   Virtual Thread는 blocking 작업이 되면(blocking 메서드를 호출하면) 플랫폼 스레드가 언마운트되고 다른 Virtual Thread가 플랫폼 스레드를 사용함으로써 효율은 높이는 방식인데 그것을 못하게 하는 것이 Pinned Virtual Thread 이다.  즉, virtual thread 는 Synchronized block 혹은 Native 메서드와 함께 사용하는 것은 피해야한다.  1) Native 메서드  Object 클래스를 보면 hascode 라는 메서드가 있다. 이는 native로 설정이 되어 있으며 body 값이 없다. native 로 적혀져 있는 것은 c, c++ 같은 native 언어로 ..

Java Virtual Thread (1)

예를들어 c 혹은 c++ 로 쓰레드 3개를 만들고, cpu 는 두 개가 있다고 가정해보자. 이 경우, 운영체제는 3개의 쓰레드가 2개의 cpu를 잘 활용하기 위해서 스케줄링을 하고, 컨텍스트 스위칭을 통해 쓰레드가 소외되지 않고 cpu를 골고루 사용하게 해준다.   자바의 경우 자바 쓰레드를 하나 만들 때마다 os 레벨에서 쓰레드가 생긴다. 위와 같이 자바 쓰레드 3개를 생성하면 os 레벨에 쓰레드도 3개 생성된다. 그리고 os 레벨의 쓰레드를 os 쓰레드 혹은 커널 쓰레드라고 부른다.   커널 쓰레드는 생성 시 약 1~2MB 메모리 용량이 소모된다. 그리고 쓰레드가 많아지면 os 가 스케줄링하기 버거워지며 컨텍스트 스위칭도 많이 일어나기 때문에 쓰레드를 많이 만드는 것은 많은 고민이 필요하다.    ...