작성한 질문수
[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
작성
·
1.3K
0
nodemon으로 개발후
배포시 pm2로 변경 작업하고 있습니다.
그런데 pm2 cluster -0 (CPU개수) 로 실행시
if(Cluster.master === true) 해당 코드는 동작을 안하는것 같습니다.
그리고 모니터링시 마지막 프로세스만 CPU가 100%가 넘어도 한개의 프로세스로 모든 test를 처리합니다.
위2가지 문제가 무엇인지 질문 드립니다.
답변 1
지금 현재 프로세스 수가 몇 개인가요? os.cpus().length 해서 알려주세요.
그리고 해당 부분 소스코드도 올려주세요.
프로세스 개수는 4개입니다. nodemon으로 하면 '<<<<SERVER STAR>>>' log가 찍히고
pm2 로 하면 Master 로그 안찍히고 else문만 동작하구요
마지막에 생긴 Cluster로만 이벤트 처리하고 있어요 CPU 100% 넘게 부하걸어도 마찬가지입니다.
추가 질문으로는 pm2 kill 했을때 log로 남기고 싶은데 process.on('SIGKILL', shutDown);으로는 동작을 안하네요ㅜ
const express = require('express');const morgan = require('morgan');const dotenv = require('dotenv');const os = require('os');const cluster = require('cluster');const webSocket = require('./socket.io');const logger = require('./service/loggerService');const pm2 = require('pm2');cluster.schedulingPolicy = cluster.SCHED_RR;//dotenv 에서 config를 가져와야 아래 mongo DB 연결시 id pw를 불러와 활용할 수 있다.dotenv.config();if(cluster.isMaster){ logger.info(`<<<<<< SERVER START >>>>>>>>>>>`); for(var i = 0; i < os.cpus().length; i++){ cluster.fork();}}else { logger.info(`<<<<<< ClUSTER START >>>>>>>>>>>`); const app = express(); app.set('port', 80); app.use(express.json()); const connectMongoDB = require('./schemas'); const barCodesRouter = require('./routes/barCodes'); const usersRouter = require('./routes/users'); connectMongoDB().then(() => { const expressServer = app.listen(app.get('port'), () => { logger.info(`${app.get('port')}번 포트에서 대기중`); }); webSocket(expressServer); }); app.use(morgan('combined')); app.use('/barCodes', barCodesRouter); app.use('/users', usersRouter); app.use((req, res, next) => { //생략 }); app.use((err, req, res, next) => { //생략 }}process.on('SIGTERM', shutDown);process.on('SIGINT', shutDown);process.on('SIGKILL', shutDown);function shutDown() { let clusterProcess = cluster.isMaster ? ` MASTER SERVER [pid:${process.pid}] `: ` WORKER SERVER [pid:${process.pid}] `; logger.info(`<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<${clusterProcess}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`); process.exit(0); setTimeout(() => { logger.info(`<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<${clusterProcess}>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`); process.exit(1); }, 10000);}
pm2로 하면 pm2가 내부적으로 cluster 모드를 실행하므로 cluster.isMaster가 실행 안 됩니다.
pm2를 쓸 때는 cluster 모듈 쓰실 필요 없습니다.
답변 감사합니다. 마지막 Cluster로 모든 event 처리하는건 제가 잘못 코딩한게 있을까요?
없습니다. 다만 pm2 kill이 아니라 pm2 stop을 해야 로그가 남을 것 같습니다.
프로세스 개수는 4개입니다. nodemon으로 하면 '<<<<SERVER STAR>>>' log가 찍히고
pm2 로 하면 Master 로그 안찍히고 else문만 동작하구요
마지막에 생긴 Cluster로만 이벤트 처리하고 있어요 CPU 100% 넘게 부하걸어도 마찬가지입니다.
추가 질문으로는 pm2 kill 했을때 log로 남기고 싶은데 process.on('SIGKILL', shutDown);으로는 동작을 안하네요ㅜ