2012-06-22 3 views
0

Apache Web Server имеет конфигурационный параметр MaxRequestsPerChild. http://httpd.apache.org/docs/2.0/en/mod/mpm_common.html#maxrequestsperchild «После запросов MaxRequestsPerChild дочерний процесс будет умирать».Является ли поворот дочерних процессов в node.js/cluster хорошей идеей?

Чтобы избежать раздавливания, вызванного утечками памяти, слишком большим количеством подключений или других непредвиденных ошибок, должен ли я делать то же самое при использовании модуля кластера node.js?

* Я использую Nginx перед node.js, а не 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

process.exit() лучше. – Mustafa

+0

Спасибо, Мустафа. Я пытался использовать process.exit(), но этот подход приводит к фундаментальной проблеме - то есть, когда process.exit (или process.kill), все остальные запросы в один и тот же момент умирают, не реагируя на их клиентов. – chikaram

ответ

1

MaxRequestsPerChild хорош для скрыть проблемы с утечкой памяти, но не следует использовать слишком часто, потому что он просто скрывает настоящую проблему. Сначала попробуйте избежать утечек памяти. Его нельзя использовать, чтобы избежать других проблем, таких как слишком много соединений и других непредвиденных ошибок.

Когда вы используете MaxRequetsPerChild, вы не должны ни process.killprocess.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

Смежные вопросы