[CS] 가상스레드

말하는 감자·2025년 7월 30일

CS

목록 보기
33/33
post-thumbnail

프로세스와 스레드

[CS]Process vs Thread
[CS] Thread

스레드의 한계

기존의 스레드라고 부르던 것은 정확히는 플랫폼 스레드(Platform Thread)이다.

  • 특징: 플랫폼 스레드는 OS의 스레드와 1:1로 매핑된다. 즉, 자바 코드에서 스레드를 하나 만들면, 운영체제도 실제 스레드를 하나 만들어 할당해준다.

한계

  • 비싼 비용: 플랫폼 스레드는 생성할 때마다 OS의 개입이 필요하고, 독립적인 메모리 공간을 할당받아 무겁고 비싸다. 수천 수만개의 스레드를 만드는것은 시스템에 큰 부담이다.
  • 블로킹(Blocking)의 비효율: 스레드가 데이터베이스 조회나 외부 API 호출 같은 IO 작업을 기다리는 동안, 그 스레드는 아무것도 하지 않는다(블로킹). 자원 낭비임

이러한 한계 때문에, 대규모 트래픽을 처리하는 서버에서는 '1 요청-1 스레드' 모델을 사용하기가 점점 어려워짐

풀링

스레드를 필요할때마다 생성하고, 작업 종료시 소멸시키는 방식은 너무 많은 비용(CPU와 메모리 사용)을 소모하고 성능 저하를 초래한다. 따라서 다수의 스레드를 미리 생성해놓고 필요할 때마다 이들을 재사용하는 방식인 풀링 방식이 등장

장점

  • 비용 절감: 스레드 생성과 소멸에 드는 비용을 줄음
  • 자원 관리 효율성: 생성된 스레드를 재사용하여 자원 낭비를 줄임
  • 성능 향상: 요청이 들어왔을때 즉시 사용 가능한 스레드를 할당하여 생성 시간만큼 응답시간 단축

가상 스레드(Virtual Thread)

가상 스레드는 높은 처리량의 동시성 애플리케이션을 개발하고 유지보수하기 위한 경량 스레드이다.
가상 스레드는 Platform Thread와 M:1 매핑된다.
즉, 여러 작업을 동시에 수행하면서도 Platform Thread 생성 비용을 절감할 수 있다.

특징

블로킹 처리 방식

  • 가상 스레드의 작업이 멈추면(Blocking) 다른 가상 스레드로 전환된다. 즉, 플랫폼 스레드는 작업을 멈추지 않는다
  • 이때, 힙 메모리 영역에 가상 스레드 정보를 저장하고, 이후 다시 가상 스레드를 사용하게 된다면 저장된 정보를 가져온다.

No pooling

생성비용이 작기 때문에 스레드 풀을 만드는 행위 자체가 낭비가 될 수 있다. 필요할 때마다 생성하고 GC(Garbage Collector)에 의해 소멸되도록 방치

장점

  • 수백만 개의 스레드를 생성 가능
  • 매우 가볍고 저렴
    • JVM이 내부에서 관리
  • 컨텍스트 스위칭 비용 저렴
  • 높은 처리량 제공
    • 빠른 응답속도 보장은 x
  • 효과적인 CPU 활용

주의

1. 블로킹 I/O 작업

가상스레드는 블로킹 작업이 발생해도 다른 가상스레드가 계속 실행될 수있다는 장점이 있지만, 모든 가상 스레드가 동일한 OS에서 실행되는 경우 OS 스레드가 블로킹되면 전체 애플리케이션 성능이 저하될 수 있다.

해결:

  • 가상 스레드 풀 크기 조정: 블로킹 IO 작업이 많은 경우, 스레드 풀 크기를 조정

2. 스레드 로컬 변수

가상 스레드는 OS 스레드보다 훨씬 많이 생성될 수 있으므로, 스레드 로컬 변수를 과도하게 사용하면 메모리 사용량이 급증하여 성능에 악영향을 끼칠 수 있다.

3. DB 커넥션 소진 가능성

기존에는 스레드 풀이 작동해서 요청을 작게 받고 DB 커넥션 풀로인해 DB로는 적당한 TPS가 들어가는 형태였지만, 가상스레드는 풀링을 사용하지 않아, 250개의 요청이 들어오면 250개 요청 전부 DB에 전송되서 커넥션풀이 소진될 가능성이 있다.

4. Pinning 현상

synchronized 키워드를 사용하여 모니터 락을 획득하고 블로킹 I/O 작업을 수행하는 경우 JVM이 synchronized 블록의 동기화를 위해 플랫폼 스레드를 특정 가상 스레드에 고정시키는데, 이때 Pinning이 발생한다.

이렇게 되면, 다른 가상 스레드를 실행시킬 수 없게되어 성능에 문제가 발생한다.
해결:

  • synchronized 를 다른 Lock으로 대체

https://comdolidol-i.tistory.com/414
https://yoonseon.tistory.com/151
https://www.youtube.com/watch?v=Q1jZtN8oMnU

profile
주니어개발자(?)

0개의 댓글