Cloudflare 宣布將其內容分發網路遷移至使用 Rust 編寫的 Pingora 代理程式。新代理將基於 NGINX 伺服器的配置替換為 Lua 腳本,每天處理超過一兆個請求。值得一提的是,遷移至專用代理不僅能夠實現新功能,並透過安全使用記憶體提升安全性,還顯著提升了效能並節省了資源——基於 Pingora 的解決方案無需使用 Lua 腳本,因此在處理相同流量時,CPU 資源消耗減少 70%,記憶體消耗減少 67%。
長期以來,一直存在一種用於在用戶和最終用戶之間代理流量的系統。 伺服器 基於 NGINX 和 Lua 腳本的 Cloudflare 現有解決方案滿足了其需求,但隨著網路規模的擴大和複雜性的增加,這種一體化解決方案在效能、可擴展性以及實現新客戶端功能方面都顯得力不從心。尤其是在簡單的網關和負載平衡器之外添加其他功能時,難度更高。例如,需要實現故障轉移回應。 服務器 將請求重新傳送到不同的伺服器,並為其提供不同的 HTTP 標頭集。
Pingora 並未採用基於工作流程的架構,而是採用了多執行緒模型。在 Cloudflare 的用例中(來自不同網站的高流量密度,且統計差異較大),該模型在 CPU 核心之間實現了更有效率的資源分配。具體而言,將不均衡的請求綁定到 nginx 進程會導致 CPU 核心負載不平衡,資源密集型請求和阻塞 I/O 會減慢其他請求的處理速度。此外,將連接池綁定到工作進程會阻止重複使用其他工作進程中已建立的連接,從而降低大量工作進程的工作效率。
Nginx:

平果拉:

Pingora 的實作使我們能夠將新連線建立操作的數量減少 160 倍,並將重複使用請求的佔比從 87.1% 提升到 99.92%。除了減少重新連接和更有效率地利用 CPU 核心之外,新代理的效能提升主要得益於擺脫了 nginx 中使用的緩慢 Lua 處理程序。
選擇 Rust 語言是因為它能夠在實現高效能的同時,提供記憶體安全特性。值得注意的是,儘管 Cloudflare 的工程師資格很高,並且進行了廣泛的程式碼審查,但 C 程式碼中仍然無法避免導致記憶體問題的錯誤(例如 HTML 解析器中的漏洞)。關於新程式碼,他們分析了 Pingora 中的崩潰問題,結果發現崩潰並非由應用程式問題引起,而是由核心錯誤導致。 Linux 以及硬體故障。
此外,值得注意的是 Linus Torvalds 在目前正在舉行的歐洲開源峰會上發表的評論,該評論涉及在核心中加入 Rust 語言支援。 Linux用於開發 Rust 裝置驅動程式的修補程式並未包含在內核 6.0 中,但據 Linus 稱,它們很可能會被包含在內核 6.1 中,而且他並不打算推遲整合。除了安全性方面的優勢外,Linus 還指出,這將有助於提高新貢獻者對核心開發的興趣,考慮到核心團隊的老化,這一點尤其重要。
來源: opennet.ru
