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。