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)无限
非常感谢您的帮助