pm2
모듈을 사용하는 것은 노드의 동작 방식과 연관이 많다.
node.js
는 기본적으로 싱글 스레드로 돌아간다.
만약 8코어 16스레드의 서버에서 구동하게 되더라도 노드는 싱글 스레드이기에 하나의 스레드를 사용하고 나머지 자원은 사용하지 못한다. 따라서 자원을 제대로 활용하지 못하게 되는 것이다.
이러한 문제를 해결 하기 위해 클러스터 모듈
을 통해 단인 프로세스를 멀티 프로세스로 늘릴 수 있는 방법을 제공한다. 이렇게 개발자는 클러스터 모듈
을 사용해서 마스터 프로세스에서 코어 수 만큼 워커 프로세스를 생성해서 모든 코어를 사용하게끔 할 수 있다.
하지만! 이러한 최적화 작업은 직접 구현하는 것보다 솔루션을 사용해서 해결 하는 방법을 알아보자!
$ npm install -g pm2 # pm2 전역 설치
$ pm2 -version # pm2 버젼 확인
$ pm2 update # pm2 업데이트
pm2 start <파일명> # 애플리케이션 시작
pm2 stop app_name_or_id # 애플리케이션 중단 (app_name_or_id는 애플리케이션의 이름 또는 ID로 대체)
pm2 restart app_name_or_id # 애플리케이션 재시작 (app_name_or_id는 애플리케이션의 이름 또는 ID로 대체)
pm2 stop all # 모든 애플리케이션 중단
pm2 restart all # 모든 애플리케이션 재시작
pm2 list # 모든 애플리케이션 목록 표시
pm2 logs # 애플리케이션 로그 보기
pm2 show app_name_or_id # 애플리케이션 정보 표시 (app_name_or_id는 애플리케이션의 이름 또는 ID로 대체)
pm2 delete app_name_or_id # 애플리케이션 제거 (app_name_or_id는 애플리케이션의 이름 또는 ID로 대체)
pm2 monit # 모니터링 대시보드 열기
pm2 실행 환경에 대한 설정을 해야한다. 아래는 가장 기본 값만 설정한 것이다.
ecosystem.config.js
이라는 이름으로 프로젝트 루트에 생성하자.
module.exports = {
apps: [
{
name: 'ensight',
script: 'npm',
args: 'start',
},
],
};
백그라운드에서 정상적으로 실행되었고 fork
모드로 실행 된 것을 볼 수 있다.
모드는 크게 2가지가 있는데
1. Fork 모드
2. Cluster 모드
기본 설정으로 실행하면 다음과 같이 fork
모드로 실행되는 것을 볼 수 있습니다.
다음과 같이 설정 파일을 생성하고
// PM2 설정 파일
module.exports = {
apps: [
{
// 애플리케이션 이름 (임의로 설정 가능)
name: 'ensight',
// 실행할 스크립트와 인수
script: 'npm',
args: 'start',
// 동시에 실행할 인스턴스 수 (이 경우, 최대로 실행)
instances: 'max',
// 프로세스가 비정상적으로 종료될 때 자동으로 다시 시작
autorestart: true,
// 파일 변경 감지를 사용하지 않음
watch: false,
// 메모리 임계값을 설정하여 재시작
max_memory_restart: '1G',
// 실행 환경 변수 설정
env: {
NODE_ENV: 'production',
},
},
],
};
실행하게 되면 다음과 클러스터 모드로 4개의 인스턴스가 생성 된 것을 볼 수 있다.
pm2 monit
명령어를 통해서
현재 실행 상태를 볼 수 있다.