1
我正在EC2上運行node.js腳本來監視和運行節點HTTP服務器作爲子進程。長時間運行Node.js進程在運行幾天後變慢
不幸的是,這個子服務器緩慢減速,需要0.2秒的請求開始拖出,幾天後相同的請求需要2秒鐘。
作爲調試的一部分,我實現了一個2小時重新啓動來殺死子服務器並啓動另一個。這沒有效果! HTTP服務器子進程重新啓動,但仍然很慢!只有重新啓動這個父腳本才能讓孩子更快。
爲什麼HTTP服務器減速,即使在被殺死和重新啓動?
EC2 Ubuntu服務器上的環境爲0.4.9 Node.js。家長腳本如下。
var http = require('http');
var server,
firstOperated = null;
lastOperated = null;
function operating(str) {
return (str.toString().substring(0, 13) != 'SERVER ONLINE') ? log(str) :
lastOperated = new Date();
}
function log(str) {
str = str.toString('utf8');
if (str.length) console.log(str.replace(/\n+$/gim, ''));
}
function createServer() {
if (server) {
server.kill('SIGKILL');
return console.log('KILLED NON RESPONSIVE SERVER');
}
server = require('child_process').spawn('node', [__dirname + '/http.js', 80]);
firstOperated = new Date();
server.stdout.on('data', operating);
server.stderr.on('data', log);
server.on('exit', function(code) {
lastOperated = null;
server = null;
console.log("SERVER EXITED: " + code);
});
}
createServer();
setInterval(function() {
if (new Date() - firstOperated > 1000 * 60 * 60 * 2) return createServer();
if (new Date() - lastOperated < 5 * 1000) return; // server seems to be operating ok
createServer();
}, 5 * 1000);
爲什麼每次調用createServer()時都要調用require('child_process')?在createServer()之外調用require('child_process')是否會改善事物? – Ivan