序
了解和测量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时间开销帮助发现性能瓶颈?
例如,如果您的域名系统查询花费的时间比预期的长,问题可能出在您的域名系统提供商或域名系统缓存设置上。
内容传输慢可能是低效的反应机制造成的,比如发回太多数据(未使用的JSON属性等)。)或连接缓慢。
在Node.js中测量HTTP时间开销
为了测量Node.js中的HTTP时间开销,我们需要订阅特定的请求、响应和套接字事件。这是一个简短的代码片段,展示了如何在Node.js中做到这一点。
const time={//使用process.hrtime(),因为它不是时钟漂移的主题startAt: process.hrtime(),dnsLookupAt: undefined,tcpConnectionAt: undefined,tlsHandshakeAt: undefined,firstByteAt: undefined,endat : undefined } const req=http . request({ 0.},(res)={ res.once('可读',()={ times . first byteat=process . HR time()})RES . on(' data ',(chunk)={ response body=chunk })RES . on(' end ',()={ time . endat=process . HR time()})})req . on(' socket ',(socket)={ socket.on('lookup ',()={ times . dnslookupat=process . HR time()})socket . on(' connect ',()={ tcpcpctimes }。tlshandshakeat=进程。hrtime ()})}) DNS查找仅在存在域名时发生:
/没有使用IP address const dnsLookup=dnsLookupAt的DNS查找!==未定义?Getduration (startat,dnslookupat) :未定义的TCP连接在主机解析后立即发生:
Const TCP连接=get duration((dnslookupat | | startat),tcpconnectionat) TLS握手(SSL)只能使用https协议:
//没有https就没有TLS握手const tlsHandshake=tlsHandshakeAt!==未定义?Getduration (tcpconnectionat,tlshanshakeat):未定义我们等待服务器开始发送第一个字节:
const firstbyte=get duration((tlshandshakat | | tcpconnectionat),first byte)总持续时间是从开始日期和结束日期开始计算的:
Const total=getduration (startat,endat)查看整个示例并查看我们的https://github.com/RisingStac.仓库。
测量时间的工具
既然我们已经知道了如何使用Node来测量HTTP时间,那么让我们讨论一下可以用来理解HTTP请求的现有工具。
请求模块
著名的请求模块内置了一种测量HTTP定时的方法。您可以使用time属性来启用它。
Const request=require ('request ')请求({uri :' https://rising stack.com ',方法:' get ',时间: true},(err,resp)={ console . log(err | | resp . timing)})分布式跟踪
您可以使用分布式跟踪工具来收集HTTP计时,并在时间轴上可视化它们。这样,您就可以充分了解后台发生的事情以及构建分布式系统的实际成本。
RisingStack的opentracing-auto库有一个内置的标志,可以通过opentracing收集所有HTTP时间。
在Jaeger中使用自动打开跟踪的HTTP请求定时。
摘要
使用Node.js测量HTTP时间可以帮助您发现性能瓶颈。节点生态系统为从应用程序中提取这些指标提供了一个很好的工具。
好了,这就是本文的全部内容。希望本文的内容能给你的学习或工作带来一些帮助。有问题可以留言交流。谢谢你的支持。
翻译自理解用node.js测量http定时。