PM2는 Node.js 애플리케이션을 관리하는 데 사용되는 프로세스 관리자입니다. ecosystem.config.js
파일을 사용하여 PM2의 동작을 설정할 수 있습니다. 이 파일에서는 애플리케이션의 실행 환경, 클러스터 모드 및 인스턴스 수를 설정할 수 있습니다. 아래에 ecosystem.config.js
파일의 구성과 리퀘스트 처리량을 고려한 스레드 수 설정 방법을 설명합니다.
ecosystem.config.js
파일 설명
ecosystem.config.js
파일은 PM2 설정을 위한 JavaScript 파일입니다. 이 파일을 통해 애플리케이션을 어떻게 관리할지 설정할 수 있습니다.
기본 구성 예제
module.exports = {
apps: [
{
name: 'cloud-album-backend',
script: 'dist/main.js', // 실행할 스크립트 경로
instances: 'max', // CPU 코어 수만큼 인스턴스를 실행
exec_mode: 'cluster', // 클러스터 모드 사용
env: {
NODE_ENV: 'development',
},
env_production: {
NODE_ENV: 'production',
},
watch: true, // 파일 변경 감지하여 재시작 (개발 환경에서 유용)
max_memory_restart: '200M', // 메모리 사용량 초과 시 재시작
},
],
};
주요 설정 옵션
name
: 애플리케이션의 이름.script
: 실행할 스크립트 파일의 경로.instances
: 실행할 인스턴스의 수.max
로 설정하면 CPU 코어 수만큼 인스턴스를 실행합니다.exec_mode
: 실행 모드.cluster
모드는 여러 인스턴스를 클러스터 모드로 실행하여 로드 분산을 합니다.env
: 기본 환경 변수 설정.env_production
:pm2 start ecosystem.config.js --env production
명령으로 실행 시 적용될 환경 변수 설정.watch
: 파일 시스템을 감시하여 파일이 변경되면 애플리케이션을 재시작합니다.max_memory_restart
: 설정된 메모리 사용량을 초과할 때 애플리케이션을 재시작합니다. 예:'200M'
또는'1G'
.
리퀘스트 처리량을 고려한 스레드 수 설정
스레드 수 설정 방법
- 클러스터 모드 사용:
exec_mode
를'cluster'
로 설정하고instances
를'max'
로 설정하면, PM2가 자동으로 CPU 코어 수에 따라 인스턴스를 생성합니다. - 인스턴스 수 지정: 특정 인스턴스 수를 지정할 수도 있습니다. 예를 들어, 4개의 인스턴스를 실행하고 싶다면
instances: 4
로 설정할 수 있습니다.
CPU 및 메모리 사용 최적화
- CPU 코어 수 파악:
- 일반적으로 인스턴스 수를 CPU 코어 수와 일치시키는 것이 좋습니다. 이는 애플리케이션이 병렬로 실행되어 각 코어를 최대한 활용할 수 있게 합니다.
- 코어 수가 많은 경우, 애플리케이션이 특정 한계점에서 성능 향상이 멈출 수 있으므로 실제로 사용량을 테스트하여 적정 수를 찾아야 합니다.
- 메모리 제한 설정:
- 메모리 사용량 감시:
max_memory_restart
를 설정하여 메모리 사용량이 특정 임계값을 초과하면 프로세스를 재시작합니다. - 예: 메모리 사용량이
200M
을 넘으면 재시작하도록 설정:'max_memory_restart': '200M'
.
- 메모리 사용량 감시:
환경에 따라 인스턴스 수를 조정하는 예제
module.exports = {
apps: [
{
name: 'cloud-album-backend',
script: 'dist/main.js',
// 프로덕션에서는 모든 코어 사용, 개발에서는 1개 인스턴스 사용
instances: process.env.NODE_ENV === 'production' ? 'max' : 1,
exec_mode: 'cluster',
env: {
NODE_ENV: 'development',
},
env_production: {
NODE_ENV: 'production',
},
watch: process.env.NODE_ENV !== 'production', // 프로덕션에서는 감시 비활성화
max_memory_restart: '200M',
},
],
};
PM2 설정 파일 및 실행 예제
ecosystem.config.js
전체
module.exports = {
apps: [
{
name: 'cloud-album-backend',
script: 'dist/main.js',
// 프로덕션에서는 모든 코어 사용, 개발에서는 1개 인스턴스 사용
instances: process.env.NODE_ENV === 'production' ? 'max' : 1,
exec_mode: 'cluster',
env: {
NODE_ENV: 'development',
GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET,
PORT: process.env.PORT || 3001,
},
env_production: {
NODE_ENV: 'production',
GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET,
PORT: process.env.PORT || 3001,
},
watch: process.env.NODE_ENV !== 'production', // 프로덕션에서는 감시 비활성화
//max_memory_restart: '200M',
log_date_format: 'YYYY-MM-DD HH:mm Z', // 로그 타임스탬프 형식
output: './logs/out.log', // 일반 로그 파일 경로
error: './logs/error.log', // 에러 로그 파일 경로
merge_logs: true, // 여러 인스턴스 로그 병합
},
],
};
PM2를 사용한 실행 방법
# 설정 파일로 애플리케이션 실행 (기본 환경)
pm2 start ecosystem.config.js
# 프로덕션 환경으로 애플리케이션 실행
pm2 start ecosystem.config.js --env production
# 애플리케이션 상태 확인
pm2 status
# 애플리케이션 로그 확인
pm2 logs
# 애플리케이션 중지
pm2 stop cloud-album-backend
# 애플리케이션 재시작
pm2 restart cloud-album-backend
# PM2 실행 목록 저장
pm2 save