性能比拼: Pingora vs Nginx (My NEW Favorite Proxy)

news2025/4/3 20:09:25

本内容是对知名性能评测博主 Anton Putra Pingora vs Nginx Performance Benchmark: My NEW Favorite Proxy! 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准

介绍

在本视频中,我们将对比 NginxPingora(一个用于构建网络服务的 Rust 框架)。我们将通过以下指标进行测试:

  1. 延迟:使用 P99 分位数来测量延迟,我认为这是衡量任何代理性能最重要的指标之一。
  2. 吞吐量:统计每个代理每秒可以处理的请求数。
  3. 可用性:测量每个代理的错误率。
  4. 饱和度:通过测量 CPU 使用率内存使用率,以及这些代理背后的应用程序的 CPU 使用率,来看服务的利用程度。

所有测试均在 AWS 上运行。在本次测试中,我使用了以下配置:

  • 代理服务器使用 大规格 EC2 实例,每个实例有 2 个 CPU 和 8 GB 内存
  • 代理背后的应用程序使用 中规格实例
  • EKS 集群 用于部署监控组件以及生成负载的客户端。

测试中,Nginx 使用的是 1.27.2 版本,Pingora 使用的是 0.4.0 版本


Nginx 和 Pingora 的配置

在其他人的帮助下,我优化了 Nginx 的主要配置,所有的源代码都可以在我的 GitHub 公共仓库 中找到。以下是具体配置:

  1. Nginx 配置

  • 配置 Nginx 根据 CPU 核心数自动设置工作进程数量。由于 EC2 实例有 2 个 CPU,所以 Nginx 创建了 两个独立的工作进程(workers)
  • 每个工作进程设置了 4 个线程,基于之前的测试结果。

  • 配置了 upstream block 来连接 4 个后端应用程序,使用默认的 轮询算法(round-robin)
  • 启用了 keep-alive 功能,并设置了 proxy_connection 头。
  • 启用了 HTTP/2 协议,并提供了自签名证书。

  • 出于公平对比,由于 Pingora 默认没有访问日志,我在 Nginx 中也禁用了访问日志。
  • 添加了一个 X-Forwarded-For 头,将真实的客户端 IP 地址转发到后端应用程序。

提示:像 Caddy 和 Traefik 这样的高级代理默认就配置了这些功能,但对于 Nginx 和 Pingora,你需要具备一定的知识和经验才能使其高效运行。

  1. Pingora 配置
    • Rust 编程:Pingora 是一个用 Rust 编写的库,因此需要一些 Rust 编程知识。Rust 并不是很容易学习的语言,但它可以用来构建非常高效的应用程序。

  • 创建负载均衡器:你可以像配置 Nginx 一样使用静态文件配置 Pingora 的代理。
  • 健康检查:实现了每个后端服务的 主动健康检查。Nginx 的开源版本只支持 被动健康检查,即 Nginx 只有在路由请求失败后才会移除某个后端应用程序,而付费版本 Nginx Plus 则支持主动健康检查,但需要额外付费。
  • 提供自签名证书,并将连接升级到 HTTP/2
  • 使用内置功能为每个请求添加 X-Forwarded-For 等头信息,同时使用默认的轮询算法。Pingora 还允许你根据需求创建自己的负载均衡算法。

  • 配置文件模式:你也可以通过配置文件配置 Pingora,但需要以守护进程模式运行以应用这些设置。

为了公平对比,由于 Nginx 使用了 2 个工作进程,每个进程有 4 个线程,所以我为 Pingora 配置了 8 个线程。虽然测试了其他配置,但最终决定使用 8 线程。需要注意的是,Nginx 的线程并不处理所有工作,因此不能直接与 Pingora 的线程作比较。


性能基准测试

