性能比拼: HTTP/2 vs. HTTP/3

本內容是對知名性能評測博主 Anton Putra HTTP/2 vs. HTTP/3 performance benchmark 內容的翻譯與整理, 有適當刪減, 相關指標和結論以原作為準

在本內容中,我們將比較 HTTP/2 和 HTTP/3 協議。

我們將使用 Terraform 和 Ansible 在 Google Cloud Platform (GCP) 中創建基礎設施,然后從源代碼配置和編譯 Nginx。

對于第一個測試,我們將使用一個包含大量圖片的普通 HTML 頁面。

對于第二個更貼近現實的測試,我使用了我自己的網站,該網站包含大量圖片且 JavaScript 較重。

為了自動化測試,我們將使用 Playwright Node.js 框架和 Chromium 無頭瀏覽器。當然,我們還會從測試中將指標推送到 Prometheus Pushgateway。

現在,您可以使用例如 Lighthouse 來測量很多東西,但為了簡化這個測試并使其簡短,我們將使用 PerformanceNavigationTiming API 接口,并且只測量頁面加載時間(從 startTimeloadEventEnd)。通過使用相同的 API,您可以獲取瀏覽器加載過程中不同事件的更詳細指標。

當然,為了并排可視化指標,我們將使用 Grafana 并從 Prometheus 拉取指標。

這兩種協議之間的主要區別在于 HTTP/3 使用 QUIC 傳輸協議,該協議基于 UDP。因此,當您創建防火墻時,不要忘記打開 443 UDP 端口,而不僅僅是 TCP 端口。

對于 GCP 中或多或少較大的項目,您通常會在一個專用的宿主項目(host project)中創建共享 VPC(Shared VPC),并將其與其他服務項目(service projects)共享。要配置防火墻,您可以使用 CIDR 范圍、網絡標簽,或者推薦的選項是創建一個專用的服務賬戶,并將其用作源或目標。

現在,檢查協議最簡單的方法是點擊“檢查”(inspect)并打開網絡(Network)選項卡。對于 HTTP/3,您應該看到 h3,對于 HTTP/2 則是 h2。

不幸的是,Nginx 的 HTTP/3 實現尚未進入主線(mainline)分支。如果您想嘗試一下,需要克隆這個分支或下載相應的 tar 壓縮包。如您所見,它正處于積極開發中。

下一步,您需要下載一些用于編譯 Nginx 的依賴項,包括其中一個 OpenSSL 實現。在這個案例中,我使用的是 LibreSSL。然后我們配置 Nginx 并運行 make 進行編譯。接著復制一些文件并啟動 Nginx。

您可以在 我的 GitHub 倉庫中 找到源代碼。您也可以使用 Ansible 動態清單(dynamic inventory)在 GCP 中運行 Playbook。在 Playbook 中,您可以將虛擬機的標簽(labels)用作 Ansible 的主機組(host groups)。

對于 HTTP/2,我們需要顯式啟用它,并且僅為了測試目的,在瀏覽器端禁用緩存。在 HTTP/2 和 HTTP/3 中,我們都使用 TLSv1.3,因為 HTTP/3 依賴于它。

對于 HTTP/3,我們使用 http3 指令以及 reuseport。它使得內核可以為每個套接字擁有更多的套接字監聽器。升級到 HTTP/3 的主要機制是使用以下頭部(headers)。這也取決于具體實現。例如,h3-27 是 HTTP/3 協議的一個草案版本。

正如我提到的,為了運行測試,我們將使用 Playwright 框架和 Prometheus 客戶端將指標推送到 Pushgateway。這個測試腳本寫得不是很漂亮,但能完成工作。啟動一個新的無頭 Chrome 瀏覽器實例,然后加載頁面,將指標發送到 Pushgateway 并退出。然后根據需要重復此過程多次。

在這個項目中,我使用的是 GCP 的 us-central-1 區域,而我本人實際位于加利福尼亞州,這只是為了給您提供一個關于延遲的參考。

要記錄指標,您還需要有 Prometheus、Pushgateway 和 Grafana。要運行它們,請使用 docker-compose up 命令。

在我們運行測試之前,讓我向您展示第一個頁面的樣子。這是一個包含大量圖片的簡單頁面。

好了,讓我們開始運行測試。您可以立即注意到,加載這個簡單頁面時,HTTP/3 版本比 HTTP/2 花費的時間稍微多一點。

不僅僅是我注意到了 Nginx HTTP/3 實現的性能下降。您可以找到其他的基準測試。現在,正如我所說,Nginx 支持 HTTP/3 還處于非常早期的階段。我相信他們會改進性能并將其移至主線分支。屆時我會再次進行測試。

