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);
}
到目前为止一直运作良好,但我想知道还有更合适的方法。
答案 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