前言
了解和测量HTTP时间有助于我们发现客户端到服务器或服务器到服务器之间的通信性能瓶颈。 本文介绍了HTTP请求中的时间开销,并展示了如何在Node.js中进行测量。
在我们开始了解HTTP时间开销之前,让我们来看一些基本的概念:
现在我们来看一下通常HTTP请求的时间表:
如何通过HTTP时间开销帮助发现性能瓶颈?
例如,如果您的DNS查询所花费的时间比预期的要长,那么问题可能是您的DNS提供商或DNS缓存设置。
缓慢的内容传输可能是由效率低下的反应机构引起的,例如发回太多的数据(未使用的JSON属性等)或缓慢的连接。
测量Node.js中的HTTP时间开销
为了测量Node.js中的HTTP时间开销,我们需要订阅特定的请求,响应和套接字事件。 这是一个简短的代码片段,展示了如何在Node.js中执行此操作,此示例仅关注时序:
const timings = { // use process.hrtime() as it's not a subject of clock drift startAt: process.hrtime(), dnsLookupAt: undefined, tcpConnectionAt: undefined, tlsHandshakeAt: undefined, firstByteAt: undefined, endAt: undefined } const req = http.request({ ... }, (res) => { res.once('readable', () => { timings.firstByteAt = process.hrtime() }) res.on('data', (chunk) => { responseBody += chunk }) res.on('end', () => { timings.endAt = process.hrtime() }) }) req.on('socket', (socket) => { socket.on('lookup', () => { timings.dnsLookupAt = process.hrtime() }) socket.on('connect', () => { timings.tcpConnectionAt = process.hrtime() }) socket.on('secureConnect', () => { timings.tlsHandshakeAt = process.hrtime() }) })
DNS查找只会发生在有域名的时候:
/ There is no DNS lookup with IP address const dnsLookup = dnsLookupAt !== undefined ? getDuration(startAt, dnsLookupAt) : undefined
TCP连接在主机解析后立即发生:
const tcpConnection = getDuration((dnsLookupAt || startAt), tcpConnectionAt)
TLS握手(SSL)只能使用https协议:
// There is no TLS handshake without https const tlsHandshake = tlsHandshakeAt !== undefined ? getDuration(tcpConnectionAt, tlsHandshakeAt) : undefined
我们等待服务器开始发送第一个字节:
const firstByte = getDuration((tlsHandshakeAt || tcpConnectionAt), firstByteAt)
总持续时间从开始和结束日期计算:
const total = getDuration(startAt, endAt)
看到整个例子,看看我们的https://github.com/RisingStac...仓库。
测量时间的工具
现在我们知道如何使用Node测量HTTP时间,我们来讨论可用于了解HTTP请求的现有工具。
request module
著名的request module具有测量HTTP定时的内置方法。 您可以使用time属性启用它。
const request = require('request') request({ uri: 'https://risingstack.com', method: 'GET', time: true }, (err, resp) => { console.log(err || resp.timings) })
分布式跟踪
可以使用分布式跟踪工具收集HTTP定时,并在时间轴上可视化它们。 这样,您可以全面了解后台发生的情况,以及构建分布式系统的实际成本是多少。
RisingStack的opentracing-auto库具有内置的标志,可通过OpenTracing收集所有HTTP时间。
在Jaeger中使用opentracing-auto的HTTP请求时序。
总结
使用Node.js测量HTTP时间可以帮助您发现性能瓶颈。 Node生态系统提供了很好的工具来从应用程序中提取这些指标。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。
翻译自Understanding & Measuring HTTP Timings with Node.js
问题内容: 我需要获取执行时间(以毫秒为单位)。 当时接受的答案是使用newDate()。getTime()。但是,我们现在都可以同意使用标准performance.now()API更合适。因此,我正在更改对此答案的公认答案。 问题答案: 使用 performance.now(): :需要导入类 使用 console.time: (非标准) (living standard) 注意 : 传递给和方
问题内容: 假设我正在测试Java服务器应用程序。我知道需要多少时间才能完成测试。现在,我想知道该测试期间在GC上花费了多少。我该怎么做? 问题答案: 最简单的方法是在启动JVM时使用和选项。我认为它可以打印出垃圾收集需要多长时间。 http://www.oracle.com/technetwork/java/javase/tech/vmoptions- jsp-140102.html
如何衡量报表显示嵌入在网页iframe中的数据所需的时间? 我以前使用过time.sleep()函数。但我得记录报告加载时间。
问题内容: 给定下面的python代码,请帮助我了解那里发生的事情。 所以我得到了和之间的区别,在第5行中,我通过强制转换将持续时间取整,现在又有什么进一步的解释? 我知道delta是什么意思(平均值或差值),但是为什么我必须传递给delta以及为什么字符串转换效果如此之好以至于我得到了? 问题答案: 因为timedelta的定义如下: 所有参数都是可选的,默认为0。 您可以轻松地通过可选参数说出
计算一个函数执行的时间。 使用 console.time() 和 console.timeEnd() 来测量开始和结束时间之间的差,以确定回调执行的时间。 const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); ret
问题内容: 我将Node.js与MongoDB结合使用,也将Monk用于数据库访问。我有以下代码: 关于此代码,我有两个问题: 我看到执行时间,并且“文件已保存!” 首先输入字符串,然后在控制台中看到朋友的名字。这是为什么?我不应该先看名字然后再看执行时间吗?是否因为Node.js的异步特性? 名称在控制台中的打印速度非常慢,速度就像两秒钟内出现一个名称一样。为什么这么慢?有没有办法使过程更快?
我遵循这个链接制作一个CRF模型。我使用以下命令制作模型。 模型制作成功,但我的训练数据非常多,花费了太多时间。当我仔细观察系统中发生的事情时。它只使用了我电脑的一个核心 我能否以使用计算机多个核心的方式运行此命令?看起来它是作为单个线程实现的。是否支持多线程?如果是,请分享。
问题内容: 我想衡量用户在网页上花费的时间(以秒为单位,以整数为单位,以浮点数表示,以分钟为单位)。我知道有一个卸载事件,当他们离开页面时,我可以触发该事件。但是如何获得他们已经在那里度过的时间呢? 问题答案: 如果您使用Google Analytics(分析),他们会提供此统计信息,尽管我不确定他们是如何获得的。 如果要自己滚动,则需要将一些AJAX请求发送到服务器进行日志记录。 jQuery有