【问题标题】:Node.JS Response TimeNode.JS 响应时间
【发布时间】:2013-03-22 14:47:29
【问题描述】:

在 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 bench,并发数为 1000 - 它在 4.3 秒内完成了 10,000 个请求......这意味着平均 4.3 毫秒。

更新:只是开玩笑,我在同一台机器上安装了 Apache + PHP,并做了一个简单的“Hello World”回显,平均响应时间为 92 毫秒(两次以上 ping)。

是否有我遗漏的设置?

【问题讨论】:

  • 您是如何衡量总请求时间的?您是如何对 10000 个请求时间进行基准测试的?
  • @AndreySidorov 刚刚在本地使用 Chrome 开发者工具作为请求时间,我为服务器做了一个 apache bench。
  • 嘿乔纳森,所以结论是?...节点的响应时间很慢?进一步调查会很有趣
  • @GeorgeKatsanos 实际上恰恰相反。有关更多详细信息,请参阅我的答案,但通过消除过程,似乎调用 res.write() 会杀死性能。因此,使用 express.js 等不使用该功能的软件包会有很大帮助。正确完成后,我在使用 node.js 进行 ping 操作时得到 1-2 毫秒的响应

标签: performance node.js amazon-web-services


【解决方案1】:

虽然 Chrome 开发者工具是调查前端性能的好方法,但它可以让您对实际服务器计时/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 毫秒(4200 毫秒/10000 请求)(您是在服务器上运行的吗?什么并发?)

【讨论】:

  • +1 获得明智的答案。都非常有趣。在我的本地测试中,DNS 被缓存了,所以在没有 ping 的情况下,请求需要 260 毫秒 - 根据您提供的 sn-p,平均请求大约是 0.6 毫秒。在 ab 上,我是在服务器上以 1000 的并发速度完成的。这些数字是有道理的,但是当谈到 260 毫秒时,我仍然不知所措
  • 更多有趣的数字,在同一个机器上测试 Apache/PHP,我得到了 92 毫秒的响应时间(两个以上的 ping)。虽然我仍然在 NodeJS 脚本上得到大约 350 毫秒。我觉得我错过了什么......
  • 从客户端测量时,我使用 Apache/PHP 和 node.js 的结果非常相似。您可以使用github.com/mnot/htracr 进行更详细的测量,还是只使用 tcpdump 并发布您的结果?
  • 我实际上想通了 - 请参阅我的答案。不过,我会继续奖励你的帮助!谢谢先生。
【解决方案2】:

我非常讨厌回答自己的问题,但我想将我的发现与未来的读者分享。

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

我刚刚完成了一系列测试。我设置了多种类型的节点服务器,并混合了 PHP 和 Nginx 之类的东西。这是我的发现。

如前所述,使用上面包含的 sn-p,我在每个请求中损失了大约 250 毫秒,但 Apache 基准测试并没有复制该问题。然后我开始进行 PHP 测试,结果在 2 毫秒到 20 毫秒之间通过 ping... 有很大的不同。

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

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

我对此进行了一些搜索,想看看这是否是一个众所周知的问题,并遇到了这个 SO question,他遇到了完全相同的问题。 nodejs response speed and nginx

总的来说,有趣的东西。确保优化您的回复并一次性发送。

祝大家好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2020-08-02
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多