AubE Log : 오브 로그

일상 생활에 대한 이야기, 프로그램 개발에 대한 기록 등 일련의 기억들을 다시 되짚어 본다.

Node.js

PM2: Node.js 프로세스 관리: 무중단 ecosystem exec_mode cluster instances max

오브:AubE 2024. 9. 25. 13:40

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

 

https://aube1225.blogspot.com/2024/07/pm2-nodejs.html