티스토리 뷰

나는 Node.js로 프로젝트를 진행중이고 pm2로 서버를 관리하고 있다.
개발 서버(dev)는 fork 모드, 운영 서버(main)는 cluster 모드로 띄우고 있는데 왜 dev, main 환경에 따라 모드를 다르게 설정했는지, 그리고 그 기반이 되는 CPU 코어는 무엇인지 정리해보려고 한다.

 

 

 

두 모드의 차이를 알기 위해서는 PM2가 어떤 도구인지, CPU 코어는 무엇인지 이해할 필요가 있다.

 

PM2란?

Node.js 앱을 백그라운드에서 계속 돌게 해주는 프로세스 관리자이다.
코드가 죽거나 에러가 나도 자동으로 재시작해주고 로그 관리, 무중단 배포, 클러스터 실행까지 도와준다.

 

 

CPU의 코어(Core)란?

CPU에서 계산을 담당하는 연산 처리 장치이다.

하나의 코어가 한 번에 1개의 일을 처리한다. 코어 갯수가 많으면 한 번에 많은 일을 수행할 수 있다.

  • 코어가 1개면 → 한 번에 한 가지 일만 가능
  • 코어가 4개면 → 4가지 일을 동시에 병렬로 처리 가능

"다중 코어", "멀티 코어"는 여러 코어가 있어서 병렬 계산이 가능해진다. 즉, 코어 수가 많을수록 서버가 동시에 처리할 수 있는 작업이 많아진다.

 

 


 

포크(Fork) 모드

포크 모드는 앱을 한 프로세스로만 실행하는 방식이다.
Node.js 자체가 싱글 스레드이기 때문에 CPU의 한 코어만 사용한다.

빠르게 실행할 수 있어 테스트에 적합하고 로그, 오류 확인도 쉽다. 그러나 하나의 코어만 쓰기 때문에 프로세스가 죽으면 서비스 전체가 중단된다는 단점이 있다.

 

 

 

클러스터(Cluster) 모드

클러스터 모드는 CPU 코어 수만큼 Node 프로세스를 여러 개 띄워서 병렬로 처리하는 방식이다.

요청을 각 프로세스에게 분배한다. 한 프로세스가 죽어도 나머지가 계속 돌아가기 때문에 서비스가 유지되므로 안정적이다.

그렇다고 여러 프로세스가 메모리를 공유하지는 않는다.

 

 

 

코드 변경시 동작 차이

PM2의 Fork vs Cluster 모드는 코드가 변경됐을 때 reload/restart 동작도 다르다.

  • Fork 모드
    단일 프로세스이기 때문에 pm2 restart하거나 --watch 옵션을 사용하여 재시작한다.
    --watch 옵션이 없는 경우 pm2는 코드 변경을 인식하지 않는다.
  • Cluster 모드
    여러 프로세스가 병렬로 돌고 있어서 단순 restart는 잠깐의 다운타임이 생긴다.
    그래서 무중단 재시작을 위해 pm2 reload 명령어를 사용한다.

 

pm2 restart와 reload 명령어 비교

명령어 대상 다운타임 설명
pm2 restart fork, cluster 있음 프로세스를 모두 종료 후 다시 실행
pm2 reload cluster 없음 프로세스를 하나씩 재시작해서 무중단 배포 가능

 

 

 

 

 

참고

[NODE] 📚 클러스터(cluster) 모듈 - 멀티 프로세서 출처: https://inpa.tistory.com/entry/NODE-📚-cluster-모듈-코어를-추가로-사용?category=890802 [Inpa Dev 👨‍💻:티스토리]

 

 

[NODE] 📚 PM2 모듈 사용법 - 클러스터 / 무중단 서비스 출처: https://inpa.tistory.com/entry/node-📚-PM2-모듈-사용법-클러스터-무중단-서비스 [Inpa Dev 👨‍💻:티스토리]

Total
Today
Yesterday