2024.05.21 - [Spring/대용량 트래픽] - Spring Webflux란?
소프트웨어 성능을 분석할때, CPU bound, I/O bound로 분류할수 있다.
대용량 트래픽을 처리할때 쓰이는 Spring Webflux는 I/O bound 작업이 많을때 효율적으로 사용할 수있는 관점에 가깝다.
CPU Bound
Computting Process Unit 의 약자이다. 기계어 명령들을 바탕으로 계산을 수행하는 중앙처리 장치이다.
CPU만 쓰는 작업뿐만 아니라, CPU를 중점적으로 다루는 작업을 포괄적으로 의미한다.
이렇게 계층적으로 나누어서 살펴보게 되면, 사람 눈에는 두개의 앱이 동시실행 하는 것처럼 보일것이다.
사실 잘게 나눠서 보면 아주 짧은 순간을 반복해서 번갈아가며 실행한다. 이걸 바로 Context Switching(문맥 전환) 이라고 한다. 그러면 CPU 성능이 좋으려면? 문맥 전환 빈도를 낮춰야한다!
실제 실행 절차로는 디스크에서 메모리에 프로그램을 적재하면서 프로세스로 변환되고, 그 프로세스의 데이터를 CPU
Register에 저장한다. CPU 내부에 ALU(연산장치)를 통해 실제계산을 진행한다.
여기서 2번 앱으로 실행을 하면 ALU는 Register를 기반으로 연산을 하기 때문에, Register에 있는 내용을 PCB(Process Control Block) 에 저장하고, CPU에 있는 Register를 지운뒤, 2번 앱의 메모리로 부터 정보를 다시가져와야 한다.
여기서 바로 성능 OverHead가 발생한다.
MultiCore
CPU Bound를 최소화 시키기 위한 해결방안 중 하나는 단순히 계산할수 있는 CPU를 여러개 두는 것이다.
또한 발열문제해결에도 기여한다.
I/O Bound
Input / Output 의 약자로 입출력 장치의 중점적인 작업을 의미한다.
위 그림과 같은 상황이라고 가정하자.
Hello 패킷을 NIC를 통해 전달받고, 커널에서 네트워크 프로토콜 처리를 진행하는데, Server Application 입장에서는 커널로 부터 패킷을 전달받기 전까지 대기하게 된다.
또한 Web Application 입장에서 Client뿐만아니라, DB, 외부 API Server에 요청, Disk(FIle)에 CRUD하는 작업 또한 I/O이다.
Multi Thread
전통적인 I/O동시처리 방법.
BUT, I/O 요청이 올때 마다 스레드를 계속 늘리면 스레드 자체도 메모리를 차지하기 때문에, Out of Memory 이슈가 발생한다.
그리고 스레드를 생성하고 삭제하는 과정자체가 성능관점에서 손해이다.
해결방법은?
Thread Pool
다수의 스레드를 미리 만들어놓고, 요청이 들어와서 스레드가 필요하면 쓰고, 다쓰면 다시 스레드 풀에 반납하는 방법이다.
실제 Spring MVC에 기본 내장 되어있는 Tomcat에서 Thread Pool 기반으로 동작하게 되어있다.
CPU Bound와 I/O Bound의 개념에 대해서 알아봤다. 다음 글은 I/O Bound관점에서의 async, blocking 에 대해서 알아본다.
2024.05.21 - [Spring/대용량 트래픽] - sync/async 와 block/non-block
'Spring > 대용량 트래픽' 카테고리의 다른 글
Spring MVC와 Webflux (0) | 2024.05.22 |
---|---|
sync/async 와 block/non-block (0) | 2024.05.21 |
Spring Webflux란? (0) | 2024.05.21 |
Redis Replication (0) | 2024.05.21 |
Prometheus, Grafana 오픈소스로 Redis 모니터링하기 (0) | 2024.05.21 |