[Reactive] 03. Blocking I/O, Non-Blocking I/O

Jimin Lim·2024년 2월 25일
0

Spring

목록 보기
10/18
post-thumbnail
post-custom-banner

3.1 Blocking I/O

Blocking I/O: 하나의 스레드가 I/O에 의해 차단되어 대기하는 것

웹 애플리케이션 측면에서의 I/O 작업

  • DB I/O
  • 웹 애플리케이션 - 다른 웹 애플리케이션 네트워크 통신

Blocking 방식을 보완하기 위해 멀티스레딩 기법으로 추가 스레드를 할당해 차단된 시간을 효율적으로 사용할 수 있다.

문제점

하지만 CPU 대비 많은 수의 스레드를 할당하는 멀티스레딩 기법은 다음과 같은 문제점이 존재한다.

  1. 컨텍스트 스위칭으로 인한 스레드 전환 비용 발생
    • 프로세스 정보를 PCB 에 저장하고 reload 하는동안 CPU의 전체 대기 시간이 길어진다.
  2. 과다한 메모리 사용으로 오버헤드 발생
    • 일반적으로 새로운 스레드가 실행되면 JVM에서 해당 스레드를 위한 스택 영역의 일부를 할당한다.
    • java 웹 애플리케이션은 요청당 하나의 스레드를 할당하고, 각각 스레드 내에서 다른 작업을 하기 위해 추가 스레드를 할당하면 메모리 사용량이 더 늘어날 수 있다.
  3. 스레드 풀에서 응답 지연이 발생할 수 있다.
    • 톰캣은 스레드 풀을 사용하는데, 대량 요청이 발생해 스레드 풀에 유휴 스레드가 없다면 응답 지연이 발생한다.

3.2 Non-Blocking I/O

Non-Blocking I/O: 작업 스레드의 종료 여부와 관계없이 요청한 스레드는 차단되지 않음

문제점

  1. 스레드 내부에서 CPU를 많이 사용하는 작업이 포함된 경우에 성능에 악영향을 줌
  2. 요청-응답 과정까지의 전체 과정에 Blocking I/O 요소가 포함된 경우, Non-Blocking 이점을 발휘하기 어렵다.

* 완전한 Non-Blocking?
DB 조회할 때의 DB I/O와 네트워크 I/O 모두 Non-Blocking I/O여야 제대로된 이점을 발휘할 수 있다. 하나라도 Blocking요소가 존재하면 스레드가 차단되면서 병목 구간이 발생할 수 밖에 없다.

3.3 Spring 에서의 Blocking I/O, Non-Blocking I/O

  • Spring MVC: Blocking I/O
    • 요청당 하나의 스레드 사용, 대량의 요청을 처리하기 위해 과도한 스레드 사용으로 CPU 대기 시간 늘어나고 오버헤드 발생
  • Spring Webflux: Non-Blocking I/O
    • 비동기 Non-Blocking I/O 로 적은 수의 스레드로 많은 수의 요청을 처리해 CPU, 메모리를 효율적으로 사용할 수 있다.

3.4 Non-Blocking I/O 방식의 통신이 적합한 시스템

  1. 대량의 요청 트래픽이 발생하는 시스템
  2. 마이크로 서비스 기반 시스템
    • 서비스 간의 많은 수의 I/O 발생
  3. 스트리밍 또는 실시간 시스템
    • 무한 데이터 스트림을 전달받아 처리할 수 있다
profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️
post-custom-banner

0개의 댓글