长时间运行的Node.js进程在运行数天后会变慢

时间:2011-07-19 16:59:59

标签: node.js

我在EC2上运行node.js脚本来监视并运行节点HTTP服务器作为子进程。

不幸的是,这个子服务器缓慢减速,花费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);

1 个答案:

答案 0 :(得分:1)

如果EC2实例是Micro实例,并且您在高CPU运行超过约15秒的使用时间,那么您将受到限制(严重)。这可以解释症状。解决方案是扩展到一个小实例。 (它不一定是消耗cpu周期的Node进程)。