这里是我的示例代码:Node.js Http.request在负载测试下变慢。难道我做错了什么?
var http = require('http');
var options1 = {
host: 'www.google.com',
port: 80,
path: '/',
method: 'GET'
};
http.createServer(function (req, res) {
var start = new Date();
var myCounter = req.query['myCounter'] || 0;
var isSent = false;
http.request(options1, function(response) {
response.setEncoding('utf8');
response.on('data', function (chunk) {
var end = new Date();
console.log(myCounter + ' BODY: ' + chunk + " time: " + (end-start) + " Request start time: " + start.getTime());
if (! isSent) {
isSent = true;
res.writeHead(200, {'Content-Type': 'application/xml'});
res.end(chunk);
}
});
}).end();
}).listen(3013);
console.log('Server running at port 3013');
我发现了什么是,如果我连接到其他服务器,(谷歌或其他),响应会越来越慢到几秒钟。如果我连接到同一网络中的另一个node.js服务器,则不会发生这种情况。
我使用JMeter进行测试。 1000个循环每秒50个并发。
我不知道是什么问题...
=========================
进一步调查:
我在Rackspace和EC2上运行相同的脚本进行测试。脚本将使用http.request连接到:Google,Facebook,以及我的另一个脚本,它可以简单地输出由另一个EC2实例托管的数据(如hello world)。
测试工具我只是我桌面上的jMeter。
Pre-node.js测试: jMeter - > Google结果:快速且一致。 jMeter - > Facebook的结果:快速和一致。 jMeter - >我的简单输出脚本结果:快速和一致。
然后,我制作了50个并行线程/秒,带有100个循环,测试了我的Rackspace nodejs,然后EC2 node.js,它具有相同的性能问题 jMeter - > node.js - > Google结果:在200个需求中从50毫秒变为2000毫秒。
jMeter - > node.js - > Facebook结果:从200 ms到200 ms后需要3000 ms。
jMeter - > node.js - >我的简单输出脚本结果:在200个请求之后,从100 ms到1000 ms。
前10-20个请求很快,然后开始放慢速度。
然后,当我更改为10个并发线程时,事情开始发生变化。响应非常一致,没有减慢。
与Node.js(http.request)可以处理的并发线程数量有关。
------------ 更 --------------
今天我做了更多的测试,在这里,它是: 我用http.Agent并增加最大套接字。然而,有趣的是,在一台测试服务器(EC2)上,它提高了很多,并且没有更慢的速度。 HOwever,其他服务器(机架空间)只有一点改进。它仍然显示出放缓。我甚至在请求标题中设置了“Connection:close”,它只提高了100ms。
如果http.request使用连接池,如何增加它?
在这两个服务器,如果我做 “的ulimit -a”,打开文件的#1024
------------- ** 更多更多 * * -------------------
看来,即使我把maxSockets设置为更高的数字,它只能在一定的限制。似乎有一个内部或OS依赖的套接字限制。但是要碰撞它?
------------- **经过广泛的测试** ---------------
阅读大量帖子后,我发现:
转引自:https://github.com/joyent/node/issues/877
1)如果我设置的标头与连接= '保活',表现还是不错的,可以上去到maxSocket = 1024(这是我的Linux设置)。
var options1 = {
host: 'www.google.com',
port: 80,
path: '/',
method: 'GET',
**headers: {
'Connection':'keep-alive'
}**
};
如果我将它设置为“连接”:“关闭”,响应时间会慢100倍。
有趣的事情发生在这里:
在EC2 1),当我第一次测试与连接:保持活跃,这将需要大约20-30毫秒。然后,如果我更改为连接:关闭或设置代理:false,响应时间将减慢到300毫秒。 WIHTOUT重新启动服务器,如果我更改为Connection:再次保持活动状态,则响应时间将进一步减慢到4000毫秒。要么我必须重新启动服务器或等待一段时间才能恢复20-30ms的照明速度响应。 2)如果我使用agent运行它:false,首先,响应时间将减慢到300ms。但是,它会再次变得更快,并回到“正常”。
我的猜测是连接池仍然有效,即使你设置了agent:false。但是,如果您保持连接:保持连接,那么它肯定会很快。只是不要切换它。
7月25日更新,2011
我试图与http.js & https.js最新的node.js V0.4.9从https://github.com/mikeal/node/tree/http2
的修复性能更好更稳定。
而不是做'isSent'魔法,你应该监听response.on('end')'事件。 – 2011-06-02 00:30:44
感谢您的建议。 :) – murvinlai 2011-06-04 01:13:09
我遇到同样的问题,并看到保持活着的变化相当大的性能增益,但是在负载测试后的一段时间我遇到了错误。 下面是错误: {[错误:连接EADDRNOTAVAIL] 代码: 'EADDRNOTAVAIL', 错误号: 'EADDRNOTAVAIL', 系统调用: '连接'} – firemonkey 2013-04-30 15:16:03