跳到內容

效能基準測試

吞吐量數字只有擺在產生它的條件旁邊才有意義。本頁提供最新一次的比較,並在旁邊列出每一項限制其解讀範圍的條件。

  • 版本。 量測用的 Pingclair 是候選版本 v0.2.0-rc.3 的發行二進位檔,另有 nginx 1.31.6 與 Caddy 2.11.4。之後的修補版本不會重新量測。
  • 主機。 一台執行 OrbStack 的 Apple M2 筆電。
  • 限制。 每個伺服器都跑在限制兩顆 CPU 的容器裡,worker 數相同,payload 同為 1 KiB。
  • 拓撲。 反向代理的後端跑在同一個 Docker network 上的獨立容器。
  • 負載產生器。 HTTP/1.1、HTTPS/1.1 與 HTTP/2 使用原生 h2load;HTTP/3 使用同一個 Docker network 內、支援 ngtcp2 的 h2load。

每個數值都是每秒請求數:三輪交錯執行、每輪 50,000 個請求的中位數。只有全部請求都成功,該列才算數。

場景 Pingclair nginx 1.31.6 Caddy 2.11.4
HTTP/1.1 靜態 46,125 39,478 18,266
HTTPS/1.1 靜態 40,721 31,508 19,978
HTTP/2 靜態 92,369 41,972 17,424
HTTP/3 靜態 56,180 55,638 22,912
HTTP/1.1 反向代理 20,856 22,584 17,117
HTTPS/1.1 反向代理 20,297 21,944 16,660
HTTP/2 反向代理 23,181 20,396 未完成
HTTP/3 反向代理 28,078 22,213 未完成

與 nginx 相比,Pingclair 在 HTTP/1.1、HTTPS/1.1 與 HTTP/2 的靜態列領先(分別為 1.2 倍、1.3 倍與 2.2 倍),HTTP/3 靜態則大致打平。反向代理負載下,HTTP/2 領先 14%、HTTP/3 領先 26%,HTTP/1.1 與 HTTPS/1.1 則仍落後 nginx 約 8%。

  • 主機是一台筆電。 絕對吞吐量不代表容量宣稱,這些比值也只描述在這組受控負載下的相對表現。
  • 只在同一列內比較。 HTTP/3 的負載產生器與其他列跑在不同環境,因此不應跨協定比較絕對吞吐量,只能在同一列內比較各伺服器。
  • 未完成的列不構成比較。 在這台主機與這套 harness 上,Caddy 沒能完成反向代理的 HTTP/2 與 HTTP/3 兩列:在受測的並行數下,上游連線的反覆建立耗盡了容器可用的臨時連接埠。這兩格標為未完成,而不是改用另一種負載去量。
  • 結果取決於主機。 各伺服器的相對位置會隨 CPU 架構、核心、worker 數與 TLS 實作而改變。

這些數字來自伺服器儲存庫的 benchmark harness 的一次執行結果。量測方法、一次執行必須滿足哪些規則數字才算數,以及 harness 本身,都公布在該儲存庫:

每次執行的原始紀錄留在維護者的 checkout,不公開。