반응형
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Bbaktaeho

[Node.js] Node.js에 관한 고찰 (지극히 개인적인 궁금증 해결하기) 본문

개발 (Develop)/V8 (Node.js, Deno)

[Node.js] Node.js에 관한 고찰 (지극히 개인적인 궁금증 해결하기)

Bbaktaeho 2021. 4. 17. 23:18
반응형

가끔 코딩이 지루해질 때 온갖 잡생각을 하면서 멍 때리곤 합니다. 역시 이번에도 어김없이 찾아온 지루함 때문에 딴생각을 하다가 궁금한 점이 생겼습니다. 

Node.js의 네트워크 I/O를 느껴보고 싶다..

공식 문서 따라하기

Node.js의 공식 문서를 보면서 따라 해 봤습니다.

글로 몇 번이나 봤던 내용인데 실제로 동작 과정을 눈으로 보고 싶었습니다.

Node.js 공식 홈페이지!

공식 홈페이지에 작성된 코드를 그대로 사용했습니다.

 

서버 코드가 작성된 index.js, 서버에 요청과 응답을 테스트할 수 있는 test.sh을 작성했습니다.

서버의 응답을 좀 더 늦추기 위해서 서버 코드에 timeout 코드를 추가했습니다.

2초 뒤에 응답을 받을 수 있도록 작성했습니다.

 

쉘 스크립트에는 5번의 curl 요청을 보내도록 작성했습니다.

과연 어떤 결과를 보일지 테스트를 시작해봤습니다.

음? 무언가 이상합니다..? 왜 비동기 처리를 해주지 않는 거지?

setTimeout API가 잘못 동작하는 것 같아서 삽질을 했는데 쉘 스크립트를 잘못 작성해서 마치 순차적으로 I/O 처리를 하는 것처럼 테스트를 해버렸네요.. (공부를 해야 하는 이유)

 

다시 쉘 스크립트를 수정했습니다.

curl 요청을 기다리지 않는 것을 확인하기 위해서 i 변수를 출력하도록 변경했습니다.

 

다시 테스트를 해봤습니다.

처음 작성했던 쉘 스크립트가 응답을 기다리도록 작성되어서 2초마다 요청하도록 동작했고, 수정 후 curl 요청을 백그라운드에서 동작하게 만들어서 제대로 된 테스트를 할 수 있었습니다.

약 2초 후, 모든 요청이 정상적으로 응답하게 되었습니다. 요청 순서에 따른 기다림 없이 비동기로요! 

 

궁금한 점이 해결되었습니다. 그러나, 새로운 궁금증이 생겼습니다.

응답 후, 무한 루프에 빠진다면..?

무한 루프로 풍덩

Node.js는 싱글 스레드 기반으로 동작합니다(싱글 스레드라고 해서 모두 같은 스레드 위에서 동작하는 것은 아닙니다!!). 일반적인 방식으로 실행을 하게 되면 단일 코어에서 실행됩니다. 따라서 한 번 응답 후에 무한 루프에 빠지게 된다면 모든 다른 요청들은 응답을 받을 수 없을 것입니다. 하지만 실제로 느껴봐야 직성이 풀리니 시도해봤습니다!

sleep 함수를 만들고 응답 후에 무한 루프 코드를 추가했습니다. 나머지는 위의 코드와 동일합니다.

 

테스트!

5번의 요청에서 단 한 번의 응답 후, 서버는 무한 루프에 빠졌습니다.

당연하게도 하나의 프로세스로 실행되고 있으므로 현재 프로세스가 무한 루프에 빠져서 다음 요청들의 응답을 해줄 수 없었습니다.

여기서 또 궁금증이 생겼습니다.

멀티 프로세스 환경에서 무한 루프에 빠진다면..?

고생하는 컴퓨터

Node.js 서버를 단일 코어에서 실행된다면 자원을 제대로 활용하지 못하므로 성능도 좋지 못합니다. 그래서 cluster 모듈을 통해 멀티 프로세스 환경을 누릴 수 있습니다. 컴퓨터의 자원을 제대로 활용할 수 있게 만들어 주는 것이죠!

Node.js 공식 홈페이지!!

저는 멀티 프로세스 환경을 쉽게 구현하기 위해 pm2를 사용했습니다.

먼저 설치부터 해줍니다.

다음으로 pm2를 우아하게 사용할 수 있도록 ecosystem.config.js 파일을 생성합니다.

instances 속성으로 자신이 원하는 프로세스 수를 설정할 수 있습니다. 0으로 설정하면 컴퓨터의 최대 자원을 사용할 수 있습니다.

exec_mode를 cluster로 설정해야 다수의 코어를 사용할 수 있으니 빼먹지 말아야 합니다.

 

서버 코드는 log 함수를 추가했습니다.

저는 먼저 5개로 테스트해보겠습니다.

5번의 hello word가 정상적으로 응답 온 것을 확인할 수 있었습니다. log 출력도 각 프로세스마다 출력되었습니다.

하지만 5개의 인스턴스가 모두 무한 루프에 빠져있습니다. 요청을 한 번 더 하거나, 인스턴스를 하나 줄여서 서버를 실행하면 느낄 수 있습니다.

저는 인스턴스를 3개로 변경 후 재실행해보겠습니다.

예상했던 것처럼 5번의 요청에서 3번은 정상적으로 응답했고 나머지 2번의 요청은 모든 프로세스가 무한 루프에 빠져서 응답을 받지 못했습니다. 노트북의 쿨러의 소음이 살려달라고 외치는 것 같아 여기까지 테스트해야 될 것 같습니다.

마치며 

Node.js는 싱글 스레드 프로그래밍만으로도 멀티스레드 프로그래밍 성능을 구현할 수 있었습니다. 다만, 비동기 프로그래밍은 I/O 처리 요청 순서와 별개로 처리를 완료하는 순서는 제각각이므로 보장되지 않는 I/O 처리를 고려해야 하는 문제도 있다는 것을 확실히 알게 되었습니다(무한 루프가 아니라 외부 API 요청이라면?!).

이론으로만 익혔던 내용을 직접 눈으로 보면서 느껴볼 수 있어서 Node.js를 좀 더 신뢰할 수(?) 있는 계기가 되었습니다.

뿐만 아니라 쉘 스크립트를 제대로 익히지 않고 사용만 했더니 Node.js를 의심하고 setTimeout이 특수한 경우가 있다고 생각했습니다.. 제대로 뒤통수를 맞음으로써 반성하는 계기가 되었습니다.

 

다음은 더 많은 호기심과 궁금증을 가지고 오도록 하겠습니다.

스페셜 땡스 투

앱센터 센터장

반응형