接下来运行测试。整个测试耗时约 1.5 小时,但我将结果压缩为几分钟展示。在本次测试中,我将图表的时间范围设置为 5 分钟。如果你觉得我应该恢复之前的 15 分钟间隔,请告诉我。

  1. 每秒请求数(Requests per Second)

    • 左侧图表显示每个代理从客户端接收的每秒请求数。我们逐渐增加负载,直到两个代理都失败。
  2. 延迟(Latency)

    • 从延迟图表中可以看到,在整个测试过程中,Pingora 的延迟始终低于 Nginx 的。在测试初期,延迟非常低时,这可能看起来不重要,但如果你有多个微服务链,每个微服务都由代理(如 Nginx 或 Pingora)处理请求,那么延迟会随着负载的增加迅速累积,尤其是在有 5 个或 10 个微服务的长链时。
  3. CPU 使用率(CPU Usage)

    • 起初,Pingora 的 CPU 使用率高于 Nginx,但随着测试的进行,情况发生了变化。
  4. 内存使用率(Memory Usage)

    • 在中等负载下,两者的内存使用率非常相似。但需要注意的是,许多工具在高负载下表现会有所不同,并可能因不同原因失败。
  5. 保持连接(Keep-Alive)

    • 如果你使用 Nginx 作为反向代理,请确保启用了上游服务的 keep-alive 功能,否则延迟和 CPU 使用率会更高。你可以查看未启用 keep-alive 的基准测试结果,并与本次测试进行对比。我在描述中也附上了解决方法的 PR。Pingora 自动启用了 keep-alive,但你可以调整连接池大小,我对两个代理设置了相同的池大小。
  6. 可用性(Availability)

    • 通常情况下,两个代理在负载增加到 20,000 请求每秒之前都能保持 100% 可用性,并且延迟低于 1 毫秒。这对于任何代理来说都是非常优秀的性能。

测试结果

接下来,我们查看整个测试的图表结果:

  1. 每秒请求数(Requests per Second)

  • Nginx 达到了 41,000 请求/秒,而 Pingora 达到了 48,000 请求/秒
  1. 延迟(Latency)

  • Pingora 在整个测试过程中始终保持最低延迟,即使在测试结束时也非常稳定。

刚开始时的延迟相差并不大

  1. 可用性(Availability)

  • Nginx 的可用性出现了一些下降,但仍保持在 99.99%,这完全可以接受。
  1. CPU 使用率(CPU Usage)

  • 虽然 Pingora 在测试初期的 CPU 使用率明显更高,但最终 CPU 使用率趋于一致,Pingora 实现了更高的吞吐量。
  1. 内存使用率(Memory Usage)

  • 在 CPU 密集型应用程序和性能测试中,内存使用通常不是关键因素。
  1. 后端应用程序的 CPU 使用率

  • Nginx 的后端应用程序 CPU 使用率略高,但仅在测试结束时 Nginx 开始失败时才出现这种情况。整个测试中,两者的 CPU 使用率几乎相同。
  1. 网络使用情况


总结

如果你有编程经验并追求高性能,Pingora 是一个不错的选择。不过请记住,它是一个需要用 Rust 构建代理的库,如果你觉得 Nginx 已经很复杂,那么使用 Rust 构建一个类似 Nginx 的代理可能会更具挑战性。尽管如此,我会考虑在未来的生产项目中使用 Pingora。

我还有其他基准测试,你可能会感兴趣。感谢观看,我们下次见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ranger一分钟

简介 Ranger Admin:Web UIPolicy Admin Tool:定义和管理策略的模块Ranger Plugins:HDFS、Hive、HBase、Kafka、Storm、YARNRanger UserSync: LDAP、Active DirectoryRanger KMS:管理和保护数据加密的密钥 加密密钥管理…

STM32单片机入门学习——第5节: [3-1]GPIO输出

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.01 STM32开发板学习——第5节: [3-1]GPIO输出 前言开发板说明引用解答和…

pytorch中dataloader自定义数据集

前言 在深度学习中我们需要使用自己的数据集做训练,因此需要将自定义的数据和标签加载到pytorch里面的dataloader里,也就是自实现一个dataloader。 数据集处理 以花卉识别项目为例,我们分别做出图片的训练集和测试集,训练集的标…

SQL Server:触发器

在 SQL Server Management Studio (SSMS) 中查看数据库触发器的方法如下: 方法一:通过对象资源管理器 连接到 SQL Server 打开 SSMS,连接到目标数据库所在的服务器。 定位到数据库 在左侧的 对象资源管理器 中,展开目标数据库&a…

标题:利用 Rork 打造定制旅游计划应用程序:一步到位的指南

引言: 在数字化时代,旅游计划应用程序已经成为旅行者不可或缺的工具。但开发一个定制的旅游应用可能需要耗费大量时间与精力。好消息是,Rork 提供了一种快捷且智能的解决方案,让你能轻松实现创意。以下是使用 Rork 创建一个定制旅…

WebSocket原理详解(二)

WebSocket原理详解(一)-CSDN博客 目录 1.WebSocket协议的帧数据详解 1.1.帧结构 1.2.生成数据帧 2.WebSocket协议控制帧结构详解 2.1.关闭帧 2.2.ping帧 2.3.pong帧 3.WebSocket心跳机制 1.WebSocket协议的帧数据详解 1.1.帧结构 WebSocket客户端与服务器通信的最小单…

计算声音信号波形的谐波

