2 月 28 日,Cloudflare 開源了其自研的 Nignx 替代品: Pingora 。 這是一個基於 Rust 打造的高速、可靠與可編程的網路系統。 目前,Cloudflare 已使用 Pingora 全面替代 Nginx 。 經過實戰檢驗, Pi ngora 每秒 穩定處理超過 4000 萬的網路請求,持續服務數年。 下面就來看一看 Pingora 有什麽特別之處!
Cloudflare 是一個全球性的網路效能和安全公司,它提供了一系列服務來幫助網站和應用程式改善其線上體驗、增加安全性並加速載入速度。Cloudflare 的主要服務包括:
內容分發網路 (CDN) :透過在全球各地分布的數據中心緩存和分發您的網站內容,幫助加速網站和應用程式的載入速度。
DNS 服務 :提供可靠的 DNS 解析服務,確保使用者能夠快速地存取您的網站或應用程式。
防火墻和安全性 :保護您的網站免受 DDoS 攻擊和其他網路威脅的影響,透過提供強大的防火墻和安全措施。
負載均衡 :智慧地將使用者流量分發到多個伺服器,確保您的網站或應用程式在高流量下仍然保持快速和可靠。
2023 年 1 月,據 Netcraft 對上百萬個站點的調查數據顯示,在 Cloudflare 從第 3 位躍升至第 1 位,即在一個月內超過了 Apache 和 Nginx ,成為了最受歡迎 Web 伺服器。
Pingora 是什麽?
Pingora 作為一款功能強大的代理工具,不僅提供了構建HTTP/1、HTTP/2、TLS或TCP/UDP服務的庫和API,還支持HTTP/1和HTTP/2的端到端代理、gRPC和Websocket代理。盡管HTTP/3的支持尚在規劃中,但Pingora已經展現出其前瞻性和可延伸性。為了滿足不同使用者的需求,Pingora配備了高度可客製的負載均衡和故障轉移策略。在安全方面,Pingora支持廣泛使用的OpenSSL和BoringSSL庫,確保服務符合FIPS標準,並采用了後量子加密技術,為使用者提供堅實的安全保障。
Pingora的另一個亮點是其靈活的過濾器和回呼函式機制。這使得使用者能夠根據自己的需求,完全自訂服務的請求處理、轉換和轉發過程。這一特性對於熟悉 OpenResty 和 Nginx 的使用者來說將尤為親切,因為Pingora的API設計直觀且易於與OpenResty的
"*_by_lua"
回呼函式對接。
在操作層面,Pingora提供了零停機時間的優雅重新開機功能,確保在升級過程中不會遺失任何傳入請求。此外,Pingora還易於與Syslog、Prometheus、Sentry、OpenTelemetry等關鍵可觀察性工具整合,幫助使用者即時監控和最佳化服務的效能。
那什麽情況下應該使用 Pingora 呢?
安全至上 :Pingora 是 C/C++ 服務的安全記憶體替代方案。透過 Pingora,您可以減少編碼錯誤,降低記憶體安全問題的風險。這意味著將能夠更專註於新功能的開發,而不必擔心潛在的安全隱患。
效能敏感 :Pingora 以其快速和高效的效能而著稱。得益於其多執行緒架構,Pingora 顯著減少了 CPU 和記憶體資源的消耗。對於需要最佳化成本和速度的系統,Pingora 無疑是理想的選擇。
高度客製需求 :Pingora 提供的 API 高度可編程,適用於構建客製和高級的閘道器或負載均衡器。無論需求有多麽復雜,Pingora 都能提供強大而簡單的實作方式。
有了 Nginx 為什麽還需要 Pingora?
Pingora 是 Cloudflare 使用 Rust 構建的新 HTTP 代理,不僅提升了效能,還為Cloudflare客戶帶來了眾多新功能。令人矚目的是,它在實作這些的同時,僅需以往代理基礎架構三分之一的CPU和記憶體資源。
隨著Cloudflare業務規模的飛速擴張,其需求已經超越了 Nginx 的處理能力。盡管 Nginx 多年來表現出色,但隨著時間推移,其規模上的局限性逐漸凸顯。包括:
Nginx 架構影響效能 :Nginx 的 worker(行程)架構導致每個請求只能由單個worker處理,造成了CPU內核之間的負載不平衡,從而降低了整體效能。此外,這種架構還可能導致執行CPU密集型或阻塞I/O任務的請求減緩其他請求的速度。另外,cloudflare 的用例依賴於高效的連線重用,以減少TCP和TLS握手的時間,加快請求的TTFB。然而, Nginx 的連線池與單個worker相對應,限制了連線的重用率。當增加更多的worker以進行擴充套件時,連線會分散在更多的孤立池中,導致連線重用率下降,TTFB增加,並增加了資源消耗。
有些型別的功能難以添加: Nginx 作為 Web 伺服器、負載均衡器或簡單的閘道器表現出色,但對於更高級、客製化的功能需求,它存在一些局限性。在嘗試圍繞 Nginx 構建所需功能時,面臨著與上遊程式碼庫保持一致的挑戰,這並不容易實作。除此之外, Nginx 社群的活躍度有限,開發工作往往缺乏開源社群的支持和協作。這限制了我們從社群獲取幫助和解決方案的能力。
為了追求更高的效能,並滿足復雜環境中日益增長的功能需求,Cloudflare決定構建全新的解決方案——Pingora。
效能提升
經過對 Pingora 的實際套用與效能數據的收集,觀察到了 顯著的效能提升 。Pingora在處理HTTP請求時,特別是針對緩存未命中的情況,表現出了出色的效能。Pingora架構的創新之處在於其跨執行緒共享連線的能力,這顯著提高了連線的重用率,並大幅減少了在 TCP 和 TLS 握手上所花費的時間。
根據數據,Pingora 將 TTFB(首字節時間)的中位數減少了 5 毫秒,而第 95 個百分位數更是減少了80毫秒。這並非因為程式碼執行速度更快,而是因為新架構更有效地管理了連線,從而減少了握手時間。
此外,與舊服務相比,Pingora每秒的新連線數減少了三分之二。
對於一個關鍵客戶,連線重用率從87.1%大幅提升至99.92%,這意味著新連線的數量減少了160倍。
換算成實際的時間節省,透過切換到Pingora,每天為客戶和使用者節省了相當於434年的握手時間。
更安全
在大規模分布式環境中,快速且安全地釋出新功能是一項艱巨的任務,尤其是在每秒處理數百萬個請求的情況下。在這樣的環境下,傳統的模糊測試和靜態分析只能提供有限的保障。
為了增強系統的穩定性和可靠性,Pingora 選擇了使用 Rust 語言,其記憶體安全語意確保了程式碼免受未定義行為的影響,從而增強了對服務正確執行的信心。這種保障能夠將更多精力集中在服務更改與其他服務或客戶來源的互動上,而不是擔憂記憶體安全或難以診斷的崩潰問題。
自 Pingora 使用以來,已經處理了數百萬億個請求,而且至今尚未因為服務程式碼而導致崩潰。這證明了Rust在記憶體安全方面的優勢以及 Cloudflare 團隊在開發和維護中的努力。
更高效
在生產環境中,與舊服務相比,Pingora在相同的流量負載下實作了顯著的資源消耗降低。具體來說,CPU消耗減少了約70%,而記憶體消耗減少了約67%。這一顯著的節省主要源於幾個關鍵因素。
首先,Pingora使用Rust編寫的程式碼相較於之前使用Lua的程式碼,在執行效率上有顯著的提升。Rust作為一種編譯型語言,其效能通常優於解釋型語言如Lua。
其次,Pingora的架構設計使得數據存取更加高效。在舊的 NGINX/OpenResty 架構中,Lua程式碼存取HTTP頭時涉及多個步驟,包括從 Nginx C結構中讀取、分配Lua字串、復制到Lua字串中,以及後續的垃圾回收。而在Pingora中,這種存取變得直接而高效,減少了不必要的中間步驟。
此外,Pingora采用的多執行緒模型使得跨請求共享數據更加高效。雖然NGINX也提供共享記憶體,但由於實施限制,每次存取都需要使用互斥鎖,並且只能儲存字串和數位。相比之下,Pingora允許透過原子參照計數器直接存取大多數共享計畫,從而提高了數據共享的效率。
最後,Pingora顯著減少了新連線的數量,這也是CPU節省的一個重要方面。與透過已建立的連線發送和接收數據相比,TLS握手過程更加耗時和資源密集。透過提高連線重用率,Pingora能夠減少新連線的需求,從而進一步降低資源消耗。
相關連結
Github: https://github.com/cloudflare/pingora