开发者

Node.js http request memory and cpu hog

I have a node.js script that continuously requests a page, sort of like a cron job.

However, after a few minutes Node starts to use a lot of CPU (up to 70%) and memory (up to 200mb).

What is wrong with my script?

function cron(path)
{
    var http = require('http');
    var site = http.createClient(443, 'www.website.com', true);
    var request = site.request('GET', path, {'host': 'www.website.com'});
    request.end();

    request.on('response', function (response) {

        setTimeout(function(){cron(path)},15000);
    });


}

cro开发者_StackOverflow中文版n('/path/to/page');


request.on('response', function (response) {
    setTimeout(function(){cron(path)},15000);
});

For every response you create a new cron job. Log your responses. If your getting more then 1 from your request then your exponantially creating more cron jobs.

Your creating a function() {} with a reference to path. So the entire scope state is kept. you want to free memory by adding this:

var site = null;
var request = null;

Your calling require("http") inside a function rather then outside in module scope. You only need to get http once so place at the top of your file in module scope.

var http = require('http');
var site = http.createClient(443, 'www.website.com', true);
function cron(path)
{

    var request = site.request('GET', path, {'host': 'www.website.com'});
    request.end();

    var once = true;
    request.on('response', doIt);

    function doIt(response) {
        if (!once) {
            once = null;
            doIt = function() {};
            setTimeout(function(){cron(path)},15000);
        }
    });

    site = null;
    request = null;
}

cron('/path/to/page');


In addition to the tips from @Raynos, here's another. I find that recursive calls like this in long running processes make me a bit nervous so I'd err on the side of using setInterval instead. I'd maybe split the cron and the http behaviour apart in case you want to try and re-use that logic, although that'll depend on your context:

e.g. in node 0.4.7:

var https = require('https');

function poll(path)
{
    https.get({
        host: 'www.website.com',
        port: 443,
        path: path
    }, function(res) {
        console.log("Got response: " + res.statusCode);
    }).on('error', function(e) {
        console.log("Got error: " + e.message);
    });

}

function cron(path)
{
    return setInterval(function(){
        poll(path);
    },15000);
}

var intervalId = cron('/path/to/page'); // keep in case you need to use clearInterval
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