计算声音信号波形的谐波 1、效果 2、定义 在振动分析中,谐波通常指的是信号中频率是基频整数倍的成分。基频是振动的主要频率,而谐波可能由机械系统中的非线性因素引起。 3、流程 1. 信号生成:生成或加载振动信号数据(模拟或实际数据)。 2. 预处理:预处理数据,如去噪…

RepoReporter 仿照`TortoiseSVN`项目监视器,能够同时支持SVN和Git仓库

RepoReporter 项目地址 RepoReporter 一个仓库监视器,仿照TortoiseSVN项目监视器,能够同时支持SVN和Git仓库。 工作和学习会用到很多的仓库,每天都要花费大量的时间在频繁切换文件夹来查看日志上。 Git 的 GUI 工具琳琅满目,Git…

UI设计系统:如何构建一套高效的设计规范?

UI设计系统:如何构建一套高效的设计规范? 1. 色彩系统的建立与应用 色彩系统是设计系统的基础之一,它不仅影响界面的整体美感,还对用户体验有着深远的影响。首先,设计师需要定义主色调、辅助色和强调色,并…

【计算机网络】记录一次校园网无法上网的解决方法

问题现象 环境:实训室教室内时间:近期突然出现 (推测是学校在施工,部分设备可能出现问题)症状: 连接校园网 SWXY-WIFI 后: 连接速度极慢偶发无 IP 分配(DHCP 失败)即使分…

第二十一章:Python-Plotly库实现数据动态可视化

Plotly是一个强大的Python可视化库,支持创建高质量的静态、动态和交互式图表。它特别擅长于绘制三维图形,能够直观地展示复杂的数据关系。本文将介绍如何使用Plotly库实现函数的二维和三维可视化,并提供一些优美的三维函数示例。资源绑定附上…

系统思考反馈

最近交付的都是一些持续性的项目,越来越感觉到,系统思考和第五项修炼不只是简单的一门课程,它们能真正融入到我们的日常工作和业务中,帮助我们用更清晰的思维方式解决复杂问题,推动团队协作,激发创新。 特…

【C++】vector常用方法总结

📝前言: 在C中string常用方法总结中我们讲述了string的常见用法,vector中许多接口与string类似,作者水平有限,所以这篇文章我们主要通过读vector官方文档的方式来学习vector中一些较为常见的重要用法。 🎬个…

2025年数智化电商产业带发展研究报告260+份汇总解读|附PDF下载

原文链接:https://tecdat.cn/?p41286 在数字技术与实体经济深度融合的当下,数智化产业带正成为经济发展的关键引擎。 从云南鲜花产业带的直播热销到深圳3C数码的智能转型,数智化正重塑产业格局。2023年数字经济规模突破53.9万亿元&#xff…

Linux中常用服务器监测命令(性能测试监控服务器实用指令)

1.查看进程 ps -ef|grep 进程名以下指令需要先安装:sysstat,安装指令: yum install sysstat2.查看CPU使用情况(间隔1s打印一个,打印6次) sar -u 1 63.#查看内存使用(间隔1s打印一个,打印6次) sar -r 1 6

基于 GEE 的区域降水数据可视化:从数据处理到等值线绘制

目录 1 引言 2 代码功能概述 3 代码详细解析 3.1 几何对象处理与地图显示 3.2 加载 CHIRPS 降水数据 3.3 筛选不同时间段的降水数据 3.4 绘制降水时间序列图 3.5 计算并可视化短期和长期降水总量 3.6 绘制降水等值线图 4 总结 5 完整代码 6 运行结果 1 引言 在气象…

曲线拟合 | Matlab基于贝叶斯多项式的曲线拟合

效果一览 代码功能 代码功能简述 目标:实现贝叶斯多项式曲线拟合,动态展示随着数据点逐步增加,模型后验分布的更新过程。 核心步骤: 数据生成:在区间[0,1]生成带噪声的正弦曲线作为训练数据。 参数设置&#xff1a…

Qt6调试项目找不到Bluetooth Component蓝牙组件

错误如图所示 Failed to find required Qt component "Bluetooth" 解决方法:搜索打开Qt maintenance tool 工具 打开后,找到这个Qt Connectivity,勾选上就能解决该错误

JAVA- 锁机制介绍 进程锁

进程锁 基于文件的锁基于Socket的锁数据库锁分布式锁基于Redis的分布式锁基于ZooKeeper的分布式锁 实际工作中都是集群部署,通过负载均衡多台服务器工作,所以存在多个进程并发执行情况,而在每台服务器中又存在多个线程并发的情况,…

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…