- 네트워크 트래픽을 여러 서버나 리소스에 분산시키는 장치 또는 소프트웨어를 의미합니다. - PM2에서는 내장된 로드 밸런서의 클러스터 모드에서 작동하며 Node.js 애플리케이션의 여러 인스턴스 간에 요청을 분산시켜 성능을 최적화합니다. - 또한, 로드 밸런서는(Round Robin) 방식을 기본적으로 사용하며 순차적으로 다음 가용 워커에게 전달하는 방식을 이용합니다.
💡 다운타임 (Downtime)
- 시스템, 서버 또는 네트워크가 계획되었거나 예기치 않게 작동하지 않는 시간을 의미합니다. - 이는 서비스 중단, 유지보수, 업그레이드 또는 장애로 인해 발생할 수 있습니다. - PM2의 무중단 재로드 기능은 애플리케이션을 업데이트하거나 재시작할 때 다운타임을 최소화하거나 없애는 데 도움을 줍니다. 이는 사용자에게 지속적인 서비스를 제공하고 비즈니스 연속성을 유지하는 데 중요합니다.
1. 라이브러리 설치
💡 라이브러리 설치
- pm2의 경우는 전역으로 설치하여 pm2 xxx 명령어를 수행할 수 있도록 global로 설치를 해줍니다.
# pm2의 상태를 확인합니다
$ pm2 status
# or
# pm2의 리스트를 확인합니다.
$ pm list
요소
설명
id
프로세스의 고유 식별자
name
애플리케이션의 이름
namespace
애플리케이션의 네임스페이스
version
애플리케이션의 버전
mode
실행 모드 (예: fork, cluster)
pid
프로세스 ID
uptime
프로세스의 실행 시간
↺
재시작 횟수
status
프로세스의 현재 상태
cpu
CPU 사용량
mem
메모리 사용량
user
프로세스를 실행한 사용자
watching
파일 변경 감시 여부
4. PM2 구성요소
용어
설명
인스턴스(Instance)
실행 중인 애플리케이션의 개별적인 복사본으로, 각각 독립적으로 작동합니다.
클러스터 모드(Cluster Mode)
여러 개의 워커 프로세스를 생성하여 부하를 분산시키는 PM2의 실행 모드입니다.
프로세스(Process)
실행 중인 프로그램의 인스턴스로, 메모리와 CPU 자원을 사용합니다.
데몬 프로세스(Daemon Process)
백그라운드에서 지속적으로 실행되며 다른 프로세스를 관리하는 프로세스입니다.
마스터 프로세스(Master Process)
클러스터 모드에서 워커 프로세스를 생성하고 관리하는 주 프로세스입니다.
워커 프로세스(Worker Process)
실제 애플리케이션 코드를 실행하는 자식 프로세스로, 마스터 프로세스에 의해 관리됩니다.
에코시스템(Ecosystem)
PM2에서 여러 애플리케이션의 설정과 환경을 정의하는 구성 파일입니다.
2) PM2 특징 -1: 프로세스 관리
💡 PM2 특징 -1: 프로세스 관리
- PM2에서는 PM2 데몬을 통해서 프로세스에게 명령을 수행하며, 각 프로세스에 대해 상태를 지속적으로 감시하는 ‘중앙 제어 시스템’ 역할을 수행하며, 필요시에는 자동으로 재시작을 수행합니다. - 이 과정은 백그라운드에서 지속적으로 실행이 되며, 자동 재시작 기능을 제공하여 애플리케이션이 충돌하거나 시스템이 재부팅된 후에도 자동으로 시작이 됩니다.
1. 프로세스 관리 과정
💡프로세스 관리 과정
1. PM2 CLI → PM2 데몬
- Node.js 애플리케이션에서 PM2 CLI를 기반으로 PM2 데몬으로 생성, 삭제, 재시작 등의 명령을 수행시킵니다.
2. PM2 데몬 → 프로세스
- PM2 데몬에서는 프로스세들에게 명령을 내리고 프로세스의 상태를 지속적으로 감시하며, 필요시 자동으로 재시작을 수행합니다.
https://blog.naver.com/pjt3591oo/222775738382
2. 프로세스 사용 예시
💡 프로세스 사용예시
- 아래와 같이 pm2 start namespaceApp.js라는 파일을 pm2를 이용하여 PM2 CLI를 통해서 데몬 프로세스에 명령을 실행하였습니다. - 데몬은 namespaceApp.js라는 프로세스를 생성하고, 백그라운드에서 실행이 됩니다
# pm2를 기반으로 namespaceApp.js 파일의 프로세스를 생성합니다.
$ pm2 start namespaceApp.js
💡 사용예시
- 백그라운드에서 실행이 되는지 확인하기에 다시 한번 pm2 start로 해당 프로레스를 실행하면 이미 실행 중을 이야기하고 있습니다. - 또한 pm2 list 명령어를 입력하면 이전에 실행한 namespaceApp.js 프로세스가 실행됨을 확인하였습니다.
# pm2를 기반으로 namespaceApp.js 파일의 프로세스를 생성합니다.
$ pm2 start namespaceApp.js
# pm2 실행 목록을 확인합니다.
$ pm2 list
💡 실제 IDE 툴을 종료하고 다시 실행하더라도 백그라운드로 실행되기에 역시 실행이 되어 있음을 확인할 수 있습니다.
# pm2 실행 목록을 확인합니다.
$ pm2 list
[ 더 알아보기 ] 💡 mode 중에서 fork 모드는 무슨 모드인가?
- 단일 인스턴스 애플리케이션에서 이용되며 멀티스레딩이 필요하지 않은 애플리케이션에서 사용되는 모드입니다. - 클러스터 모드와 달리 각 인스턴스가 완전히 독립적이므로 메모리 사용량을 줄이고 프로세스 간 격리를 강화할 수 있습니다.
3) PM2 특징 -2 : 클러스터 모드(Cluster Mode)
💡 PM2 특징 -2 : 클러스터 모드(Cluster Mode)
- Node.js의 클러스터 모듈을 활용하여 여러 프로세스를 생성합니다. 이를 통해 멀티 코어 시스템에서 애플리케이션의 성능을 최적화할 수 있습니다. - 단일 스레드인 Node.js에서 클러스터 모드를 사용하여 멀티 스레드와 유사한 성능을 낼 수 있게 해 줍니다.
- 노드가 실행하는 파일이 속한 디렉터리를 감시하고 있다가 파일이 수정되면 자동으로 노드 애플리케이션을 재시작하는 확장 모듈을 의미합니다. - pm2를 이용하는 경우에는 개발 환경에서는 nodemon을 이용하며 이외의 환경에서 클러스터 모드가 아닌 pm2를 이용합니다.
[ 더 알아보기 ] 💡 개발 단계에서는 클러스터를 사용하지 않고 nodemon을 이용하는 이유는?
1. 간편성: nodemon은 설정이 간단하고 빠르게 적용할 수 있어 개발 과정에서 더 효율적입니다. 2. 리소스 효율성: 개발 중에는 일반적으로 많은 트래픽을 처리할 필요가 없어, 단일 프로세스로도 충분합니다. 3. 디버깅 용이성: 단일 프로세스에서 디버깅하는 것이 여러 프로세스를 동시에 디버깅하는 것보다 간단합니다. 4. 빠른 재시작: nodemon은 파일 변경을 감지하여 빠르게 재시작하므로, 개발 중 변경사항을 즉시 확인할 수 있습니다. 5. 메모리 사용: 개발 환경에서는 클러스터 모드를 사용할 때보다 메모리 사용량이 적습니다.
# nodemon을 개발 단계에서 사용하도록 설치합니다.
$ npm install nodemon --save-dev
# package.json 파일 내에 실행 명령어를 구성합니다.
"scripts": {
"start:loc": "nodemon app.js",
"start:dev": "pm2 start ./config/ecosystem.config.js --only app-dev",
},
💡 아래와 같이 nodemon을 통해서 개발 서버를 실행하였습니다.
2. 마스터 프로세스(Master Process)와 워커 프로세스(Worker Process)
💡 마스터 프로세스(Master Process)와 워커 프로세스(Worker Process)
- 클러스터 모드에서는 하나의 마스터 프로세스와 여러 개의 워커 프로세스가 실행이 됩니다.
- 마스터 프로세스(Master Process)는 클러스터 모드에서 중앙 관리 역할을 수행합니다. 이 프로세스는 워커 프로세스를 생성, 관리, 필요한 경우 재시작을 수행하는 역할을 합니다. - 워커 프로세스(Worker Process)는 실제로 클라이언트의 요청을 처리하는 역할을 합니다. 각 워커 프로세스는 독립적으로 실행되며, 특정 요청을 처리하고 응답을 반환합니다.
- 이를 통해서 단일 스레드 모델의 Node.js 애플리케이션이 여러 CPU 코어를 활용할 수 있게 되어, 결과적으로 멀티 스레드와 유사항 성능을 얻을 수 있습니다. - Node.js의 단일 스레드 특성을 유지하면서도, 시스템 리소스를 더 효율적으로 활용하여 멀티 스레드와 유사한 성능을 제공합니다.
[ 더 알아보기 ] 💡 데몬 프로세스랑 마스터 프로세스는 같은 것 아닌가?
- 마스터 프로세스의 경우는 클러스터 모드에서 워커 프로세스들을 관리하는 ‘중앙 프로세스’입니다. - 즉, 워커 프로세스의 생성, 관리, 재시작을 담당합니다.
- 데몬 프로세스의 경우는 백그라운드에서 실행되는 프로세스입니다. 즉, 전체 Node.js 애플리케이션을 관리합니다.
- 결론적으로, 데몬 프로세스는 전체 Node.js 애플리케이션을 관리하는 한편, 마스터 프로세스는 클러스터 모드에서 워커 프로세스들을 관리하는 역할을 수행합니다.
- PM2 컨텍스트에서 "인스턴스"와 "프로세스"는 실질적으로 같은 것을 가리키며, 둘 다 독립적으로 실행되는 애플리케이션의 복사본을 의미합니다.
4. 에코시스템(ecosystem)
💡 에코시스템(ecosystem)
- 클러스터 모드를 각각 파일 별로 관리하기 위한 설정 파일을 의미합니다. 이는 ecosystem.config.js 이름 형태로 관리가 됩니다. - 이를 설정하면 PM2가 클러스터 모드로 애플리케이션을 실행하며, 여러 인스턴스를 생성하여 로드 밸런싱과 성능 향상을 제공합니다.
# 실행 명령어
# develop Start
$ npm run start:dev
# Staging Start
$ npm run start:stg
# Production Start
$ npm run start:prd
4) PM2 특징 -3 : 로드 밸런서 (Load Balancer)
💡 PM2 특징 -3 : 로드 밸런서 (Load Balancer)
- 로드 밸런서는 네트워크 트래픽을 여러 서버나 리소스에 분산시키는 장치 또는 소프트웨어를 의미합니다. - PM2에서는 내장된 로드밸런서의 클러스터 모드에서 작동하며, Node.js 애플리케이션의 여러 인스턴스 간에 요청을 분산시켜 성능을 최적화합니다. - 또한, 로드 밸런서는 라운드 로빈(Round Robin) 방식을 기본적으로 사용하며 순차적으로 다음 가용 워커에게 전달하는 방식을 이용합니다.
- 작업 스케줄링과 부하 분산을 위해 널리 사용되는 알고리즘을 의미합니다. 이 방식을 사용하여 여러 프로세스에 요청을 균등하게 분배합니다. 1. 순차적 분배 - 요청이 들어오면 순서대로 각 프로세스에 하나씩 할당합니다. - 예를 들어, 4개의 프로세스가 있다면 첫 번째 요청은 1번 프로세스, 두 번째 요청은 2번 프로세스... 이런 식으로 진행됩니다.
2. 공평성 - 모든 프로세스가 동일한 수의 요청을 처리하게 되므로, 부하가 균등하게 분산됩니다. 이는 리소스 활용을 최적화하고 특정 프로세스에 과부하가 걸리는 것을 방지합니다.
3. 단순성 - 구현이 간단하고 이해하기 쉬워 많은 시스템에서 기본적으로 사용됩니다. 복잡한 로직이나 상태 추적이 필요 없어 오버헤드가 적습니다.
4. 효율성 - 프로세스의 처리 능력이 비슷할 경우 매우 효율적으로 작동합니다. 각 프로세스가 비슷한 시간 동안 요청을 처리한다면 전체적인 시스템 성능이 향상됩니다.
2. 라운드 로빈 작동 방식
💡라운드 로빈 작동 방식
1. 요청 도착: 새로운 요청이 로드 밸런서에 도착합니다. 2. 프로세스 선택: 로드 밸런서는 현재 차례인 프로세스를 선택합니다. 3. 요청 전달: 선택된 프로세스에 요청을 전달합니다. 4. 포인터 이동: 다음 프로세스를 가리키도록 내부 포인터를 이동합니다. 5. 반복: 새로운 요청이 올 때마다 2-4 단계를 반복합니다.
3. 로드 밸런서 수행과정
💡로드 밸런서 수행과정
1. Node.js의 내장 클러스터 모듈을 활용하여 로드 밸런싱을 구현합니다. 2. 클러스터 모드를 활성화하면 여러 워커 프로세스가 생성됩니다. 3. 마스터 프로세스는 워커 프로세스에게 요청을 분배합니다. 4. 분배 과정에서는 라운드 로빈 알고리즘을 사용합니다. 5. 수행이 완료된 프로세스에 대해서는 다음 워커로 요청을 전달합니다. 6. 워커 프로세스가 종료되거나 새로운 워커가 추가될 때, PM2는 자동으로 로드 밸런싱을 조정합니다.
- 이러한 과정을 통해 PM2는 효율적인 로드 밸런싱을 수행하며, 애플리케이션의 성능과 안정성을 향상합니다.
5) PM2 특징 - 4: 모니터링(Monitoring)
💡 PM2 특징 - 4: 모니터링(Monitoring)
- 각 프로세스의 CPU 사용량, 메모리 사용량, 요청 처리량 등을 실시간으로 모니터링합니다. 이 정보는 CLI나 웹 인터페이스를 통해 확인할 수 있습니다.
# 로그 파일의 최대 크기를 10MB로 설정합니다. 로그 파일이 이 크기에 도달하면 새 파일이 생성됩니다.
$ pm2 set pm2:logrotate:max_size 10M
# 최대 30개의 로그 파일을 유지하도록 설정합니다. 이보다 오래된 로그 파일은 자동으로 삭제됩니다.
$ pm2 set pm2:logrotate:retain 30
# 오래된 로그 파일을 압축하도록 설정합니다. 이를 통해 디스크 공간을 절약할 수 있습니다.
$ pm2 set pm2:logrotate:compress true
3. 로그 클리어
💡 로그 클리어
- PM2에서 로그 클리어는 저장된 로그 파일을 비우는 작업입니다. - 이 기능은 로그 파일이 너무 커져서 디스크 공간을 많이 차지하거나, 오래된 로그를 정리하고 싶을 때 유용합니다.
# 모든 애플리케이션의 로그 클리어
$ pm2 flush
# 특정 애플리케이션의 로그 클리어
$ pm2 flush [app-name]
4. 로그 포맷 설정
💡로그 포맷 설정
- PM2 설정 파일(ecosystem.config.js)에서 로그 포맷을 지정할 수 있습니다