0

Apache Web サーバーには、MaxRequestsPerChild という構成パラメーターがあります。 http://httpd.apache.org/docs/2.0/en/mod/mpm_common.html#maxrequestsperchild "MaxRequestsPerChild リクエストの後、子プロセスは終了します。"

メモリ リーク、接続数が多すぎる、またはその他の予期しないエラーによるクラッシュを回避するには、node.js クラスター モジュールを使用するときに同じことを行う必要がありますか?

*node.js の前に Apache ではなく Nginx を使用しています。簡単に説明できるように言及しました。

私はちょうどそれを次のように実装しました:

var maxReqsPerChild = 10; // Small number for debug
var numReqs = 0;

if (cluster.isMaster) {
  var numCPUs = require('os').cpus().length;
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('death', function(worker) {
    // Fork another when one died 
    cluster.fork();
  });
} else {
  http.createServer(function(webReq, webRes) {
    // Count up
    numReqs++;

    // Doing something here

    // Kill myself
    if (numReqs > maxReqsPerChild) {
      process.kill(process.pid); // Or more simply, process.exit() is better?
    }
  }).listen(1338);
}

これは今までうまく機能していましたが、もっと適切な方法があるのではないかと思っています。

4

1 に答える 1

1

MaxRequestsPerChild は、メモリ リークの問題を隠すのに適していますが、実際の問題を隠すだけなので、あまり頻繁に使用しないでください。まず、メモリリークを回避してください。接続が多すぎるなどの他の問題や、その他の予期しないエラーを回避するために使用しないでください。

MaxRequetsPerChild を使用する場合は、process.killどちらも使用しないでくださいprocess.exit。進行中のすべての接続がすぐに閉じられるためです。

代わりに、server.close進行中のすべての接続が終了するのを待ってから、「close」イベントを発生させる必要があります。

var server = http.createServer(...);
server.on( "close", function() {
    process.exit(0);
});
server.on( "request", function () {
    requestCount += 1;
    if ( options.max_requests_per_child && (requestCount >= options.max_requests_per_child) ) {
        process.send({ cmd: "set", key: "overMaxRequests", value: 1 });
        if ( ! server.isClosed ) {
            server.close();
            server.isClosed = 1;
        }
    }
});

ここで完全な動作例を参照してください: https://github.com/mash/node_angel

于 2013-09-25T17:37:31.973 に答える