Cloudflare 从 NGINX 切换到自己的 Pingora 代理(用 Rust 编写)

Cloudflare 宣布其内容交付网络过渡为使用以 Rust 语言编写的 Pingora 代理。 新代理用 Lua 脚本取代了基于 NGINX 服务器的配置,每天处理超过一万亿个请求。 值得注意的是,向专用代理的过渡不仅可以实现新功能并由于内存的安全操作而提高安全性,而且还可以显着提高性能并节省资源 - 基于 Pingora 的解决方案不需要使用Lua,因此在处理相同流量的情况下,消耗的 CPU 资源减少了 70%,内存消耗减少了 67%。

长期以来,基于 NGINX 和 Lua 脚本的用户和终端服务器之间的代理流量系统满足了 Cloudflare 的需求,但随着网络的增长和复杂性的增加,通用的解决方案被证明是不够的,无论是在性能以及由于可扩展性和为客户实施新机会的限制。 特别是,在简单网关和负载均衡器之外添加功能面临着挑战。 例如,如果服务器无法处理请求,则有必要将请求重新发送到另一台服务器,并为其提供一组不同的 HTTP 标头。

Pingora 没有采用将请求分离到单独工作进程的架构,而是使用多线程模型,该模型在 Cloudflare 用例中(来自不同站点的流量高度集中,统计变化较大)显示出 CPU 核心之间的资源分配更有效。 特别是,nginx将不平衡的请求绑定到进程上,导致CPU核心负载不平衡,导致资源密集型请求和阻塞I/O,减慢其他请求的处理速度。 此外,将连接池绑定到处理程序进程不允许重用其他处理程序进程已建立的连接,这会在存在大量处理程序进程时降低效率。

NGINX:

Cloudflare 从 NGINX 切换到自己的 Pingora 代理(用 Rust 编写)

平戈拉:

Cloudflare 从 NGINX 切换到自己的 Pingora 代理(用 Rust 编写)

Pingora 的实施使新连接的安装数量减少了 160 倍,并将重用查询的份额从 87.1% 增加到 99.92%。 除了减少重新连接和更有效地使用 CPU 核心之外,新代理的性能改进主要是由于删除了与 nginx 一起使用的缓慢 Lua 处理程序。

选择 Rust 语言是为了实现高性能,并结合工具的可用性来确保内存的安全操作。 值得一提的是,尽管Cloudflare拥有高素质的工程师并审查了C语言编写的代码,但还是无法避免导致内存问题的错误(例如HTML解析器中的漏洞)。 至于新代码,它谈到了对Pingora中的故障进行分析的案例,结果证明这些故障不是由应用程序的问题引起的,而是由Linux内核的错误和硬件故障引起的。

此外,我们还可以注意到 Linus Torvalds 在最近举行的欧洲开源峰会上发表的评论,内容涉及 Linux 内核中对 Rust 语言的支持。 用 Rust 语言开发设备驱动程序的补丁并未包含在 6.0 内核中,但根据 Linus 的说法,它们很可能会被接受到 6.1 内核中;他不会推迟集成。 作为增加对 Rust 支持的动机,除了对安全性的积极影响之外,Linus 还提到了增加新参与者对核心工作的兴趣的机会,这在老参与者老龄化的背景下很重要。

来源: opennet.ru

添加评论