Pingora正式開源:超強的Nginx替代品,每秒可處理4000萬請求!
2 月 28 日,Cloudflare 開源了其自研的 Nignx 替代品:Pingora。這是一個基于 Rust 打造的高速、可靠與可編程的網絡系統。目前,Cloudflare 已使用 Pingora 全面替代 Nginx 。經過實戰檢驗,Pingora 每秒穩定處理超過 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。