노드는 싱글 스레드로 동작하기 때문에 멀티 프로세스의 이점을 보지 못한다. IO에 대한 처리는 이벤트 루프를 통해서 좋은 성능을 보여주지만 ,CPU계산양이 많은 부분에서는 성능이 급격하게 떨어진다. 

이부분을 클러스터링을 통해서 상당 부분 해결 할 수있다.


var cluster = require('cluster');


cluster.isMaster()와 cluster.isWorker()로 현재 프로세스가 마스터 프로세스인지 워커 프로세스인지 알수있다.

내부적으로는 process.env.NODE_WORKER_ID === undefined이면 마스터 프로세스로 판단한다.


마스터 프로세스일 경우에는 워커프로세스를 생성하고, 워커 프로세스일 경우에 HTTP 서버를 생성한다.


require('os').cpus().length를 사용하면 CPU의 개수를 알수 있으므로, 프로세스마다 하나의 워커 프로세스를 같게 CPU개수 만큼 cluster.fork()로 워커 프로세스를 생성한다. 

워커 프로세스를 생성할때, 균일하게 생성해 주기 위해서

cluster.schedulingPolicy = cluster.SCHED_NONE; //워커 스케쥴을 OS에 맡긴다.

cluster.schedulingPolicy = cluster.SCHED_RR; //워커 스케쥴을 Round Robin 방식으로 한다.
중 라운드 로빈 방식을 사용하기로 한다.


워커 프로세스가 생성되면 online이벤트 cluster.on('online', founction(worker){ }); 가 생성되어 워커의 정보를 알수있으며,

워커 프로세스가 종료할 때 발생하는 exit이벤트cluster.on('exit')를 주어서 프로세스가 종료할때 프로세스 아이디를 출력해 줬지만, 다시 cluster.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);

}); 




윈도우에서는 SET NODE_DEBUG=cluster를 실행후, node app.js 를 실행 한다.

그외에서는 NODE_DEBUG=cluster node app.js 를 실행한다.


cluster.fork()로 생성도니 프로세스간에는 메시지를 전달할 수있다.

마스터 프로세스에

worker.on('message', function(msg){});이벤트를 등록해서 워커프로세스의 메시지를 수신하는 부분이다.

werker.send(message)를 통하여 워커프로세스에게 메시지를 보낸다.

워커 프로세스에

process.send({cmd: " "});로 마스터 프로세스에 메시지를 보낼수 있다.

process.on('message', function(msg){ }); 마스터 프로세스로 부터 전송받은 메시지를 처리하는 이벤트


'Programming > Node.JS' 카테고리의 다른 글

지금 현재 서버의 ip를 알고 싶을때  (0) 2016.09.14
mysql 모듈  (0) 2016.09.05
코딩의 관례  (0) 2016.09.05
express.js 구조  (0) 2016.09.05
Express.js 설치하기  (0) 2016.09.05

+ Recent posts