인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Chi haeng Yi님의 프로필 이미지
Chi haeng Yi

작성한 질문수

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

nodemon 과 pm2 차이

작성

·

1.3K

0

nodemon으로 개발후 

배포시 pm2로 변경 작업하고 있습니다.

그런데 pm2  cluster -0 (CPU개수) 로 실행시 

if(Cluster.master === true) 해당 코드는 동작을 안하는것 같습니다. 

그리고 모니터링시 마지막 프로세스만 CPU가 100%가 넘어도 한개의 프로세스로 모든 test를 처리합니다. 

위2가지 문제가 무엇인지 질문 드립니다.

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

지금 현재 프로세스 수가 몇 개인가요? os.cpus().length 해서 알려주세요.

그리고 해당 부분 소스코드도 올려주세요.

Chi haeng Yi님의 프로필 이미지
Chi haeng Yi
질문자

프로세스 개수는 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 모듈 쓰실 필요 없습니다.

Chi haeng Yi님의 프로필 이미지
Chi haeng Yi
질문자

답변 감사합니다. 마지막 Cluster로 모든 event 처리하는건 제가 잘못 코딩한게 있을까요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

없습니다. 다만 pm2 kill이 아니라 pm2 stop을 해야 로그가 남을 것 같습니다.

Chi haeng Yi님의 프로필 이미지
Chi haeng Yi

작성한 질문수

질문하기