Node.js 기본적으로 싱글 스레드로 동작하고, 단일 CPU 코어에서 실행됩니다. 이는 우리가 가지고 있는 서버가 8코어 혹은 16코어라고 해도 하나의 코어만 사용한다는 뜻이고, 자원을 모두 활용하지 못한다는 뜻입니다.
(Node.,js는 기본적으로 32bit에서는 512MB의 메모리, 64Bit에서는 1.5GB 메모리를 사용하도록 제한되어있습니다.)
Node.js 는 cluster 모듈을 사용하여서 cpu 코어를 모두 사용해서 작업을 병렬로 처리할 수 있습니다.
Node.js 클러스터에는 Primary 프로세스와 Worker 프로세스가 있습니다.
const cluster = require('cluster')
const http = require('http')
const numCPUs = require('os').cpus().length;
// 시스템 코어수
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running}`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, node, signal) => {
console.log(`${worker.process.pid}번 워커가 종료`);
console.log('code', code, 'signal', signal)
})
}
else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n')
}).listen(8000);
}
fork()를 통해 만들게 되면 모든 프로세스에서 포트를 공유하며 부하는 라운드로빈 방법을 사용하여 작업자간에 자동으로 분배됩니다.
cluster.on('online', function (worker) {
console.log('생성된 워커의 아이디 : ' + worker.process.pid);
});
cluster.on('exit', function (worker, code, signal) {
console.log('죽은 워커의 아이디 : ' + worker.process.pid);
console.log('죽은 워커의 exit code : ' + code);
console.log('죽은 워커의 signal : ' + signal);
});