性能比拼: Pingora vs Nginx (My NEW Favorite Proxy)
本内容是对知名性能评测博主 Anton Putra Pingora vs Nginx Performance Benchmark: My NEW Favorite Proxy! 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准
介绍
在本视频中,我们将对比 Nginx 和 Pingora(一个用于构建网络服务的 Rust 框架)。我们将通过以下指标进行测试:
- 延迟:使用 P99 分位数来测量延迟,我认为这是衡量任何代理性能最重要的指标之一。
- 吞吐量:统计每个代理每秒可以处理的请求数。
- 可用性:测量每个代理的错误率。
- 饱和度:通过测量 CPU 使用率、内存使用率,以及这些代理背后的应用程序的 CPU 使用率,来看服务的利用程度。
所有测试均在 AWS 上运行。在本次测试中,我使用了以下配置:
- 代理服务器使用 大规格 EC2 实例,每个实例有 2 个 CPU 和 8 GB 内存。
- 代理背后的应用程序使用 中规格实例。
- EKS 集群 用于部署监控组件以及生成负载的客户端。
测试中,Nginx 使用的是 1.27.2 版本,Pingora 使用的是 0.4.0 版本。
Nginx 和 Pingora 的配置
在其他人的帮助下,我优化了 Nginx 的主要配置,所有的源代码都可以在我的 GitHub 公共仓库 中找到。以下是具体配置:
- 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,你需要具备一定的知识和经验才能使其高效运行。
- 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 分钟间隔,请告诉我。

-
每秒请求数(Requests per Second)
- 左侧图表显示每个代理从客户端接收的每秒请求数。我们逐渐增加负载,直到两个代理都失败。
-
延迟(Latency)
- 从延迟图表中可以看到,在整个测试过程中,Pingora 的延迟始终低于 Nginx 的。在测试初期,延迟非常低时,这可能看起来不重要,但如果你有多个微服务链,每个微服务都由代理(如 Nginx 或 Pingora)处理请求,那么延迟会随着负载的增加迅速累积,尤其是在有 5 个或 10 个微服务的长链时。
-
CPU 使用率(CPU Usage)
- 起初,Pingora 的 CPU 使用率高于 Nginx,但随着测试的进行,情况发生了变化。
-
内存使用率(Memory Usage)
- 在中等负载下,两者的内存使用率非常相似。但需要注意的是,许多工具在高负载下表现会有所不同,并可能因不同原因失败。
-
保持连接(Keep-Alive)
- 如果你使用 Nginx 作为反向代理,请确保启用了上游服务的 keep-alive 功能,否则延迟和 CPU 使用率会更高。你可以查看未启用 keep-alive 的基准测试结果,并与本次测试进行对比。我在描述中也附上了解决方法的 PR。Pingora 自动启用了 keep-alive,但你可以调整连接池大小,我对两个代理设置了相同的池大小。
-
可用性(Availability)
- 通常情况下,两个代理在负载增加到 20,000 请求每秒之前都能保持 100% 可用性,并且延迟低于 1 毫秒。这对于任何代理来说都是非常优秀的性能。
测试结果
接下来,我们查看整个测试的图表结果:
- 每秒请求数(Requests per Second)

- Nginx 达到了 41,000 请求/秒,而 Pingora 达到了 48,000 请求/秒。
- 延迟(Latency)

- Pingora 在整个测试过程中始终保持最低延迟,即使在测试结束时也非常稳定。
刚开始时的延迟相差并不大

- 可用性(Availability)

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

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

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

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