為了確認我們確實使用了 HTTP/3 協議,您可以檢查 Nginx 的訪問日志。您應該能找到 HTTP/3 版本信息。

對于第二個測試,我使用了我自己的個人網站,其中包含大量的 JavaScript 和圖片。讓我們開始運行它。不幸的是,頁面加載時間的差異甚至更大了。

請記住,由于它正處于積極開發中,每個新的提交(commit)都可能影響性能。如果您想在生產環境中使用它,您應該親自進行測試,或者等到它成熟并遷移到 Nginx 的主線和穩定分支。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904592.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904592.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904592.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Vue】組件自定義事件 TodoList 自定義事件數據傳輸

目錄 一、綁定 二、解綁 組件自定義事件總結 TodoList案例對數據傳輸事件的修改 總結不易~ 本章節對我有很大收獲, 希望對你也是!!! 本章節素材已上傳Gitee:yihaohhh/我愛Vue - Gitee.com 前面我們學習的clikc、…

Windows遠程連接MySQL報錯,本地navicat能連接MySQL

一、報錯 telnet 119.87.111.79 3306??“無法打開到主機的連接。在端口 3306: 連接失敗”?? 表明無法通過 TCP 協議連接到目標服務器的 3306 端口。 二、目的 (1)??Telnet 測試的目的?? Telnet 僅用于測試 ??TCP 端口是否開放??&#xff…

電池管理系統BMS三級架構——BMU、BCU和BAU詳解

儲能電站的電池管理系統(BMS)通常采用三級架構:從控(BMU)、主控(BCU)、總控(BAU)。這種分層設計實現了電池模組、簇、堆的分級管理和控制,確保系統運行的安全…

C++ 基礎復習

基礎復習 1.const引用為什么能引用臨時對象2.內聯函數的額外作用3. nullptr 1.const引用為什么能引用臨時對象 臨時對象(Temporary Object)是在表達式求值過程中隱式創建的對象,例如: 函數返回非引用類型的值 類型轉換&#xff0…

AI的出現,是否能替代IT從業者?

闡述觀點:AI 的出現不會完全替代 IT 從業者,但會深刻改變 IT 行業的工作方式和崗位結構。 AI 不會完全替代 IT 從業者的原因 AI 本身需要人來開發與維護 AI 模型、系統架構、數據管道等都需要 IT 專業人員來構建和優化。 例如:AI 工程師、M…

【服務器通信-socket】——int socket(int domain, int type, int protocol);

#include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); domain: AF_INET 這是大多數用來產生socket的協議&#xff0c;使用TCP或UDP來傳輸&#xff0c;用IPv4的地址 AF_INET6 與上面類似&#xff0c;不過是來用IPv6的地…

Python基本環境搭配

Python3 環境搭建 | 菜鳥教程 里面有直接跳轉 Fitten Code 按下 Tab 鍵接受所有補全建議&#xff1a; 按下 Ctrl→ 鍵(mac系統為Command→)接收單個詞補全建議&#xff1a; 用戶可通過點擊左上角工具欄中的Fitten Code – 開始對話或者使用快捷鍵CtrlAltC(mac系統為Contr…

C++負載均衡遠程調用學習之HOOK注冊機制

目錄 1.larV0.7-hook流程的說明 2.larV0.7-TCP_server集成鏈接HOOK函數 3.larV0.7-TCP_client集成鏈接HOOK注冊功能 1.larV0.7-hook流程的說明 ### 7.1 數據庫表相關查詢方法實現 ? 我們先實現一些基本的數據表達查詢方法&#xff1a; > lars_dns/src/dns_rout…

Rust 與 Golang 深度對決:從語法到應用場景的全方位解析

一、引言 在軟件開發的快速發展浪潮中&#xff0c;Rust 和 Golang&#xff08;Go 語言&#xff09;脫穎而出&#xff0c;成為開發者熱議的編程語言。Rust 憑借強大的內存安全性與卓越的性能備受贊譽&#xff0c;Golang 則以簡潔的語法和出色的并發處理能力贏得開發者青睞。本文…

C++負載均衡遠程調用學習之訂閱功能與發布功能

目錄 1.lars-DnsV0.1回顧 2.Lars-DnsV0.2-訂閱功能的訂閱模塊分析 3.Lars-DnsV0.2-訂閱模塊的類的單例創建及方法屬性初始化 4.Lars-DnsV0.2-發布功能的實現 5.Lars-DnsV0.2-發布功能的總結 6.Lars-DnsV0.2-訂閱流程復習 7.Lars-DnsV0.2-訂閱模塊的集成 8.Lars-DnsV0.2訂…

