Cloudflare 從 NGINX 切換到自己的用 Rust 編寫的 Pingora 代理

Cloudflare 宣布正在遷移其內容分發網絡以使用用 Rust 編寫的 Pingora 代理。 新代理已將基於 NGINX 服務器的配置替換為 Lua 腳本,每天處理超過一萬億個請求。 值得注意的是,向專用代理的過渡不僅允許實現新功能並由於安全地使用內存而提高安全性,而且還顯著提高了性能和節省了資源——基於 Pingora 的解決方案不需要使用Lua,因此在處理相同流量的情況下,它消耗的 CPU 資源減少了 70%,內存減少了 67%。

長期以來,基於 NGINX 和 Lua 腳本在用戶和終端服務器之間代理流量的系統滿足了 Cloudflare 的需求,但隨著網絡的發展和復雜性的增加,一個通用的解決方案是不夠的,無論是在性能方面,並且由於客戶新機會的可擴展性和實施方面的限制。 特別是,在添加簡單網關和負載均衡器之外的功能方面存在困難。 例如,如果服務器無法處理請求,則有必要將請求重定向到另一台服務器,為其提供一組不同的 HTTP 標頭。

Pingora 不是將請求拆分為單獨的工作進程(worker)的架構,而是使用多線程模型,該模型在 Cloudflare 使用場景(來自不同站點的流量高度集中,具有較大的統計偏移)中顯示了更有效的資源分配中央處理器核心。 特別是在 nginx 中將不平衡的請求綁定到進程導致 CPU 內核負載不平衡,導致資源密集型請求和阻塞 I/O 減慢其他請求的處理速度。 另外,將連接池綁定到handler進程,不允許重用其他handler進程已經建立的連接,在handler進程數量多的情況下會降低效率。

Nginx:

Cloudflare 從 NGINX 切換到自己的用 Rust 編寫的 Pingora 代理

平果拉:

Cloudflare 從 NGINX 切換到自己的用 Rust 編寫的 Pingora 代理

Pingora 的引入使得新連接建立操作的數量減少了 160 倍,重用請求的份額從 87.1% 提高到 99.92%。 除了減少重新連接和更有效地使用 CPU 內核之外,新代理的性能改進主要是由於擺脫了與 nginx 一起使用的緩慢的 Lua 處理程序。

選擇 Rust 語言是因為它兼具高性能和內存安全工具的可用性。 其中提到,儘管 Cloudflare 工程師的資質很高,並且使用 C 語言編寫代碼審查,但仍無法避免導致內存問題的錯誤(例如,HTML 解析器中的漏洞)。 至於新代碼,我們講了Pingora崩潰的案例分析,結果證明不是應用程序問題引起的,而是Linux內核和硬件故障的錯誤。

此外,可以注意到 Linus Torvalds 在最近舉行的歐洲開源峰會上發表了關於在 Linux 內核中包含 Rust 語言支持的評論。 6.0 內核不包含用 Rust 語言開發設備驅動程序的補丁,但根據 Linus 的說法,它們很可能會被 6.1 內核接受,他不會拉動集成。 作為增加對 Rust 支持的動機,除了對安全性有積極影響外,Linus 還呼籲有機會增加新參與者對核心工作的興趣,這在老前輩老化的背景下很重要。

來源: opennet.ru

添加評論