首頁 web前端 js教程 Node.js測量HTTP所花費的時間

Node.js測量HTTP所花費的時間

Feb 03, 2018 pm 01:46 PM
http javascript node.js

了解並測量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協定:

// 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模組簡介

以上是Node.js測量HTTP所花費的時間的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

瞭解網頁重定向的常見應用場景並了解HTTP301狀態碼 瞭解網頁重定向的常見應用場景並了解HTTP301狀態碼 Feb 18, 2024 pm 08:41 PM

掌握HTTP301狀態碼的意思:網頁重定向的常見應用場景隨著網路的快速發展,人們對網頁互動的要求也越來越高。在網頁設計領域,網頁重定向是一種常見且重要的技術,透過HTTP301狀態碼來實現。本文將探討HTTP301狀態碼的意義以及在網頁重新導向中的常見應用場景。 HTTP301狀態碼是指永久重新導向(PermanentRedirect)。當伺服器接收到客戶端發

HTTP 200 OK:了解成功回應的意義與用途 HTTP 200 OK:了解成功回應的意義與用途 Dec 26, 2023 am 10:25 AM

HTTP狀態碼200:探索成功回應的意義與用途HTTP狀態碼是用來表示伺服器回應狀態的數字代碼。其中,狀態碼200表示請求已成功被伺服器處理。本文將探討HTTP狀態碼200的具體意義與用途。首先,讓我們來了解HTTP狀態碼的分類。狀態碼分為五個類別,分別是1xx、2xx、3xx、4xx和5xx。其中,2xx表示成功的回應。而200是2xx中最常見的狀態碼

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

如何使用C++實作HTTP流傳輸? 如何使用C++實作HTTP流傳輸? May 31, 2024 am 11:06 AM

如何在C++中實現HTTP流傳輸?使用Boost.Asio和asiohttps客戶端程式庫建立SSL流套接字。連接到伺服器並發送HTTP請求。接收HTTP響應頭並列印它們。接收HTTP回應正文並列印它。

對於HTTP請求逾時會回傳哪種狀態碼? 對於HTTP請求逾時會回傳哪種狀態碼? Feb 18, 2024 pm 01:58 PM

HTTP請求逾時,伺服器端常常會回傳504GatewayTimeout狀態碼。此狀態碼表示伺服器在執行某個請求時,經過一段時間後仍未能取得到請求所需的資源或完成請求的處理。它是5xx系列的狀態碼,表示伺服器端遇到了臨時的問題或過載,導致無法正確處理客戶端的請求。在HTTP協定中,各種狀態碼都有特定的意義和用途,而504狀態碼則用來表示請求逾時問題。在客戶

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

HTTP 503錯誤怎麼解決 HTTP 503錯誤怎麼解決 Mar 12, 2024 pm 03:25 PM

解決方法:1、重試:可等待一段時間後重新嘗試,或重新嘗試頁面;2、檢查伺服器負載:檢查伺服器的CPU、記憶體和磁碟使用情況,如果超過了容量限制,可嘗試最佳化伺服器設定或增加伺服器資源;3、檢查伺服器維護與升級:在伺服器恢復正常之前,只能等待;4、檢查網路連線:確保網路連線穩定,檢查網路設備、防火牆或代理設定是否正確;5、確保快取或CDN配置正確;6、聯絡伺服器管理員等等。

如何使用 Golang 實作 HTTP 檔案上傳安全性? 如何使用 Golang 實作 HTTP 檔案上傳安全性? Jun 01, 2024 pm 02:45 PM

在Golang中實作HTTP檔案上傳安全性需要遵循以下步驟:驗證檔案類型。限製檔案大小。檢測病毒和惡意軟體。儲存檔案安全。

See all articles