NodejsのマルチプロセスモジュールClusterについて
3597 ワード
前述のとおり
私達はすべてnodejsの最大の特徴が単一プロセス、無閉塞運転であり、非同期イベント駆動であることを知っています.Nodejsのこれらの特性は、例えばサーバ開発において、同時要求処理は大きな問題であり、閉塞式の関数は資源の無駄と時間の遅延を引き起こす.イベント登録、非同期関数により、開発者は資源の利用率を高め、性能も向上します.Node.jsがシングルプロセス、シングルスレッドモードを採用している以上、マルチコアハードウェアが流行している現在の環境では、シングルコア性能が優れているNodejsは、マルチコアCPUをどのように利用しますか?創始者のRyan Dahlは、複数のNodejsプロセスを実行し、いくつかの通信メカニズムを利用して各タスクを調整することを提案しています.現在、多くの第三者のNode.jsマルチプロセスサポートモジュールが発表されましたが、NodeJSは 0.6.x以上のバージョンはclusterモジュールを提供しています. ,「同じsocketを共有する」プロセスのセットを作成して、負荷圧力を分担することができます.本記事では、このclusterモジュールに基づいて、Node.jsのマルチコアCPUの下でのプログラミングについて説明します.
Clusterモジュールの紹介
nodejsが提供しているclusterモジュールはまだ試験段階にあります.v 0.0.7の公式文書でモジュールのリリース情報は以下の通りです.
Clusterの使い方紹介
まず、このモジュールの例示的なアプリケーションコードを貼り付けて、次に詳細な分析を行います.コードは以下の通りです.
問題の分析
前に述べたように要求があった時、システムによってその要求をどのプロセスに任せるかを決定します.このような完全にシステムの負荷バランスに依存している重要な欠陥があります.ウィンドウズ、linux、Solarisにおいて、あるサブプロセスのaccept queueが空である限り、システムは複数のconnetionを同じサブプロセスに割り当てます.これはプロセス間の負荷が非常に不均衡です.特に、長い接続を使う時、単位時間内のnew comming connectionは高くないです.サブルーチンのaccept queueはいつも空です.connectionは同じプロセスにどんどん割り当てられます.このような負荷バランスはaccept queueの空き度に完全に依存しています.短い接続を使って、しかも同時に非常に高い場合にのみ負荷バランスを達成できます.しかし、この時はシステムのロードが非常に高くなり、システムが不安定になります.
後記
その後もnodejsの多プロセス開発について研究し、まとめて共有します.
私達はすべてnodejsの最大の特徴が単一プロセス、無閉塞運転であり、非同期イベント駆動であることを知っています.Nodejsのこれらの特性は、例えばサーバ開発において、同時要求処理は大きな問題であり、閉塞式の関数は資源の無駄と時間の遅延を引き起こす.イベント登録、非同期関数により、開発者は資源の利用率を高め、性能も向上します.Node.jsがシングルプロセス、シングルスレッドモードを採用している以上、マルチコアハードウェアが流行している現在の環境では、シングルコア性能が優れているNodejsは、マルチコアCPUをどのように利用しますか?創始者のRyan Dahlは、複数のNodejsプロセスを実行し、いくつかの通信メカニズムを利用して各タスクを調整することを提案しています.現在、多くの第三者のNode.jsマルチプロセスサポートモジュールが発表されましたが、NodeJSは 0.6.x以上のバージョンはclusterモジュールを提供しています. ,「同じsocketを共有する」プロセスのセットを作成して、負荷圧力を分担することができます.本記事では、このclusterモジュールに基づいて、Node.jsのマルチコアCPUの下でのプログラミングについて説明します.
Clusterモジュールの紹介
nodejsが提供しているclusterモジュールはまだ試験段階にあります.v 0.0.7の公式文書でモジュールのリリース情報は以下の通りです.
Stability: 1 - Experimental
このモジュールの機能についてソースドキュメントでは、「A single instance of Node runs in a single thread.To take advantage of multi-coree system the user will sometimes want to launch a cluster of Node processs to handle the load」という意味です.多核システムのリソースを十分に利用するためには、Nodeプロセスのセットを実行して負荷を分担する必要がある場合がある.Clusterの使い方紹介
まず、このモジュールの例示的なアプリケーションコードを貼り付けて、次に詳細な分析を行います.コードは以下の通りです.
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
require('os').cpus().forEach(function(){
cluster.fork();
});
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
cluster.on('listening', function(worker, address) {
console.log("A worker with #"+worker.id+" is now connected to " +
address.address +
":" + address.port);
});
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world
");
console.log('Worker #' + cluster.worker.id + ' make a response');
}).listen(8000);
}
このコードは簡単です.メインスレッドは現在実行されているjsファイルです.メインスレッドはあなたのマシンシステムの核数によって子プロセスを作成します.全てのプロセスは一つの傍受ポート8000を共有し、要求があれば、メインラインはこの要求を任意にサブプロセスに割り当てる.consolone.log(''Worker'+cluster.worker.id+'make a reponse')このコードはどのプロセスでこの要求を処理しますか?問題の分析
前に述べたように要求があった時、システムによってその要求をどのプロセスに任せるかを決定します.このような完全にシステムの負荷バランスに依存している重要な欠陥があります.ウィンドウズ、linux、Solarisにおいて、あるサブプロセスのaccept queueが空である限り、システムは複数のconnetionを同じサブプロセスに割り当てます.これはプロセス間の負荷が非常に不均衡です.特に、長い接続を使う時、単位時間内のnew comming connectionは高くないです.サブルーチンのaccept queueはいつも空です.connectionは同じプロセスにどんどん割り当てられます.このような負荷バランスはaccept queueの空き度に完全に依存しています.短い接続を使って、しかも同時に非常に高い場合にのみ負荷バランスを達成できます.しかし、この時はシステムのロードが非常に高くなり、システムが不安定になります.
後記
その後もnodejsの多プロセス開発について研究し、まとめて共有します.