展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 软件教程 > Pingora:超受欢迎的Web服务器,超越了Nginx

Pingora:超受欢迎的Web服务器,超越了Nginx

很高兴介绍Pingora,这是我们基于Rust构建的新HTTP代理。每天处理超过1万亿个请求,提升了性能,为Cloudflare客户带来新功能,且仅需原代理基础架构三分之一的CPU和内存资源。随着Cloudflare的规模不断扩大,我们已经发现NGINX的处理能力已经无法满足我们的需求。尽管多年来它一直表现良好,但随着时间的推移,我们意识到它在应对我们规模上的挑战时存在局限性。因此,我们认为有必要构建一些新的解决方案来满足我们对性能和功能的需求。Cloudflare客户和用户使用Cloudflare全球网

本文目录

    很高兴介绍 Pingora,这是我们基于 Rust 构建的新 HTTP 代理。每天处理超过 1 万亿个请求,提升了性能,为 Cloudflare 客户带来新功能,且仅需原代理基础架构三分之一的 CPU 和内存资源。

    随着 Cloudflare 的规模不断扩大,我们已经发现 NGINX 的处理能力已经无法满足我们的需求。尽管多年来它一直表现良好,但随着时间的推移,我们意识到它在应对我们规模上的挑战时存在局限性。因此,我们认为有必要构建一些新的解决方案来满足我们对性能和功能的需求。

    Cloudflare客户和用户使用Cloudflare全球网络作为HTTP客户端和服务器之间的代理。我们已进行多次讨论,开发了许多技术并实施了新协议,如QUIC和HTTP/2优化,以提高浏览器和其他用户代理连接到我们网络的效率。

    今天,我们将聚焦于另一个与此等式相关的方面:代理服务,它负责管理我们网络和互联网服务器之间的流量。这个代理服务为我们的CDN、Workers fetch、Tunnel、Stream、R2等多项功能和产品提供支持和动力。

    让我们深入研究为何我们决定升级我们的旧版服务,并探讨Pingora系统的开发过程。这一系统是专门为Cloudflare的客户用例和规模而设计的。

    为什么要再建一个代理

    近年来,我们在使用NGINX时遇到了一些限制。针对一些限制,我们做了优化或采取了绕过的方式。然而,还有一些限制更具挑战性。

    架构的限制损害了性能

    NGINX worker(进程)架构 [4] 对于我们的用例而言存在操作缺陷,这会损害我们的性能和效率。

    首先,在 NGINX 中,每个请求只能由单个 worker 处理。这会导致所有 CPU 内核之间的负载不平衡 [5],从而 导致速度变慢 [6]。

    由于这种请求进程锁定效应,执行 CPU 密集型或阻止IO任务的请求可能会减缓其他请求的速度。正如这些博客文章所指出的,我们已经投入了大量时间来解决这些问题。

    我们的用例最关键的问题是连接重用,当我们的机器与原始服务器建立 TCP 连接时,代理了 HTTP 请求。通过重用连接池中的连接,可以跳过新连接所需的 TCP 和 TLS 握手,从而加快请求的 TTFB(首字节时间)。

    但是,NGINX 连接池 [9] 与单个 worker 相对应。当请求到达某个 worker 时,它只能重用该 worker 内的连接。当我们添加更多 NGINX worker 以进行扩展时,我们的连接重用率会变得更差,因为连接分散在所有进程的更多孤立的池中。这导致更慢的 TTFB 以及需要维护更多连接,进而消耗我们和客户的资源(和金钱)。Pingora有多牛逼!超受欢迎 Web 服务器超越Nginx

    正如在过去的博客文章中所提到的,我们为其中一些问题提供了解决方法。但如果我们能够解决根本问题:worker / 进程模型,我们将自然而然地解决所有这些问题。

    有些类型的功能难以添加

    NGINX 是一个非常好的 Web 服务器、负载均衡器或简单的网关。但 Cloudflare 的作用远不止于此。我们过去常常围绕 NGINX 构建我们需要的所有功能,但要尽量避免与 NGINX 上游代码库有太多分歧,这并不容易。

    例如,当重试请求 / 请求失败 [10] 时,有时我们希望将请求发送到具有不同请求标头集的不同源服务器。但 NGINX 并不允许执行此操作。在这种情况下,我们需要花费时间和精力来解决 NGINX 的限制。

    同时,我们被迫使用的编程语言并没有帮助缓解这些困难。NGINX 纯粹是用 C 语言编写的,这在设计上不是内存安全的。使用这样的第 3 方代码库非常容易出错。即使对于经验丰富的工程师来说,也很容易陷入内存安全问题 [11],我们希望尽可能避免这些问题。

    我们用来补充 C 语言的另一种语言是 Lua。它的风险较小,但性能也较差。此外,在处理复杂的 Lua 代码和业务逻辑时,我们经常发现自己缺少静态类型 [12]。

    而且 NGINX 社区也不是很活跃,开发往往是 “闭门造车”[13]。

    选择建立我们自己的

    在过去的几年里,随着我们的客户群和功能集的持续增长,我们持续评估了三种选择:

  • 1. 继续投资 NGINX,向其付款进行定制,使其 100% 满足我们的需求。我们拥有所需的专业知识,但鉴于上述架构限制,需要付出大量努力才能以完全支持我们需求的方式重建它。
  • 2. 迁移到另一个第三方代理代码库。肯定有好的项目,比如 envoy[14] 和其他一些 [15]。但这条道路意味着在几年内可能会重复同样的循环。
  • 3. 从头开始建立一个内部平台和框架。这一选择需要在工程方面进行最大的前期投资。
  • 在过去的几年中,我们每个季度都会对这些选项进行评估。没有明显的公式来判断哪种选择是最好的。在几年的时间里,我们继续走阻力最小的道路,继续增强 NGINX。然而,在某些情况下,建立自有代理的投资回报率似乎更值得。我们呼吁从头开始建立一个代理,并开始设计我们梦想中的代理应用程序。

    Pingora 项目

    设计决定

    为了打造一个每秒提供数百万次请求且快速、高效和安全的代理,我们必须首先做出一些重要的设计决定。

    我们选择 Rust[16] 作为项目的语言,因为它可以在不影响性能的情况下以内存安全的方式完成 C 语言可以做的事情。

    尽管有一些很棒的现成第 3 方 HTTP 库,例如 hyper[17],我们选择构建自己的库是因为我们希望最大限度地提高处理 HTTP 流量的灵活性,并确保我们可以按照自己的节奏进行创新。

    在 Cloudflare,我们处理整个互联网的流量。我们必须支持许多奇怪且不符合 RFC 的 HTTP 流量案例。这是 HTTP 社区和 Web 中的一个常见困境,在严格遵循 HTTP 规范,和适应潜在遗留客户端或服务器的广泛生态系统的细微差别之间存在矛盾和冲突,需要在其中作出艰难抉择。

    HTTP 状态码在 RFC 9110 中定义为一个三位整数 [18],通常预期在 100 到 599 的范围内。Hyper 就是这样一种实现。但是,许多服务器支持使用 599 到 999 之间的状态代码。我们为此功能创建了一个 问题 [19],探讨了争论的各个方面。虽然 hyper 团队最终确实接受了这一更改,但他们有充分的理由拒绝这样的要求,而这只是我们需要支持的众多不合规行为案例之一。

    为了满足 Cloudflare 在 HTTP 生态系统中的地位要求,我们需要一个稳健、宽容、可定制的 HTTP 库,该库可以在互联网的各种风险环境中生存,并支持各种不合规的用例。保证这一点的最佳方法就是实施我们自己的架构。

    下一个设计决策关于我们的工作负载调度系统。我们选择多线程而不是多处理 [20],以便轻松共享资源,尤其是连接池。我们认为还需要实施 工作窃取 [21] 来避免上面提到的某些类别的性能问题。Tokio 异步运行时结果 非常适合 [22] 我们的需求。

    最后,我们希望我们的项目直观且对开发人员友好。我们构建的不是最终产品,而是应该可以作为一个平台进行扩展,因为在它之上构建了更多的功能。我们决定实施一个类似于 NGINX/OpenResty[23] 的基于 “请求生命周期” 事件的可编程接口。例如,“请求过滤器” 阶段允许开发人员在收到请求标头时运行代码来修改或拒绝请求。通过这种设计,我们可以清晰地分离我们的业务逻辑和通用代理逻辑。之前从事 NGINX 工作的开发人员可以轻松切换到 Pingora 并迅速提高工作效率。

    Pingora 在生产中更快

    让我们快进到现在。Pingora 处理几乎所有需要与源服务器交互的 HTTP 请求(例如缓存未命中),我们在此过程中收集了很多性能数据。

    首先,让我们看看 Pingora 如何加快我们客户的流量。Pingora 上的总体流量显示,TTFB 中位数减少了 5 毫秒,第 95 个百分位数减少了 80 毫秒。这不是因为我们运行代码更快。甚至我们的旧服务也可以处理亚毫秒范围内的请求。

    时间节省来自我们的新架构,它可以跨所有线程共享连接。这意味着更好的连接重用率,在 TCP 和 TLS 握手上花费的时间更少。Pingora有多牛逼!超受欢迎 Web 服务器超越Nginx

    在所有客户中,与旧服务相比,Pingora 每秒的新连接数只有三分之一。对于一个主要客户,它将连接重用率从 87.1% 提高到 99.92%,这将新连接减少了 160 倍。更直观地说,通过切换到 Pingora,我们每天为客户和用户节省了 434 年的握手时间。

    更多功能

    拥有工程师熟悉的开发人员友好界面,同时消除以前的限制,让我们能够更快地开发更多功能。像新协议这样的核心功能充当我们为客户提供更多产品的基石。

    例如,我们能够在没有重大障碍的情况下向 Pingora 添加 HTTP/2 上游支持。这使我们能够在不久之后向我们的客户提供 gRPC[24]。将相同的功能添加到 NGINX 将需要 更多的工程工作,并且可能无法实现 [25]。

    最近,我们宣布推出了 Cache Reserve[26],其中 Pingora 使用 R2 存储作为缓存层。随着我们向 Pingora 添加更多功能,我们能够提供以前不可行的新产品。

    更高效

    在生产环境中,与我们的旧服务相比,Pingora 在相同流量负载的情况下,消耗的 CPU 和内存减少了约 70% 和 67%。节省来自几个因素。

    与旧的 Lua 代码 [27] 相比,我们的 Rust 代码运行 效率更高 [28]。最重要的是,它们的架构也存在效率差异。例如,在 NGINX/OpenResty 中,当 Lua 代码想要访问 HTTP 头时,它必须从 NGINX C 结构中读取它,分配一个 Lua 字符串,然后将其复制到 Lua 字符串中。之后,Lua 还对其新字符串进行垃圾回收。在 Pingora 中,它只是一个直接的字符串访问。

    多线程模型还使得跨请求共享数据更加高效。NGINX 也有共享内存,但由于实施限制,每次共享内存访问都必须使用互斥锁,并且只能将字符串和数字放入共享内存。在 Pingora 中,大多数共享项目可以通过原子引用计数器 [29] 后面的共享引用直接访问。

    如上所述,CPU 节省的另一个重要部分是减少了新的连接。与仅通过已建立的连接发送和接收数据相比,TLS 握手成本显然更为高昂。

    更安全

    在我们这样的规模下,快速安全地发布功能十分困难。很难预测在每秒处理数百万个请求的分布式环境中可能发生的每个边缘情况。模糊测试和静态分析只能缓解这么多。Rust 的内存安全语义保护我们免受未定义行为的影响,并让我们相信我们的服务将正确运行。

    有了这些保证,我们可以更多地关注我们的服务更改将如何与其他服务或客户来源进行交互。我们能够以更高的节奏开发功能,而不用背负内存安全和难以诊断崩溃的问题。

    当崩溃确实发生时,工程师需要花时间来诊断它是如何发生的以及是什么原因造成的。自 Pingora 创立以来,我们已经处理了数百万亿个请求,至今尚未因为我们的服务代码而崩溃。

    事实上,Pingora 崩溃是如此罕见,当我们遇到一个问题时,我们通常会发现不相关的问题。最近,我们的服务开始崩溃后不久,我们发现了一个内核错误 [30]。我们还在一些机器上发现了硬件问题,过去排除了由我们的软件引起的罕见内存错误,即使在几乎不可能进行重大调试之后也是如此。

    总结

    总而言之,我们已经建立了一个更快、更高效、更通用的内部代理,作为我们当前和未来产品的平台。

    我们之后将介绍有关我们面临的问题和应用优化的更多技术细节,以及我们从构建 Pingora 并将其推出以支持互联网的重要部分的经验教训。同时还将介绍我们的开源计划。

    本文转载自 CloudFlare 博客,作者Yuchen Wu & Andrew Hauck

    链接:https://blog.cloudflare.com/zh-cn/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet-zh-cn/

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    软件教程 nginx
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。