3.1 Blocking I/O
Blocking I/O: 하나의 스레드가 I/O에 의해 차단되어 대기하는 것
웹 애플리케이션 측면에서의 I/O 작업
- DB I/O
- 웹 애플리케이션 - 다른 웹 애플리케이션 네트워크 통신
Blocking 방식을 보완하기 위해 멀티스레딩 기법으로 추가 스레드를 할당해 차단된 시간을 효율적으로 사용할 수 있다.
문제점
하지만 CPU 대비 많은 수의 스레드를 할당하는 멀티스레딩 기법은 다음과 같은 문제점이 존재한다.
- 컨텍스트 스위칭으로 인한 스레드 전환 비용 발생
- 프로세스 정보를 PCB 에 저장하고 reload 하는동안 CPU의 전체 대기 시간이 길어진다.
- 과다한 메모리 사용으로 오버헤드 발생
- 일반적으로 새로운 스레드가 실행되면 JVM에서 해당 스레드를 위한 스택 영역의 일부를 할당한다.
- java 웹 애플리케이션은 요청당 하나의 스레드를 할당하고, 각각 스레드 내에서 다른 작업을 하기 위해 추가 스레드를 할당하면 메모리 사용량이 더 늘어날 수 있다.
- 스레드 풀에서 응답 지연이 발생할 수 있다.
- 톰캣은 스레드 풀을 사용하는데, 대량 요청이 발생해 스레드 풀에 유휴 스레드가 없다면 응답 지연이 발생한다.
3.2 Non-Blocking I/O
Non-Blocking I/O: 작업 스레드의 종료 여부와 관계없이 요청한 스레드는 차단되지 않음
문제점
- 스레드 내부에서 CPU를 많이 사용하는 작업이 포함된 경우에 성능에 악영향을 줌
- 요청-응답 과정까지의 전체 과정에 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 방식의 통신이 적합한 시스템
- 대량의 요청 트래픽이 발생하는 시스템
- 마이크로 서비스 기반 시스템
- 스트리밍 또는 실시간 시스템
- 무한 데이터 스트림을 전달받아 처리할 수 있다