在node.js / cluster中旋转子进程是个好主意吗?

时间:2012-06-22 07:32:46

标签: node.js

Apache Web Server有一个名为MaxRequestsPerChild的配置参数。 http://httpd.apache.org/docs/2.0/en/mod/mpm_common.html#maxrequestsperchild “在MaxRequestsPerChild请求之后,子进程将会死亡。”

为了避免因内存泄漏,连接过多或其他意外错误导致压缩,我应该在使用node.js群集模块时做同样的事情吗?

*我在node.js前面使用Nginx,而不是Apache。我提到它,以便我可以轻松解释。

我刚才这样实现:

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);
}

到目前为止一直运作良好,但我想知道还有更合适的方法。

1 个答案:

答案 0 :(得分:1)

MaxRequestsPerChild可以隐藏内存泄漏问题,但不应经常使用,因为它只是隐藏了真正的麻烦。首先尝试避免内存泄漏。 它不应该用于避免其他问题,例如连接太多,也不会出现其他意外错误。

当你使用MaxRequetsPerChild时,你不应该process.kill process.exit, 因为这会立即关闭所有正在进行的连接。

相反,您应该server.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