본문 바로가기
Research/Server

PM2 모듈 기본 사용법

by RIEM 2023. 3. 1.

레퍼런스


Node.js cluster vs. PM2

Node.js

  • Chrome V8 엔진 기반 자바스크립트 런타임
  • Event Driven, Non-blocking I/O 모델로 가볍고 성능 뛰어나다는 장점
  • 기본적으로 싱글 스레드(Single thread)
    • Node.js 어플리케이션은 단일 CPU 코어에서 실행. 멀티 코어 시스템 사용 불가
    • 모든 코어를 사용하지못하여 자원 효율이 좋지 못할 수도 있음
      • 이를 해결하기 위해 Cluster 모듈 사용
        • Cluster 모듈은 단일 프로세스 -> 멀티 프로세스(Worker)로 늘려줌
        • 마스터 프로세스에서 코어 수만큼 워커 프로세스 생성
        • 문제는 사소한 로직을 수동으로 구현해줘야하기에 개발 주기가 늘어남.
      • 이를 대신 처리해주는 것이 PM2 Node.js 프로세스 매니저

PM2 모듈

  • Process Manager 2의 약자
  • Node.js 프로세서 관리해주는 모듈
    • 장점
      • 주요 기능은 서비스 중 서버 꺼지더라도 재시작해줌
      • 싱글 스레드인 Node.js를 멀티 코어 또는 하이퍼 스레딩으로 변환
      • 클라이언트의 요청에 대한 로드 밸런싱
    • 단점
      • 멀티 스레딩이 아니기에 메모리 자원 공유 불가
        • 메모리 저장한 세션을 다른 프로세스와 공유하지 못함. -> 멤캐시 또는 Redis 사용하여 해결

준비 및 실행

// app.js
const express = require('express');

const app = express();

app.get('/', (req, res) => {
  res.send('<h1>Yo!!</h1>');
});

app.listen(3000, () => {
  console.log('pm2 server is running..');
});

기본 앱 파일 생성

# pm2 설치
$ npm install -g pm2

# pm2 버전 확인
$ pm2 -version

# pm2 업데이트
$ pm2 update

pm2 설치

pm2 start <filename>

pm2 실행

pm2 실행 시 fork 모드(자식 프로세스)로 앱을 실행한다. 서버 실행 즉시 Daemon화 되어 끄거나 에러 발생하지 않는 이상 실행이 지속된다.

pm2 실행 옵션

  • --watch : 프로젝트 변경사항 감지 시 자동 재시작
    • --watch --ignore-watch="[dir]/" : 특정 디렉토리 변경은 무시
  • -i max(코어 수) : Node.js 싱글 스레드 보완을 위한 클러스터 모드
    • -i 코어 수 : 코어 수 지정
    • max : 최대 코어 개수로 클러스터링 지정
  • --name : 앱 이름 지정
  • --max-memory-restart <200MB> : 앱 리로드 시 최대 메모리 지정
  • --log <log_path> : 로그 파일 경로 지정
  • -- arg1 arg2 arg3 : 스크립트 추가 인수 전달
  • --restart-delay <delay in ms> : 재시작 시 딜레이 지정
  • --time : 로그 남길 시 시간 지정
  • --no-autorestart : 재시작 불가 설정
  • --cron <cron_pattern> : 주기적으로 강제 재시작 하고싶을 때 사용하는 크론 설정
# 프로세스 감시, 코어는 2개(멀티코어)로 실행
$ pm2 start app.js --watch -i 2 

Screen Shot 2023-03-01 at 4 55 23 PM
Mode가 cluster 로 되어있음을 알 수 있다.

pm2 start app.js -i max # 최대 코어 개수로 클러스터링
pm2 start app.js -i 0

Screen Shot 2023-03-01 at 4 57 44 PM
코어가 8개여서 총 8개의 클러스터가 생겼다.

pm2 프로세스 스케일링

만약 프로세스를 scale up하거나 scale down해야 할 경우에도 pm2는 유용하다. 실시간으로 증가시킬 수 있다

pm2 scale app +2 # app 프로세스 개수 +2

실시간으로 2개 추가 증설하기

Screen Shot 2023-03-01 at 5 02 12 PM
클러스터 2개인 상태에서 2개를 추가하니 총 4개가 되었다.

pm2 scale app 4 # app 프로세스 개수는 4개로 고정하기

pm2 상태 확인

