728x90
레퍼런스
- 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
- https://engineering.linecorp.com/ko/blog/pm2-nodejs/
- https://engineering.linecorp.com/ko/blog/pm2-nodejs/
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 프로세스 매니저
- 이를 해결하기 위해 Cluster 모듈 사용
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
Mode가 cluster 로 되어있음을 알 수 있다.
pm2 start app.js -i max # 최대 코어 개수로 클러스터링
pm2 start app.js -i 0
코어가 8개여서 총 8개의 클러스터가 생겼다.
pm2 프로세스 스케일링
만약 프로세스를 scale up하거나 scale down해야 할 경우에도 pm2는 유용하다. 실시간으로 증가시킬 수 있다
pm2 scale app +2 # app 프로세스 개수 +2
실시간으로 2개 추가 증설하기
클러스터 2개인 상태에서 2개를 추가하니 총 4개가 되었다.
pm2 scale app 4 # app 프로세스 개수는 4개로 고정하기
pm2 상태 확인
$ pm2 status
$ pm2 ls
$ pm2 l
$ pm2 list
다 같은 명령어다.
- 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
728x90
'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 |
댓글