Node.js는 기본적으로 싱글 스레드로 동작한다. 즉, CPU의 멀티코어 시스템을 사용할 수 없다.
그러나 서버의 사양은 더 많은 코어를 제공한다면 자원을 제대로 활용하지 못하는 것이다.
Node.js는 이런 문제를 해결하기 위해 클러스터 모듈을 통해 단일 프로세스를 멀티 프로세스로 늘릴 수 있는 방법을 제공한다.
그것이 바로 PM2(Process Manager)이다.
pm2는 종료됐을 때의 이벤트도 처리할 수 있어 무중단 서비스를 제공한다.
$ npm install pm2 -g
만약 permission denied가 뜬다면 sudo로 권한을 부여하면 된다.
# pm2를 실행하는 명령어로 js파일을 실행하는 것과 같다
$ pm2 start app.js
실행하면 PM2는 default로 fork 모드로 애플리케이션을 실행한다.
모든 CPU를 사용하기 위해서는 애플리케이션을 cluster모드로 실행해야 한다.
$ pm2 init
다음 코드를 실행하면 ecosystem.config.js 파일이 생성된다.
나에게 필요한 옵션은 다음과 같다.
더 자세한 옵션 : https://pm2.keymetrics.io/docs/usage/quick-start/
module.exports = {
apps : [{
name: 'aedo',
script: './app.js',
instances: 0, // 0이면 CPU 개수에 맞춰 스레드 생성
exec_mode: 'cluster', // fork가 아닌 cluster 모드로 실행
merge_logs: true, // 클러스터 모드 사용 시 각 클러스터에서 생성되는 로그를 한 파일로 합쳐준다.
autorestart: true, // 프로세스 실패 시 자동으로 재시작할지 선택
watch: false, // 파일이 변경되었을 때 재시작 할지 선택
}]
};
그러나 ES6 모듈을 사용하고 있어 module.exports 에러가 난다.
이때, ecosystem.config.js 파일명을 ecosystem.config.cjs로 바꿔주면 된다.
다시 실행해보면 cluster 모드로 실행된다.
$ pm2 stop app.js
$ pm2 status
# 프로세스 4개 늘리기
$ pm2 scale app +4
# 프로세스 4개 줄이기
$ pm2 scale app -4
# 프로세스 4개로 설정하기
$ pm2 scale app 4
그동안 배포해서도 npm start를 했는데 이 방법을 알게 되었다!
싱글 스레드의 단점을 이렇게 보완할 수 있다니 신기했다.
로그를 관리하는 방법도 더 알아 보고, 고려할 사항이 있을 경우 아래 블로그들을 참조해서 더 자세히 공부해야겠다.