$ pm2 status
$ pm2 ls
$ pm2 l
$ pm2 list

다 같은 명령어다.

Screen Shot 2023-03-01 at 5 03 51 PM

  • uptime, status 사이에 화살표 ⤴ 표시가 있는데, 재시작을 얼마나 했는지 알려준다. 이 횟수가 많으면 서버 에러로 인해 재부팅이 자주 발생한 것이니 이 부분은 트러블 슈팅해주어야 한다.

프로세스 중지

$ pm2 stop <app_name | namespace | id | 'all' | json_conf>
$ pm2 stop 2 # id 2번 프로세스 중지
$ pm2 stop app # app 프로세스 중지

프로세스 재시작

$ pm2 restart <app_name | namespace | id | 'all' | json_conf>
$ pm2 restart 2 # 2번 프로세스 재시작

프로세스 리로드

$ pm2 reload <app_name | namespace | id | 'all' | json_conf>
$ pm2 reload app
$ pm2 reload all

restart vs reload

  • pm2 restart : 모든 프로세스를 다 죽이고 재시작. 빠르지만 잠깐 서비스가 일시중지된다는 단점
  • pm2 reload : 프로세스 1개씩 죽여가는 방식으로 재시작. 최소한 1개 프로세스를 유지하면서 하나씩 차례대로 재시작하기에, 서비스를 유지하면서도 재시작할 수 있다. 이를 0-second-downtime 또는 zero downdown 무중단 이라 불림. 조금 더 느리지만 안정적임.

프로세스 삭제

$ pm2 delete <app_name | namespace | id | 'all' | json_conf>
$ pm2 delete 2
$ pm2 delete app
$ pm2 kill # 모든 프로세스 한방에 삭제

로그

  • 기본 로그파일 저장 위치 /root/.pm2/pm2.log
$ pm2 log # 전체 프로세스 로그 보기
$ pm2 log [process name | process id] # 특정 프로세스 로그 보기
$ pm2 log --lines 200 # 200줄만 보기
$ pm2 log --err 200 # 에러 로그만 보기

로그 관리

pm2 실행할 때마다 로그는 저장된다. 로그가 계속 저장되면 서버 용량 부족 현상이 발생한다. 이를 관리하는 pm2-logrotate를 사용해보자

$ pm2 install pm2-logrotate #pm2로 설치한다
$ pm2 set pm2-logrotate:<option> <value> # 옵션 설정은 다음과 같이 설정
$ pm2 set pm2-logrotate:max_size 1K
$ pm2 set pm2-logrotate:retain 10
  • max_size : 로그 파일 사이즈 제한 크기. 기본 10메가
  • retain : 소유할 로그 파일 최대 개수 설정. 기본 30개
  • compress: 로그파일 gzip으로 압축할지 여부. 기본 false
  • dateFormat: 로그 파일 날짜 형식. 기본은 YYYY-MM-DD_HH-mm-ss
  • workerInterval : 1초당 로그파일 사이즈 확인 회수. 기본 초당 30회
  • rotateInterval : 크론잡. 기본 값은 '0 0 * * * '

프로세스 정보

$ pm2 show <id> | <name>
$ pm2 describe <id> | <name>

모니터링

  • 각 프로세스의 메모리, CPU 사용률, 현재 상태
  • 선택된 프로세스 로그
  • Heap size, 사용률
  • 어플리케이션 정보
    등을 제공
    pm2 monit

설정 파일로 관리

pm2 설정파일 생성

npm에 package.json이 있다면, pm2에는 ecosystem.config.js가 있다. 위 CLI 명령어들을 한 파일에 다 모아서 관리할 수 있다.

이 부분에 대한 상세한 내용은 포스트를 참고하면 좋다.
https://inpa.tistory.com/entry/node-%F0%9F%93%9A-PM2-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%EB%B2%95-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EC%84%9C%EB%B9%84%EC%8A%A4#pm2_%EC%83%81%ED%83%9C_%ED%99%95%EC%9D%B8_ls_|_status

'Research > Server' 카테고리의 다른 글

서버_AWS EC2 Ubuntu에 NGinx 설치하는 방법  (0) 2023.03.06
서버_Nginx란  (0) 2023.03.06
서버_Forward Proxy, Reverse Proxy, Load Balance  (0) 2023.02.06
서버_Nginx를 왜 쓰는가?  (0) 2023.02.06
서버_Serverless란  (0) 2023.02.06

댓글