0

0

Node.js测量HTTP所花费的时间

小云云

小云云

发布时间:2018-02-03 13:46:05

|

1622人浏览过

|

来源于php中文网

原创

了解和测量http时间有助于我们发现客户端到服务器或服务器到服务器之间的通信性能瓶颈。 本文介绍了http请求中的时间开销,并展示了如何在node.js中进行测量。

在我们开始了解HTTP时间开销之前,让我们来看一些基本的概念:

  • IP(互联网协议):IP是网络层协议,涉及网络寻址和路由。 IP负责根据一个或多个IP网络上的数据包头将数据包从源主机传送到目标主机。 它还定义了封装要传递的数据的数据包结构。

  • DNS(域名服务器):DNS是一种分层分散式命名系统,用于将诸如risingstack.com的人类可读主机名解析为机器可读的IP地址。

  • TCP(传输控制协议):TCP标准定义了如何在应用程序之间建立和维护网络对话以交换数据。 TCP在通过IP网络通信的主机上运行的应用程序之间提供可靠,有序和错误检查的八位字节流。 HTTP客户端通过建立TCP连接来发起请求。

  • SSL / TLS(传输层安全性):TLS是一种通过计算机网络提供通信安全性的加密协议。 SSL(安全套接字层)是TLS的不推荐使用的前身。 TLS和SSL都使用证书建立安全连接。 SSL证书不依赖于加密协议(如TLS),证书包含密钥对:公钥和私钥。 这些密钥一起工作,建立一个加密的连接。

现在我们来看一下通常HTTP请求的时间表:


  • DNS查找:执行DNS查找所花费的时间。 DNS查找将域名解析为IP地址。 每个新的域需要一个完整的往返行程来进行DNS查找。 当目的地已经是IP地址时,没有DNS查找。

  • TCP连接:在源主机和目标主机之间建立TCP连接所需的时间。 必须在多步握手过程中正确建立连接。 TCP连接由操作系统管理,如果基础TCP连接无法建立,则OS范围的TCP连接超时将会进入我们应用程序中的超时配置。

  • TLS握手:完成TLS握手的时间。 在握手过程中,端点交换认证和密钥以建立或恢复安全会话。 没有HTTPS请求的不需要TLS握手。

  • 第一个字节的时间(TTFB):等待初始响应的时间。 此时间除了等待服务器处理请求和传递响应所花费的时间之外,还可以捕获往返服务器的延迟。

  • 内容传输:接收响应数据所花费的时间。 响应数据的大小和可用的网络带宽决定其持续时间。

如何通过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协议:

万彩商图
万彩商图

专为电商打造的AI商拍工具,快速生成多样化的高质量商品图和模特图,助力商家节省成本,解决素材生产难、产图速度慢、场地设备拍摄等问题。

下载
// 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生态系统提供了很好的工具来从应用程序中提取这些指标。

相关推荐:

几种PHP发送HTTP请求的方式分享

HTTP不同版本主要特性异同分析

node.js中http模块和url模块简介

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1667

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1102

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1004

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1396

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1227

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1438

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1302

2023.11.13

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 2.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 1.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号