摘要:握手完成握手的時間。此時間除了等待服務器處理請求和傳遞響應所花費的時間之外,還可以捕獲往返服務器的延遲。內容傳輸接收響應數據所花費的時間。響應數據的大小和可用的網絡帶寬決定其持續時間??偨Y使用測量時間可以幫助您發現性能瓶頸。
了解和測量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生態系統提供了很好的工具來從應用程序中提取這些指標。
關注我的公眾號,更多優質文章定時推送
翻譯自Understanding & Measuring HTTP Timings with Node.js
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88595.html
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:與異步編程按照維基百科上的解釋獨立于主控制流之外發生的事件就叫做異步。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。在握手過程中,端點交換認證和密鑰以建立或恢復安全會話。 1、前端 排序算法總結 排序算法可能是你學編程第一個學習的算法,還記得冒泡嗎? 當然,排序和查找兩類算法是面試的熱門選項。如果你是一個會寫快排的程序猿,面試官在比較...
摘要:本文翻譯自原文地址中文標題保持的速度創建高性能的工具技術和提示快速摘要是一個非常多彩的平臺,而創建服務就是其非常重要的能力之一。在目錄下,我們執行譯者注現在的話可以使用新的形式的命令語法會在剖析完畢后,創建文件并自動打開瀏覽器。 pre-tips 本文翻譯自: Keeping Node.js Fast: Tools, Techniques, And Tips For Making Hi...
摘要:而調試器具有對模型控制器以及視圖的實時管理權限。項目地址是一個輕量級純寫的文本工具提示庫。它支持種不同國家的貨幣格式,以及超過種不同語言的本地化設置。項目地址是一個根據規范構建的輕量級框架。它壓縮后僅有,同時它沒有預先設定的元素和內置動畫。 在十一月份的前端技術列表中,我們整合了一些令人感到驚嘆的 GitHub 項目,其中包含了新的 CSS 框架、node.js包管理器,以及用于實現圖...
閱讀 1140·2023-04-26 02:46
閱讀 636·2023-04-25 19:38
閱讀 651·2021-10-14 09:42
閱讀 1249·2021-09-08 09:36
閱讀 1367·2019-08-30 15:44
閱讀 1332·2019-08-29 17:23
閱讀 2252·2019-08-29 15:27
閱讀 815·2019-08-29 14:15