NodeJS 성능 향상 방법 2 - PM2

기운찬곰·2020년 12월 28일
1

NodeJS 이론

목록 보기
4/4
post-thumbnail

본 글은 Udemy에서 Node JS: Advanced Concepts 강의를 듣고 정리한 글입니다.

Hits


Cluster

일단 저번시간에 살펴본 Cluster에 대해 간략하게 요약하고 문제점이 무엇인지 살펴본다음 정말 많이 사용되는 PM2에 대해 알아보도록 하겠다.

저번시간 요약

NodeJS는 기본적으로 싱글 스레드이기 때문에 CPU의 멀티코어 시스템을 사용할 수 없다. 만약 보유하고 있는 서버의 사양이 4코어라면 하이퍼스레딩을 지원한다면 최대 8코어를 사용할 수 있는데 모든 코어를 사용해 최대 성능을 내지 못하고 오직 한개의 코어만 사용해야 한다면 주어진 자원을 제대로 활용하지 못하는 꼴이 된다.

그래서 저번시간에 이런 문제를 해결하기 위해 클러스터(Cluster)모듈을 통해 단일 프로세스를 멀티 프로세스(Worker)로 늘리는 방법에 대해 알아봤다. 우리는 클러스터 모듈을 사용해 마스터 프로세스에서 CPU 코어 수만큼 워크 프로세스를 생성해서 모든 코어를 사용하겠끔 만들면 효과적이라는 사실도 알게되었다.

Cluster 문제점

애플리케이션을 처음 실행하면 처음에는 마스터 프로세스만 생성된다. 이때 CPU 개수만큼 워크 프로세스를 생성하고 각각 수행해야 할 일들을 정리해서 구현하면 된다. 예를 들어 워커 프로세스가 생성됐을 때 온라인 이벤트가 마스터 프로세스로 전달되면 어떻게 처리할지, 워커 프로세스가 예상치 못한 오류로 종료되면 종료 이벤트를 전달할땐 어떻게 처리해야 할지, 애플리케이션 변경을 반영하기 위해 어떤식으로 재시작 해야할지 고민할게 많다.

이런 것들은 직접 개발하기에 번거러운 작업이다. 따라서 이런 문제를 간편하게 해결할 수 있는 무언가가 있으면 좋겠다고 생각했고 그래서 나온 것이 바로 PM2라는 NodeJS 프로세스 매니저이다.


PM2 (Process Manager 2)

PM2는 아래와 같이 Node.js의 패키지 매니저(Package Manager)인 NPM으로 쉽게 설치할 수 있다.

설치

pm2는 전역적으로 사용할일이 많으므로 전역설치를 해주겠다.

$ npm install -g pm2

실행

저번시간에 실행했던 파일 중에 cluster 부분은 제거해주었다.

const express = require('express');
const app = express();

function doWordk(duration) {
  const start = Date.now();

  // duration동안 while루프
  while (Date.now() - start < duration) {}
}

app.get('/', (req, res) => {
  doWordk(5000); // 이 코드는 이벤트 루프에서 처리된다.
  // 결국 또다른 req를 처리하지 못하며, 데이터베이스나 파일처리도 못할 것이다.
  res.send('Hi there');
});

app.get('/fast', (req, res) => {
  res.send('This was fast!');
});

app.listen(3000);

그런다음 pm2 start 명령을 통해 pm2를 동작시킨다. 여기서 -i 0은 cpu 코어 개수만큼 클러스터 하겠다는 뜻이다. 만약 -i -1로 하면 1개는 남겨놓는다. 사실 한개는 남겨놓는편이 좋다.

$ pm2 start index.js -i 0

내 코어 수는 4개이므로 4개가 표에 나타난 것을 볼 수 있다. $ pm2 list를 통해서 다시보기 가능.

모니터링

$ pm2 monit를 통해 모니터링도 할 수 있다. localhost:3000에 접속하면 어느 한 process의 CPU가 증가하는 것을 볼 수 있을 것이다.

삭제

$ pm2 delete [이름]를 통해 모든 프로세스를 제거할 수 있음.

그 외 명령어

  • 프로세스 종료 : $ pm2 stop <app_name|id|'all'|json_conf>
  • 프로세스 재시작 : $ pm2 restart <app_name|id|'all'|json_conf>
  • 프로세스 정보 보기 : $ pm2 describe <id|app_name>
  • PM2 실시간 로그 보기 : $ pm2 logs ['all'|'PM2'|app_name|app_id]
  • 프로세스 리로드(권장) : $ pm2 reload <app_name|id|'all'|json_conf>

참고

profile
배움을 좋아합니다. 새로운 것을 좋아합니다.

0개의 댓글