SurfSense開源程序是NotebookLM / Perplexity / Glean的開源替代品,連接到外部來源,如搜索引擎

?一、軟件介紹 文末提供程序和源碼下載 雖然 NotebookLM 和 Perplexity 等工具令人印象深刻&#xff0c;并且對于對任何主題/查詢進行研究都非常有效&#xff0c;但 SurfSense 通過與你的個人知識庫集成來提升這種能力。它是一個高度可定制的 AI 研究代理&#xff0c;連接到外…

基于OpenTelemetry的分布式鏈路追蹤Trace?實現(PHP篇)

目錄 引言一、OpenTelemetry是一套可觀測性標準協議二、分布式追蹤&#xff08;?Trace?&#xff09;是OpenTelemetry的核心功能之一三、OpenTelemetry的架構原理四、OpenTelemetry的分布式追蹤&#xff08;?Trace?&#xff09;實踐1、準備PHP環境2、下載SDK3、編寫實例代碼…

探索智能體的記憶:類型、策略和應用

AI Agent 中的記憶&#xff1a;類型、策略和應用 記憶實現是使智能體能夠保持上下文、從過去的交互中學習并做出明智決策的關鍵組成部分。與人類記憶非常相似&#xff0c;智能體記憶允許 AI 系統隨時間存儲、檢索和利用信息&#xff0c;從而為用戶創造更連貫和個性化的體驗。 …

leetcode 2395. Find Subarrays With Equal Sum

題目描述 代碼&#xff1a; class Solution { public:bool findSubarrays(vector<int>& nums) {int len nums.size();if(len <2)return false;unordered_set<int> table;int sum 0;for(int i 1;i < len;i){sum nums[i-1]nums[i];if(table.contains(…

Kubernetes(k8s)學習筆記(七)--KubeSphere 最小化安裝

前情提要 可視化操作面板對于開發、運維絕對是提升工作效率的一大利器&#xff0c;因此很有必要搭建一套可視化操作來管理Kubernetes。 可視化面板有多種&#xff1a; 1.Kubernetes官方提供的默認面板&#xff1a;dashboard&#xff0c;用處不大&#xff0c;放棄&#xff1b…

MCP連接Agent:AI時代的TCP/IP

介紹 2023年&#xff0c;生成式AI爆發。2024年&#xff0c;智能體&#xff08;Agent&#xff09;接棒成為AI新焦點。2025年&#xff0c;智能體似乎已經要開始爆發了。目前的智能體更像一個“單機App”&#xff1a;彼此不了解、無法通信&#xff0c;更不能協作。類似互聯網早期…

交換機工作原理(MAC地址表、VLAN)

目錄 一、交換機的基本工作原理 數據幀的轉發 MAC地址表的作用 交換機的轉發方式 二、VLAN&#xff08;虛擬局域網&#xff09; VLAN的定義 VLAN的作用 VLAN的實現方式 VLAN的幀標記 VLAN的通信 三、交換機與VLAN的結合 四、交換機與VLAN的實際應用場景 交換機是局…

eFish-SBC-RK3576工控板外部RTC測試操作指南

備注&#xff1a; 1&#xff09;測試時一定要接電池&#xff0c;否則外部RTC斷電后無法工作導致測試失敗&#xff1b; 2&#xff09;如果連接了網絡&#xff0c;系統會自動同步NTP時鐘&#xff0c;所以需要關閉自動同步時鐘。 關閉自動同步NTP時鐘方法&#xff1a; 先查看是…

淘寶按圖搜索商品(拍立淘)Java 爬蟲實戰指南

在電商領域&#xff0c;按圖搜索商品功能為用戶提供了更直觀、便捷的購物體驗。淘寶的拍立淘功能更是憑借其強大的圖像識別技術&#xff0c;成為許多開發者和商家關注的焦點。本文將詳細介紹如何利用 Java 爬蟲技術實現淘寶按圖搜索商品功能&#xff0c;包括注冊賬號、上傳圖片…

【Redis】List類型

文章目錄 List的特點介紹lpush&#xff0c;lpushx&#xff0c;rpush&#xff0c;rpushx命令lrange命令lpop和rpoplindex命令linsert命令llen命令lrem 命令ltrim命令lset命令阻塞版本的命令blpop和brpop 命令小結list的內部編碼List的應用場景 List的特點介紹 列表相當于一個數…