总结
如果你有编程经验并追求高性能,Pingora 是一个不错的选择。不过请记住,它是一个需要用 Rust 构建代理的库,如果你觉得 Nginx 已经很复杂,那么使用 Rust 构建一个类似 Nginx 的代理可能会更具挑战性。尽管如此,我会考虑在未来的生产项目中使用 Pingora。
我还有其他基准测试,你可能会感兴趣。感谢观看,我们下次见!
相关文章:
性能比拼: Pingora vs Nginx (My NEW Favorite Proxy)
本内容是对知名性能评测博主 Anton Putra Pingora vs Nginx Performance Benchmark: My NEW Favorite Proxy! 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 介绍 在本视频中,我们将对比 Nginx 和 Pingora(一个用于构建网络服务的 Rust 框架…...
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输出 前言开发板说明引用解答和…...
Open GL ES ->模型矩阵、视图矩阵、投影矩阵等变换矩阵数学推导以及方法接口说明
Open GL ES 变换矩阵详解 一、坐标空间变换流程 局部空间 ->Model Matrix(模型矩阵)-> 世界空间 世界空间->View Matrix(视图矩阵)->观察空间 观察空间 ->Projection Matrix(投影矩阵)->裁剪空间 裁剪空间 ->ViewPort Transform(视口变换)>屏幕空间 …...
AI提示词:自然景区智能客服
提示描述 专为自然景区游客设计的智能客服系统,旨在通过人工智能技术提供实时、准确的景区信息、游览建议、安全提示和服务支持,提升游客的体验质量和满意度。 提示词 # Role: 自然景区智能客服## Profile: - Author: xxx - Version: 1.0 - Language: …...
c#的反射和特性
在 C# 中,反射(Reflection)和特性(Attributes)是两个强大的功能,它们在运行时提供元编程能力,广泛用于框架开发、对象映射和动态行为扩展。以下是对它们的详细介绍,包括定义、用法、…...
智能体项目实现AI对话流式返回效果
1、智能体项目里与AI大模型对话的时候,需要从后端的流式接口里取数据并实现打字机渲染效果。这里涉及到 Markdown 格式的渲染,所以需要配合 marked.js 实现,安装 marked.js : npm install marked 引用: import { ma…...
定时任务(python)
介绍 🧩 什么是“定时任务”? 定时任务,就是按照设定的时间间隔或时间点自动执行某些操作。比如: • 每天早上8点发通知 • 每隔10秒采集一次数据 • 每小时清理一次缓存相关使用 ✅ 最简单的方式:while True tim…...
Python学习第二十七天
yield关键字 yield关键字扮演着核心角色,主要用于处理异步数据流和请求调度。 主要作用 生成器函数:将方法转换为生成器,可以逐步产生结果而不需要一次性返回所有数据 异步处理:支持Scrapy的异步架构,提高爬取效率 …...
Docker Compose 启动jar包项目
参考文章安装Docker和Docker Compose 点击跳转 配置 创建一个文件夹存放项目例如mydata mkdir /mydata上传jar包 假设我的jar包名称为goudan.jar 编写dockerfile文件 vim app-dockerfile按键盘上的i进行编辑 # 使用jdk8 FROM openjdk:8-jre# 设置时区 上海 ENV TZAsia/Sh…...
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…...
C++多线程的性能优化
高效线程池设计与工作窃取算法实现解析 1. 引言 现代多核处理器环境下,线程池技术是提高程序并发性能的重要手段。本文解析一个采用工作窃取(Work Stealing)算法的高效线程池实现,通过详细代码分析和性能测试展示其优势。 2. 线程池核心设计 2.1 类结…...
【TS学习】(19)TS中的类
在 TypeScript 中,类(Class) 是面向对象编程的核心结构,用于封装数据和行为。TypeScript 的类继承了 JavaScript 的类特性,并增加了类型系统和高级功能的支持(如访问修饰符、存取器和装饰器)。 …...
UI设计系统:如何构建一套高效的设计规范?
UI设计系统:如何构建一套高效的设计规范? 1. 色彩系统的建立与应用 色彩系统是设计系统的基础之一,它不仅影响界面的整体美感,还对用户体验有着深远的影响。首先,设计师需要定义主色调、辅助色和强调色,并…...
深度学习--softmax回归
回归可以用于预测多少的问题,预测房屋出售价格,棒球队可能获胜的的常数或者患者住院的天数。 事实上,我们也对分类问题感兴趣,不是问 多少,而是问哪一个 1 某个电子邮件是否属于垃圾邮件 2 某个用户可能注册还是不注册…...
【计算机网络】记录一次校园网无法上网的解决方法
问题现象 环境:实训室教室内时间:近期突然出现 (推测是学校在施工,部分设备可能出现问题)症状: 连接校园网 SWXY-WIFI 后: 连接速度极慢偶发无 IP 分配(DHCP 失败)即使分…...
Java关于抽象类和抽象方法
引入抽象: 在之前把不同类中的共有成员变量和成员方法提取到父类中叫做继承。然后对于成员方法在不同子类中有不同的内容,对这些方法重新书写叫做重写;不过如果有的子类没有用继承的方法,用别的名字对这个方法命名的话࿰…...
第二十一章:Python-Plotly库实现数据动态可视化
Plotly是一个强大的Python可视化库,支持创建高质量的静态、动态和交互式图表。它特别擅长于绘制三维图形,能够直观地展示复杂的数据关系。本文将介绍如何使用Plotly库实现函数的二维和三维可视化,并提供一些优美的三维函数示例。资源绑定附上…...
LeetCode 热题 100_打家劫舍(83_198_中等_C++)(动态规划)
LeetCode 热题 100_打家劫舍(83_198) 题目描述:输入输出样例:题解:解题思路:思路一(动态规划(一维dp数组)):思路二(动态规划ÿ…...
C语言复习--assert断言
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终止运行。这个宏常常被称为“断⾔”。 assert(p ! NULL); 代码在程序运⾏到这⼀⾏语句时,验证变量 p 是否等于 NULL 。如果确实不等于 NU…...
嵌入式软件设计规范框架(MISRA-C 2012增强版)
以下是一份基于MISRA-C的嵌入式软件设计规范(完整技术文档框架),包含编码规范、安全设计原则和工程实践要求: 嵌入式软件设计规范(MISRA-C 2012增强版) 一、编码基础规范 1.1 文件组织 头文件保护 /* 示…...
系统思考反馈
最近交付的都是一些持续性的项目,越来越感觉到,系统思考和第五项修炼不只是简单的一门课程,它们能真正融入到我们的日常工作和业务中,帮助我们用更清晰的思维方式解决复杂问题,推动团队协作,激发创新。 特…...
【C++】vector常用方法总结
📝前言: 在C中string常用方法总结中我们讲述了string的常见用法,vector中许多接口与string类似,作者水平有限,所以这篇文章我们主要通过读vector官方文档的方式来学习vector中一些较为常见的重要用法。 🎬个…...
Burpsuite 伪造 IP
可以用于绕过 IP 封禁检测,用来暴力、绕过配额限制。 也可以用来做 ff98sha 出的校赛题,要求用 129 个 /8 网段的 IP 地址访问同一个 domain 插件 - IPRotate 原理:利用云服务商的反向代理服务。把反向代理的域名指向到目标 ip 即可。 http…...
12.小节
1.认识 QLabel 类,能够在界面上显示字符串. 通过 setText 来设置的.参数 QString (Qt 中把 C 里的很多容器类, 进行了重新封装.历史原因) c叫法容器类,java叫法集合类 2.内存泄露,文件资源泄露 3.对象树。Qt 中通过对象树,来统一的释放界面的…...
