PM2 cluster mode로 Next.js 프로덕션 성능 올리기

문제

Node.js는 싱글 스레드라서 CPU 코어가 4개여도 1개만 쓴다. 트래픽이 몰리면 하나의 프로세스가 다 감당해야 한다.

해결

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'my-app',
    script: 'node_modules/next/dist/bin/next',
    args: 'start --port 3000',
    instances: 2,           // CPU 코어 수만큼 (또는 'max')
    exec_mode: 'cluster',   // cluster 모드 활성화
    max_memory_restart: '800M',
    env: {
      NODE_ENV: 'production',
    },
    // 재시작 정책
    exp_backoff_restart_delay: 100,
    max_restarts: 10,
    min_uptime: '10s',
    // 로그
    log_date_format: 'YYYY-MM-DD HH:mm:ss',
    merge_logs: true,
  }]
};
pm2 start ecosystem.config.js
pm2 monit    # 실시간 모니터링
pm2 reload my-app  # 무중단 재시작

핵심 포인트

  • instances: 'max'로 하면 전체 코어를 다 쓰는데, 라즈베리파이 같은 소형 서버에서는 2개 정도로 제한하는 게 안정적이다. OS랑 Redis 같은 다른 서비스에도 코어가 필요하니까.
  • exp_backoff_restart_delay: 100은 앱이 죽었을 때 100ms부터 시작해서 점점 간격을 늘리며 재시작한다. 무한 재시작 루프를 방지한다.
  • pm2 reloadrestart와 다르게 프로세스를 하나씩 순차적으로 교체해서 다운타임이 없다.