Server Node.js:所有外部连接都开始挂起

时间:2014-01-17 18:02:38

标签: node.js sockets request connection-timeout

node.js脚本启动服务器( function:startServer )并等待客户端,然后根据客户端的请求脚本解析多个站点( function:wget )和给出排序结果。

在每秒50个请求的加载时,在站点的所有外部连接开始挂起后5-10秒,连接在超时时被丢弃(错误:套接字挂断) 但是它没有改变任何东西,之后一切都只是悬挂。

功能启动服务器:

function startServer(cfg, cb) {
var server = http.createServer();
server.listen(cfg.port, cfg.hostname);

server.on('connection', function (socket) {
    socket.setNoDelay();
});

server.on('clientError', function (exception) {
    console.log('Server: clientError', exception);
});

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

    request.socket.on('error',function(err){
        console.log('socket error: ', err);
    });

    cb(request, response);
});

server.on('error', function (err) {
    console.error('Server:', err);
});

}

获取页面

function wget(options, onResult) {

var prot = options.port == 443 ? https : http;

var req = prot.request(options, function (res) {

    res.setEncoding('utf8');

    var output = '';

    res.on('data', function (chunk) {
        output += chunk;
    });

    res.on('end', function () {
        onResult(null, res, output);

    });
}); 

req.on('error', function (err) {
    onResult(err, null, null);
});

req.on('socket', function (socket) {
    socket.setTimeout(3000);
    socket.on('timeout', function () {
        req.abort();
    });
});

req.end();

}

多次请求

var tmp = [];
http.globalAgent.maxSockets  = 50000;
https.globalAgent.maxSockets = 50000;

_config.providers.forEach(function (provider) {

    tmp.push(function (callback) {

        var opt = provider;
        opt.agent = false;
        //        opt.host = ''; // from provider.host
        //        opt.port = ''; // from provider.port
        wget(opt, function (error, resp, body) {
            var ok = null;
            if (!error) {
                ok = {provider: provider, data: body.toString()};
            } else {
                console.log(error, opt.host + opt.path);
            }
            callback(null, ok);
        });

    });

});

// start requests to providers
_async.parallel(tmp, function (err, results) {
    // .. code..
    serverResponse.end('results');
});

服务器操作系统FreeBSD 9.2

节点:v0.10.22

在服务器上增加所有可能的限制

  

ulimit -a

     

套接字缓冲区大小(字节,-b)无限

     

核心文件大小(blocks,-c)无限

     

数据段大小(千字节,-d)33554432

     

文件大小(块,-f)无限

     

最大锁定内存(kbytes,-l)64

     

最大内存大小(千字节,-m)无限

     

打开文件(-n)200000

     

管道大小(512字节,-p)1

     

堆栈大小(kbytes,-s)524288

     

cpu time(seconds,-t)无限

     

最大用户进程(-u)9000

     

虚拟内存(kbytes,-v)无限

     

交换大小(kbytes,-w)无限

非常感谢您的帮助

0 个答案:

没有答案