使用Node.js测量HTTP请求时间

5

我使用node.js发送http请求。我有一个要求是测量所花费的时间。

start = getTime()
http.send(function(data) {end=getTime()})

如果我在http响应回调中调用getTime方法,由于队列中的其他事件,存在我的回调函数没有立即被调用的风险。如果我使用常规的Java或C#同步代码来完成此任务,也存在这样的风险,因为可能有其他线程比我更先得到执行。

start = getTime()
http.send()
end=getTime()

Node.js与其他(同步)平台相比如何?它会让我的成功机会更高还是更低?


你不能在没有低级别(C++)钩子直接进入事件循环的情况下完成这个。 - Raynos
你的意思是我需要自己实现HTTP模块,还是有一些可扩展性机制可以使用? - Yaron Naveh
4
我理解您想要知道原始TCP数据包何时回来。除等待调用HTTP处理程序外,没有其他方法可以做到这一点。在这两者之间只有很少的延迟(与网络通信时间相比微不足道)。 - Raynos
你需要为每个请求都进行测量,还是建立一个平均请求长度的档案?由于Raynos是正确的,确切地知道所需的工作量很大,因此您可以更轻松地通过代理运行测试或某些流量来测量发送/响应时间。例如,我在本地测试时使用Charles来测量RTT:http://www.charlesproxy.com/ - sbyrnes
1个回答

1

观察得很好!

理论:

如果您正在执行微基准测试,存在许多考虑因素可能会导致测量结果出现偏差:

  1. 事件循环中的其他事件与所问的http发送同时准备就绪,并在发送有机会之前按顺序执行 - 节点特定。

  2. 线程/进程切换可能在发送操作的时间跨度内的任何时间发生 - 通用。

  3. 内核的I/O缓冲区容量有限,会导致任意延迟 - 操作系统/工作负载/系统负载特定。

  4. 收集系统时间所产生的延迟 - 语言/运行时特定。

  5. 数据块化/缓冲:套接字[http实现]特定。

实践:

Noe遇到了(1)的问题,而Java/C#的专用线程却没有这个问题。但由于node实现了事件驱动的非阻塞I/O模型,其他事件不会产生阻塞效应,而是被放入事件队列中。只有准备好的事件才会被触发,并且由它们引起的延迟将取决于它们必须执行多少I/O工作以及在它们关联的回调函数中执行的任何CPU绑定操作。实际上,由于项目(2)到(5)的更明显影响,这些因素在比较中会变得微不足道并得到平衡。此外,写操作通常是非阻塞的,这意味着它们将在等待下一次循环迭代运行时被执行。最后,当写操作完成时,回调将按顺序内联发出,不会在两个事件之间进行切换。
简而言之,如果将一个专用的Java线程进行阻塞I/O与Node代码进行比较,你会看到Java测量结果良好,但在大规模应用中,线程上下文切换的努力将抵消这种收益,而Node性能将脱颖而出。
希望这可以帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接