node.js v0.8.1のClusterモジュールを試す
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の数だけクラスターを増やすとイイ感じに性能が上がるようですよ。今日からプロセッサの性能を最大限引き出そう!!