devlog.akasai

Node.js의 스레드


앞서서 Node.js의 비동기처리에 대한 전반적인 내용을 정리했다.

이번엔 싱글만레드의 특징을 정리하려 한다.

+ 정말… 해도해도 공부할 내용이 끝이 없다. 얼마나 대충쓰고 있었는지 반성한다…


싱글 스레드 (Single Thread)

싱글 스레드(Single Thread) 란 말 그대로 하나의 스레드만을 사용하여 여러 작업요청을 처리하는 방법이다.

앞서 정리한 것처럼 I/O작업과 같은 경우 비동기방식으로 처리하고

그 동안 다른 작업을 처리하는 방식이다.

한개의 콜스택으로 명령을 처리하는 Node.js는 이런면에서 싱글 스레드라고 할 수 있다.

그렇다면 Node.js는 항상 싱글 스레드방식으로 동작할까??

정답은 아니다.


스레드 풀 (Thread pool)

멀티 스레드(Multi Thread) 모델의 경우 스레드 풀을 두고 요청을 처리할 때 스레드를 기반으로 처리한다.

앞서 정리한 것 처럼 대부분의 작업은 콜스택을 통해 처리되며 Queue를 이용해 비동기 작업을 처리하지만

I/O, 네트워크등의 작업은 OS에게 작업은 넘겨주는 논블로킹방식으로 동작한다.

하지만, OS에서 지원하지 않는 비동기작업이나 특정 I/O작업은 libuv에서 처리하게되며 이는 내부적으로 운영되는

스레드 풀을 이용하여 논블로킹을 유지한다.

이러한 이유로 단일 콜스택측면에서는 싱글 스레드이지만 넓은 측면에서 본다면 무조건 싱글스레드는 아니라고 볼 수 있다.

libuv


스택 오버플로우 (Stack Overflow)

Javascript는 작업 수행도중 에러가 발생하면 Stack trace라는 내용을 확인할 수 있다.

모든 작업이 하나의 콜스택에서 이루어지기 때문에 알 수 있는 특징이다.

스택이라는 용어에서 추측할 수 있듯이 에러나가 발생하기전 처리되었던 내용들이 Stack trace를 통해 확인할 수 있다.

error

여기서 주의할 점은 콜스택도 경국 유한한 구조라는 점이다.

명령들이 반환되지 않을 상태로 콜스택에 계속 쌓이게 되면 결국 넘치게 되고

Maximum call stack size exceeded 에러를 뿌린다.

trace


이벤트 루프 멀티플랙싱(Multiplexing)

Node.js는 싱글 스레드라는 내용은 자주 언급된다.

많은 수의 작업이 요청되는 경우 (예를 들면 API호출) 이를 어떻게 처리할 것인지 의문이 발생한다.

바로 이벤트 루프의 멀티 플렉싱(Multiplexing)에서 그 답을 찾을 수 있다.

멀티플렉싱(Multiplexing)

multiplex

멀티플렉싱(Multiplexing)이란 하나의 통신채널을 통해 다량의 데이터를 전송하는데 사용되는 기술이다.

즉, 매 요청마다 새로운 프로세스나 스레드를 생성하는 것이 아니라 요청의 갯수와 상관없이 한개의 프로세스나 스레드를 이용하여 작업을 처리하는 방법이다.

주파수 분할, 시분할 등을 예로 들 수 있다.

Node.js의 경우

Node.js의 모든 작업처리는 단일 콜스택에서 이루어지고 비동기 처리는 Queue를 이용하며 둘은 하나의 쓰레드로 이루어진 이벤트 루프를 통해 동작한다.

이벤트 루프멀티플렉싱(Multiplexing)방식으로 동작한다. 여러 개의 소켓이 동시에 연결되어 있고, 이들을 관찰하면서 들어오는 작업을 처리하는 방식이다.

기존의 웹서버의 경우엔 요청이 들어오면 이를 처리하기위한 프로세스나 쓰레드를 생성하는데 이를 대기하는 시간이 발생하고 (Thread waiting)이 과정에서 병목현상이 발생한다.

하지만 Node.js의 경우에는 다량의 작업이 요청되어도 쓰레드대기가 발생하지 않고 작업의 처리는 다른 쓰레드로 넘겨버리기 때문에 바로 다른 작업 요청을 받을 수 있다.

위 방식이 만능은 아니다. CPU의 영향을 많이 받는 요청의 경우 한정된 쓰레드에서 I/O 작업이 처리되며 이를 이벤트루프는 대기하기 때문에 이후 발생하는 다른 Request들에 병목현상이 발생한다.


Reference


  • akasai

    👨‍💻 Backend Developer

    • #Node.js
    • #Typescript
    • #GraphQL
    • #Serverless
    • #PostgreSQL
    • #Kubernetes