gist

2012年1月30日月曜日

CPUを最大限活かそう。Nodeでclusterを使ってみる

Nodeでは、クラスタを簡単に実装できます。こんなに簡単でいいのか。

server.js

var cluster = require('cluster');
var http = require('http');

// CPUの数
var numCPUs = require('os').cpus().length;

if(cluster.isMaster) {
    for(var i=0; i<numCPUs; i++) {
        // マスターだったらforkします
        var worker = cluster.fork();
        console.log('worker forked: pid=' + worker.pid);
    }   

    // worker終了時のイベントハンドラ
    cluster.on('death', function(worker) {
        console.log('worker ' + worker.pid + ' died');
    }); 
}
else {
    // サーバー起動
    http.Server(function(req, res) {
        res.writeHead(200);
        res.end('Hello World\n');
    }).listen(3000);
    console.log('server started: http://localhost:3000/');
}

// node終了時に、forkしたworkerを終了します。
// これがないとworkerが終了しないです。
process.on('SIGINT', function() {
    if(cluster.isMaster) {
        console.log('master killed: pid=' + process.pid);
    }   
    else {
        console.log('worker killed: pid=' + process.pid);
    }   
    process.exit(0);
});

実行結果(CPUが2つの場合)

$ node server.js 
worker forked: pid=18981
worker forked: pid=18982
server started: http://localhost:3000/
server started: http://localhost:3000/
^Cmaster killed: pid=18980
worker killed: pid=18982
$ worker killed: pid=18981

起動後、Control+Cで終了すると、master→worker→workerの順に終了するのがわかります。

CPUを沢山お持ちの方は、負荷テストするとその効果がわかります。

参考:Node.js の Cluster のベンチマークをとってみた

0 件のコメント: