NodejsのマルチプロセステンプレートClusterについて

2338 ワード

前言
私達はすべてnodejsの最大の特徴が単一プロセス、無閉塞運転であり、非同期イベント駆動であることを知っています.Nodejsのこれらの特性は、例えばサーバ開発において、同時要求処理は大きな問題であり、閉塞式の関数は資源の無駄と時間の遅延を引き起こす.イベント登録、非同期関数により、開発者は資源の利用率を高め、性能も向上します.Node.jsがシングルプロセス、シングルスレッドモードを採用している以上、マルチコアハードウェアが流行している現在の環境では、シングルコア性能が優れているNodejsは、マルチコアCPUをどのように利用しますか?創始者のRyan Dahlは、複数のNodejsプロセスを実行し、いくつかの通信メカニズムを利用して各タスクを調整することを提案しています.現在、多くの第三者のNode.jsマルチプロセスサポートモジュールがリリースされていますが、NodeJS 0.6.x以上のバージョンはclusterモジュールを提供しています.「同じsocketを共有する」プロセスのセットを作成して、負荷圧力を分担することができます.本記事では、このclusterモジュールに基づいて、Node.jsのマルチコアCPUの下でのプログラミングについて説明します.
Clusterの使い方紹介
まず、このテンプレートの例示的なアプリケーションコードを貼り付けて、次に分析します.コードは以下の通りです.
'use strict';

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

if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    cluster.on('listening',function(worker,address){
        console.log('listening: worker ' + worker.process.pid +', Address: '+address.address+":"+address.port);
    });

    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {
    process.env.NODE_ENV = 'production';
    require('./server.js');
}
負荷バランス問題
一つの要求が来たら、ワーカープロセスAを処理しますか?それともワーカープロセスBを処理しますか?みんなが均等に働くことをどう保証しますか?これが負荷バランスの問題です.
現在は2つのオプションの方法で負荷の均衡を行うことができます.
初期のclusterは各workerプロセスが自分でsocketポートをモニターするので、オペレーティングシステムによってworkerプロセスを起動させます.オペレーティングシステムがランダムにworkerプロセスを選択すると思われやすく、サービスの負荷バランスが取れています.しかし、実際には、Linuxのようなオペレーティングシステムは、常にいくつかのプロセスを起動します.システムにとっては、コンテキスト切り替え時に高価な操作で、最近呼び覚ましたプロセスが良い選択です.初期のこの方式は負荷が非常に不均衡であった.
0.1.2バージョンから、clusterはround-robinモードの負荷バランスを増加しました.masterプロセスは傍受を担当しています.要求を受けたら、workerプロセスに転送して、複数のworkerプロセスは交替で作業します.round-robinは現在のclusterのデフォルト負荷均衡処理モードです.もしwindowsプラットフォームを除いて、前のモードに戻るなら、2つの方法があります.
(1)clusterがローディングした後に他のcluster関数を起動しない前に実行できます.cluster.scheduling Policy=cluster.SCHED_NODE;を選択します
(2)環境変数NODE_を設定するCLUSTERSCHEDPOLICY=「none」
プロセスモニタ
マスタープロセスは自動的にワーカープロセスの生死を管理できません.もしワーカーが外界に殺されたら、自動的に再起動しません.マスタープロセスに「exit」メッセージを送ります.開発者は自分で管理してください.
データ共有の問題
各ワーカープロセスは独立しています.複数のワーカープロセスがデータを共有するために、Nodejs以外にデータベースを構築し、複数のワーカープロセスがデータベースを通じてデータを共有します.