Performance Node.JS响应时间

Performance Node.JS响应时间,performance,node.js,amazon-web-services,Performance,Node.js,Amazon Web Services,在AWS实例上抛出Node.JS并测试请求时间,得到了一些有趣的结果 我对服务器使用了以下选项: var http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('Hello World'); res.end(); }).listen(8080); 我对这台服务器的平均延迟为90毫秒,但总的

在AWS实例上抛出Node.JS并测试请求时间,得到了一些有趣的结果

我对服务器使用了以下选项:

var http = require('http');

http.createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Hello World');
  res.end();
}).listen(8080);
我对这台服务器的平均延迟为90毫秒,但总的请求需要大约350毫秒以上。显然,在这个盒子上浪费了很多时间。我确保DNS在测试之前被缓存

我在服务器上做了一个Apache测试,共电流为1000-它在4.3秒内完成了10000个请求。。。这意味着平均4.3毫秒

更新:仅为了grins,我在同一台机器上安装了Apache+PHP,并进行了一次简单的“Hello World”回显,平均响应时间为92毫秒(两次ping)。


是否有我遗漏的设置?

虽然Chrome Developer Tools是调查前端性能的好方法,但它可以让您非常粗略地估计实际的服务器计时/cpu负载。如果您在开发工具中有大约350毫秒的总请求时间,那么从这个数字中减去DNS查找+连接+发送+接收,然后减去往返时间(90毫秒?),然后您就有了第一个估计值。在您的情况下,我预计实际请求时间为亚毫秒。尝试在服务器上运行此代码:

var http = require('http');
function hrdiff(t1, t2) {
    var s = t2[0] - t1[0];
    var mms = t2[1] - t1[1];
    return s*1e9 + mms;
}
http.createServer(function(req, res) {
  var t1 = process.hrtime();
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Hello World');
  res.end();
  var t2 = process.hrtime();
  console.log(hrdiff(t1, t2));
}).listen(8080);

根据
ab
结果,您应该估计平均发送+请求+接收时间最多为4.2 ms(4200 ms/10000 req)(您在服务器上运行了吗?什么并发?

我绝对不喜欢回答自己的问题,但我想把我的发现告诉未来的读者

tl;dr:res.write()有问题。使用express.js或res.end()

我刚刚通过了一系列测试。我设置了多种类型的节点服务器,并混合了PHP和Nginx。以下是我的发现

如前所述,在上面包含的代码片段中,我丢失了大约250ms/request,但Apache基准并没有复制这个问题。然后我继续做了一个PHP测试,得到了从2ms到20ms的结果。。。差别很大

这引发了更多的研究,我启动了一个Nginx服务器并通过它代理了节点,不知何故,通过ping将响应从250ms神奇地更改为15ms。我和PHP脚本相当,但这真是一个令人困惑的结果。通常,额外的跳数会减慢速度

我很感兴趣,还制作了一个express.js服务器——更有趣的是,ping本身就超过了2ms。我在源代码中搜索了很长一段时间,发现它缺少
res.write()
命令,而是直接指向
res.end()
。我启动了另一台服务器,从
res.write
中删除“Hello World”,并将其添加到
res.end
中,令人惊讶的是,ping比ping快了0毫秒

我做了一些搜索,想看看这是否是一个众所周知的问题,并遇到了这个问题,谁有完全相同的问题

总的来说,有趣的东西。确保您优化了您的回复,并立即发送所有回复


祝大家好运

您是如何衡量总请求时间的?你是如何对10000个请求的时间进行基准测试的?@AndreySidorov刚刚在本地使用了Chrome开发工具作为请求时间,我为服务器做了一个apache工作台。嘿,Jonathan,所以结论是?。。。节点的响应时间慢?调查会很有趣further@GeorgeKatsanos事实上,恰恰相反。有关更多详细信息,请参见我的答案,但通过消除过程,调用
res.write()
似乎会降低性能。因此,使用像express.js这样不使用该功能的包将有很大帮助。正确完成后,我得到了一个1-2ms的响应,通过使用node.js+1进行ping可以得到一个智能答案。都很有趣。在我的本地测试中,DNS是缓存的,因此如果没有ping,请求需要260ms——根据您提供的代码片段,这方面的平均请求约为0.6毫秒。在ab上,我在服务器上以1000的并发度完成了这项工作。这些数字是有道理的,但当涉及到260msFurt有趣的数字时,我仍然不知所措,在同一个框上测试Apache/PHP,我得到的响应时间是92毫秒(两个ping)。而我在NodeJS脚本上仍然得到大约350毫秒。我觉得我遗漏了一些东西……当从客户端进行测量时,Apache/PHP和node.js的结果非常相似。你能用tcpdump或者仅仅用tcpdump做更详细的测量并发布结果吗?我真的弄明白了-见我的答案。不过,我会继续奖励你的帮助!谢谢你,先生。