node.js v0.8.1のClusterモジュールを試す

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

node.js v0.8.0が出た。すぐにv0.8.1になった

v0.8.0の特徴

  • すげぇ速くなったよ
  • より安定したよ
  • 子プロセス起動時の引数指定が変わったよ
  • クラスターモジュールが最高っす
  • ドメインモジュールが追加されたよ
  • REPL(対話型node)が良くなったよ
  • ビルドシステムがwafからgypになったよ
  • いろいろ変わったな

v0.8.1の特徴

  • V8エンジンを上げたよ。 v3.11.10.12
  • npmを上げたよ。 v1.1.33
  • いろいろ修正したよ

セットアップ

node.js v0.8.1のインストール手順です。

$ . .nvm/nvm.sh
$ nvm install v0.8.1
$ nvm use v0.8.1
  v0.8.1
$ npm -v                                          
  1.1.33
$ npm update

クラスターモジュールを試す

v0.8.0の目玉であるクラスターモジュールを試してみたいと思います。node.jsが自分を親として、子プロセスでnode.jsを複数立ち上げるサンプルです。ちなみに、Amazon EC2のmediumインスタンスを使うとCPUが2つになります。

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
var util = require('util');

if (cluster.isMaster) {
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log("worker("+worker.id+").exit " + worker.process.pid);
  });
  cluster.on('online', function(worker) {
    console.log("worker("+worker.id+").online " + worker.process.pid);
  });
  cluster.on('listening', function(worker, address) {
    console.log("worker("+worker.id+").listening " + address.address + ":" + address.port);
  });

} else {
  http.createServer(function(req, res) {
    var ip_address = null;
    ip_address = req.connection.remoteAddress;
    console.log("client requested : " + ip_address);
    res.writeHead(200);
    res.end("hello world\n");
  }).listen(3000);
}

これを保存してバックグラウンドプロセスで起動します。子プロセスが2つ起動しましたね。

$ node app8.js &
[1] 18157
worker(2).online 18160
worker(2).listening 0.0.0.0:3000
worker(1).online 18159
worker(1).listening 0.0.0.0:3000

ブラウザからアクセスして動作を確認します。ブラウザにも表示され、コンソールにもログが出ています。

$ client requested : 117.55.68.XXX

psコマンドでプロセスの確認をしてみます。

$ ps ax | grep node                                                   
18157 pts/0    Sl     0:00 node app8.js
18159 pts/0    Sl     0:00 /home/ec2-user/.nvm/v0.8.1/bin/node /home/ec2-user/app8.js
18160 pts/0    Sl     0:00 /home/ec2-user/.nvm/v0.8.1/bin/node /home/ec2-user/app8.js
18165 pts/0    S+     0:00 grep node

killコマンドでプロセスを消してみます。ちゃんとnode.js子プロセスのexitイベントが動きましたね。

$ kill 18159
worker(1).exit 18159

まとめ

node.jsのClusterモジュールを試してみました。ノンブロッキングなアーキテクチャーのnodeは、何かのリクエストで処理が重くなると全体が重くなってしまいます。そこでクラスターモジュールです。Webサーバーとロジックサーバーのブロセスを分けるとイイ感じなのではと。ちなみに、CPUの数だけクラスターを増やすとイイ感じに性能が上がるようですよ。今日からプロセッサの性能を最大限引き出そう!!

参考資料

Node v0.8.0

Version 0.8.1 (stable)