本內容是對知名性能評測博主 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 接口,并且只測量頁面加載時間(從 startTime
到 loadEventEnd
)。通過使用相同的 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 的主線和穩定分支。