본문 바로가기
Programming/JS & TS

[Back-End] Node.js 를 효율적으로 사용하는 법은? (무중단, 병렬처리)

by 강한수달 2022. 1. 6.

Node.js

특징 

- Node.js는 싱글 스레드(Thread)로 동작하고, 단일 CPU 코어에서 실행됨

- 이는 서버의 CPU가 멀티 코어(8, 16 코어 등)여도 단 하나의 코어만 사용함

 

Cluster

특징

- CPU 코어를 모두 활용하여 병렬 처리 작업이 가능케 해주는 Node.js 모듈

- CPU 당 하나의 Worker 생성 (기본값)

- MasterWorker 로 구성되며, Master 는 Worker 를 관리함

- Master 가 죽는 경우 모든 Worker 는 죽게됨

- 아래와 같은 번들 플러그인이 제공됨

  • cli : 클러스터를 관리할 수 있는 명령창
  • debug : 클러스터에 대한 디버깅 정보
  • logger : Master, Worker 로그
  • pidfiles : Master, Worker pidfiles 쓰기
  • reload : 파일 변경 시 작업자를 다시 로드
  • repl: 실시간 관리 수행
  • stats: repl 플러그인에 실시간 통계 추가

 

예제 코드

- app.js

var http = require('http');
 
module.exports = http.createServer(function(req, res){
  console.log('%s %s', req.method, req.url);
  var body = 'Hello World';
  res.writeHead(200, { 'Content-Length': body.length });
  res.end(body);
});

 

- server.js

var cluster = require('cluster')
  , app = require('./app');
 
cluster(app)
  .use(cluster.logger('logs'))
  .use(cluster.stats())
  .use(cluster.pidfiles('pids'))
  .use(cluster.cli())
  .use(cluster.repl(8888))
  .listen(3000);

 

PM2

특징

- *로드 밸런서가 내장된 Node.js 애플리케이션용 프로덕션 프로세스 관리자

- 어플리케이션을 영구적으로 유지하고 일반적인 시스템 관리 작업을 용이하게 할 수 있음

- 클러스터 모드 : 여러 프로세스를 시작하고 이들 사이에서 HTTP/TCP/UDP 쿼리를 로드 밸런싱하여, 전체 성능(16코어 시스템에서 10배)과 안정성(처리되지 않은 오류의 경우 더 빠른 소켓 재조정)이 향상

   * 클러스터 모드는 Node.js 의 Cluster Module 을 통해 동작함

- 무중단 서비스 : Hot Reload를 사용하면 다운타임 없이 어플리케이션을 업데이트 할 수 있음

- 프로그램의 예상치 못한 종료 시 자동 재시작을 지원함

- 표준, 원시, JSON 및 형식화된 로그 지원 및 모니터링 도구를 지원함

 

 

PM2 프로세스 관리창 [3]

[3] npmjs, package/pm2 5.1.2

 

※ 로드 밸런서란?

: 서버에 가해지는 부하를 적절하게 분산해주는 장치나 기술을 의미한다. 예를들어 서버 A, B, C 는 1초당 100 의 작업량을 소화할 수 있다 가정하고 서버에 180 의 작업량이 부과됐다면 로드밸런서는 전체 작업량을 나눠 각 서버당 작업량을 60 씩 할당하여 나누어 처리하는 것이다.

 

설치 방법

npm install pm2 -g

 

사용 방법

- 앱 시작

$ pm2 start app.js

또는 다른 응용프로그램을 실행할 경우

$ pm2 start bashscript.sh
$ pm2 start python-app.py --watch
$ pm2 start binary-file -- --port 1520

 

- 프로세스 관리

$ pm2 restart <파일명 | 네임스페이스 | 아이디 | 'all' | json 파일명>
$ pm2 reload <파일명 | 네임스페이스 | 아이디 | 'all' | json 파일명>
$ pm2 stop <파일명 | 네임스페이스 | 아이디 | 'all' | json 파일명>
$ pm2 delete <파일명 | 네임스페이스 | 아이디 | 'all' | json 파일명>

 

- 클러스터 모드

$ pm2 start <파일명 | 네임스페이스 | 아이디 | 'all' | json 파일명> -i <프로세스 개수>

만약 4개의 CPU를 사용하여 실행하려는 경우

pm2 start app.js -i 4

모든 CPU를 사용하고 싶다면 'max' 혹은 -1 사용

pm2 start app.js -i max

pm2 는 미리 지정해둔 설정값 파일(.json)로도 실행할 수 있음

 

- setting.json

{
  apps : [{
    script : "app.js",
    instances : "max",
    exec_mode : "cluster"
  }]
}

아래와 같이 실행함

pm2 start setting.json

 

 

이 외 클러스터 모드에 대한 자세한 내용

 

 

PM2 - Cluster Mode

Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.

pm2.keymetrics.io

 

- 로그 표시

실시간으로 로그를 표시할 경우

$ pm2 logs

이전 로그 기록을 보려는 경우

$ pm2 logs --lines 200

 

- 터미널 기반 대시보드

Here is a realtime dashboard that fits directly into your terminal

$ pm2 monit

[4] keymetrics, pm2 documentation

 

 

# Reference

[1] npmjs, package/cluster 0.7.7

  URL : https://www.npmjs.com/package/cluster

[2] docker + PM2 + winston.js를 활용한 무중단 운영 시스템 구축하기

  URL : https://loy124.tistory.com/388 

[3] npmjs, package/pm2 5.1.2

  URL : https://www.npmjs.com/package/pm2

[4] keymetrics, pm2 documentation

  URL : https://pm2.keymetrics.io/docs/usage/quick-start

[5] Tistory, short-term, PM2의 Cluster mode는 어떻게 동작할까요?

  URL : https://short-term.tistory.com/6

 

 

 

 

댓글