[CS] NodeJS 특징

Onam Kwon·2022년 10월 18일
0

CS

목록 보기
14/22
post-custom-banner

NodeJS

  • JSruntime, 자바스크립트가 돌아가는 환경을 말하며 웹 브라우저 외의 영역인 서버측에서 자바스크립트 언어를 사용 할 수 있게 해준다.
  • 각 브라우저별로 엔진이 존재하며, 해당 엔진은 아래와 같다.
브라우저엔진
ChromeV8
IEChakra
FirefoxSpider monkey
SafariJavaScriptCore
  • 여기서 크롬 브라우저의 V8 엔진이 NodeJS에 들어가있고, 엔진의 역할은 자바스크립트 언어를 기계어로 해석하는 역할을 한다.
    • 크롬이 빠른 이유는 V8의 성능이 좋기때문.

특징

  • Single thread non-blocking I/O
    • 입출력은 싱글 스레드, 실질적인 작업은 이벤트 루프에 의해 멀티 스레드로 실행.
    • 간단한 작업에 관해 고효율
  • CPU intensive한 작업에 관하여 비효율
  • Interprete language(인터프리터 언어)
  • 동기적 언어가 비동기적으로 움직이는법 아래 링크 클릭

Single thread

  • 하나의 스레드가 모든 작업 수행.
  • 단일 스레드 이므로 메모리 사용량이 적다.
    • 스레드 하나가 무너진다면 프로그램 전체에 문제가 발생.
    • 메모리 사용량이 적기때문에 CPU사용률이 높은 어플리케이션에서는 NodeJS사용을 권장하지 않는다.
  • 단일 스레드 이기 때문에 하나의 작업 시간이 많이 걸리면 전체 시스템의 성능이 떨어짐.

I/O

  • 입렵과 출력, Input Output을 의미하며 파일 읽기, 쓰기, 폴더 생성이나 네트워크 요청 등이 대표적인 예시.

Blocking I/O

  • 하나의 프로세스가 어떤 자원을 사용하고자 할 때 그 자원을 다른 프로세스가 점유하고 있다면, 그 프로세스가 자원의 사용을 마칠 때까지 기다리는 것. 이때 기다리고있는 프로세스는 blocked되었다고 표현하며 실제로 아무것도 하지 않는다.
  • 여러개의 스레드를 사용한다 해도 CPU또한 한정적인 자원이기 떄문에 CPU를 차지하기 위한 스레드의 대기시간이 필요함.
    • 추가로 스레드에게 자원을 분배하기 위해 사용하는 스케줄링도 CPU를 이용해 연산이 필요한 작업이기 때문에 쓰레드가 많아질수록 이부분에 대한 성능저하가 발생함.
  • 위 설명은 single threadmulti thread보다 좋다는 뜻은 아니며 단지 특징을 설명하는 내용이기 떄문에 상황에 맞게 사용하는게 좋습니다.

Single thread non-blocking I/O

  • 위의 문제를 보안하기 위해 NodeJS는 싱글 스레드, 이벤트 기반 논 블로킹 I/O를 채택하였다.
    • 때문에 스레드가 한개여도 처리 완료에 대한 응답을 기다리지 않고 콜백 등록 후 다음 작업으로 바로 넘어갈 수 있다.
    • I/O 요청에 대한 작업을 완료하지 않아도 해당 작업은 이벤트 루프에 의해 내부적으로 따로 작동하기 때문에 스레드는 다음 요청으로 건너뛸 수 있다.
      • 바로 이 이유 때문에 NodeJS는 싱글 스레드 이지만 간단하고 많은 작업에 대해서 고성능이라고 할 수 있다.
  • 요청이 많은 SNS, 채팅 등이 적합하다.

Interprete language

  • 스크립트 언어의 특성 상 해당 언어가 수행되어야 에러가 나는지 확인할 수 있고, 에러가 날 경우 프로세스가 종료됨(잘죽음).
  • 실제로 AWS EC2에서 도커로 배포 후 며칠 후 실행 시간을 보니 DB는 계속 살아있었지만 서버는 죽었다가 재시작된걸 확인 할 수 있었다.

추가(중요)

  • WebAPI와 같이 비동기적으로 작동하는 함수들은 JS 환경에서 요청이 생성되지만 실행 되는 환경은 JS가 아닌 커널에서 작동된다 (JS 외부).
    • 이것이 동기적 언어인 JS가 비동기적으로 작동하는 것처럼 보이는 핵심적인 이유이다.

도움이 될만한 사이트

profile
권오남 / Onam Kwon
post-custom-banner

0개의 댓글