2011-07-19 116 views
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); 
+2

爲什麼每次調用createServer()時都要調用require('child_process')?在createServer()之外調用require('child_process')是否會改善事物? – Ivan

回答

1

如果EC2實例是微實例,你是在高CPU運行超過約15秒的使用,那麼你將被節流(嚴重)。這將解釋這些症狀。解決方案將擴大到一個小實例。 (它不一定是消耗CPU週期的節點進程)。