性能比拼: Go标准库 vs Python FastAPI(第二轮)

本内容是对知名性能评测博主 Anton Putra Python (FastAPI) vs Go (Golang) (Round 2) Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准

介绍

这是第二轮关于 FastAPIGolang 的对比测试。我几天前运行了前一次的基准测试,到目前为止,我已经收到了 13 个关于 Python 性能改进的 Pull Request。如果你是一名开发者,我建议你先观看之前的基准测试,并对比视频描述中提供的源码和所有的 Pull Request,这样可以帮助你避免我在上一次基准测试中犯的错误。

在第一轮测试中,我们将测量以下指标:

  1. 使用 90% 分位数 测量客户端每个请求的延迟。
  2. 使用每秒请求数(Requests Per Second)来衡量吞吐量。
  3. 应用程序的 CPU 使用率。
  4. 内存使用情况。
  5. 可用性或错误率。
  6. CPU 限制(CPU Throttling)情况。
    这些测试将在 AWS 的生产级 Kubernetes 集群中运行。

在第二轮测试中,我们将模拟一个真实的用例:应用程序接收请求后,将数据保存到关系型数据库中,并使用缓存来提高性能。数据库使用 Postgres 17.2,缓存使用 Memcached。如果你感兴趣,可以观看我之前对比 RedisMemcached 的视频结果(结果差距很大)。

所有的基准测试都在 AWS 上运行,使用了不同类型的 EC2 实例。目前,我主要使用基于 ARM 架构的 Graviton 实例,因为它们价格更低。

  • Postgres 使用存储优化型的 i8g.large 实例。

  • 缓存使用 m8g.large 实例。

  • Kubernetes 集群中的监控组件(如 PrometheusGrafana)及负载生成客户端,运行在计算优化型实例上。

  • 每个应用程序运行在专用虚拟机上,使用了 m7a.large 实例,并通过 TolerationsAffinity 设置实现隔离(以能够使它们运行在自己专用的虚拟机上面)。

AWS 的费用不低,为了支持我的频道和支付这些基础设施成本,我提供一对一咨询和其他服务。详情请查看视频描述。


第一轮测试(静态内容)

好了,让我们开始第一轮测试。这是第二轮测试了,我建议你先观看使用未经优化的 Python 代码进行的第一次基准测试,然后与这次测试进行对比。在第一轮测试中,我们让应用返回硬编码的对象。

这次测试中:

  • 我使用了 FastAPI 推荐的默认 Web 服务器 Uvicorn,并配置了两个工作线程(workers)。
  • 端点使用了异步处理(Async Handler)。

虽然在第一次基准测试中性能稍好,但最终还是失败了并恢复运行。

在这次测试中,性能稍微更稳定,但只能达到 每秒 11,000 请求。虽然差距不是很大,但对性能还是有影响。在运行到每秒约 11,000 请求时,由于 CPU 限制,开始出现失败,延迟大幅上升,可用性下降。

我原本期望经过这些优化和收到的众多 Pull Request(你可以在视频描述中找到所有这些 Pull Request),性能会更好。不过,我会继续运行测试,直到 Go 应用程序也开始出现失败。

Golang 的表现依旧出色,可以达到 每秒 60,000 到 65,000 请求,这是非常不错的性能。虽然不是最顶尖的,但一些语言(比如 RustZig)在类似测试中可以达到 每秒 100,000 请求。但无论如何,在这次测试中,Go 的效率远远高于 FastAPI。

接下来,我们打开每个测试指标的图表:

  1. 每秒请求数(Requests Per Second)
    • Python 达到了 每秒 11,000 请求,而 Go 达到了 每秒 66,000 请求

  1. 延迟(Latency)

    • 对于面向客户端的应用程序来说,延迟是最重要的指标之一,而 Go 在这一点上表现得更好。

  1. CPU 使用率
    • FastAPI 很快耗尽了所有可用 CPU。

  1. 可用性(Availability)

  1. 内存使用(Memory Usage)

  1. CPU 限制(CPU Throttling)

在这次测试中,FastAPI 的表现并不好。但我会继续测试其他 Python 框架,例如 Starlette(FastAPI 的底层框架),或者直接创建一个 ASGI Python 应用,看看能否接近 Go 应用的性能。


第二轮测试(Postgres + Memcached)

第二轮测试主要针对真实场景的改进,结果确实在真实用例中有显著提升。在这个测试中,应用程序需要:

  1. 解析请求体。
  2. 将记录插入到关系型数据库中。
  3. 将数据缓存到 Redis 或 Memcached 中。

如果你想改进你的 Python 应用程序,我建议对比两种实现,并查看仪表板上的性能差异。

在之前的基准测试中,FastAPI 只能达到 每秒 750 请求。在这次改进后,性能提升到了 每秒 2,500 请求。相比之前的测试,这是一个巨大的改进,但仍远不及 Go 应用。

在这次测试中,我们还测量了以下指标的延迟:

  • 数据库插入操作的延迟。
  • 保存数据到缓存的函数调用延迟。
  • 总体 POST 请求的延迟。

虽然 Python 表现比之前好了许多,但在性能上仍然远不及 Go 应用。这次测试中,我收到了很多 Pull Request,但这已经是目前的最佳性能了。我觉得需要尝试其他 Python 框架,寻找能够接近 Go 应用性能的解决方案。

未来,我将只测试 Python 框架,比如 DjangoFlaskFastAPI

接下来打开每个测试指标的图表:

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

  • FastAPI 最高达到了 每秒 2,600 请求,而 Go 达到了 每秒 20,000 请求
  • 在之前的测试中,Go 的性能受限于 Memcached 的连接数设置。这次测试中,我增加了闲置连接数限制,所以 Go 能够充分利用 CPU,达到更高的请求数。
  1. 总体 POST 请求延迟(Overall Latency for POST Requests)

  1. 数据库操作延迟(Database Operation Latency)

  1. 缓存延迟(Cache Latency)

  1. CPU 使用率(CPU Usage)

  1. Postgres 和 Memcached 的 CPU 使用率

  • 从图中可以看到,对于相同数量的数据库和缓存请求,缓存只需要很少的资源。因此,使用缓存不仅可以显著提高应用性能,还可以通过减少资源使用来降低基础设施成本。
  1. Postgres 连接池(Connection Pool)

  • 每个应用程序创建并维护了一个最大连接数为 500 的 Postgres 连接池。
  1. 内存使用(Memory Usage)


总结

我将继续寻找并测试更快的 Python 框架。如果你感兴趣,可以查看我其他的基准测试视频。感谢观看,我们下次见!

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

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

相关文章

DeepSeek与ChatGPT的优势对比:选择合适的工具来提升工作效率

选DeepSeek还是ChatGPT?这就像问火锅和披萨哪个香! "到底该用DeepSeek还是ChatGPT?” 这个问题最近在互联网圈吵翻天!其实这就跟选手机系统-样,安卓党iOS党都能说出一万条理由,但真正重要的是你拿它来干啥!&am…

Python爬虫第4节-请求库urllib的request模块使用

目录 前言:基本库urllib的使用 一、urlopen方法 二、Request类 三、高级用法 前言:基本库urllib的使用 开始学习爬虫时,第一步就是要模拟浏览器给服务器发送请求。这个时候,你可能会有很多问题:该从哪里开始做呢&a…

Vue3 Pinia Store使用示例

代码示例: import { defineStore } from "pinia"; // 导入 Pinia 的 defineStore 方法 import { ref } from "vue"; // 导入 Vue 的响应式 API ref import { type Menu } from "/interface"; // 导入自定义的 Menu 类型/…

JavaScript逆向魔法:Chrome开发者工具探秘之旅

在前端开发和安全研究领域,JavaScript逆向工程是一项关键技能。它涉及分析和理解代码的执行流程、数据结构和逻辑,以发现潜在的安全漏洞、提取核心算法或实现功能兼容。本文将结合Chrome开发者工具的调试功能,并通过具体示例帮助你更好地理解…

Qt基础:资源文件

资源文件 1. 资源文件2. 资源文件创建 1. 资源文件 资源文件顾名思义就是一个存储资源的文件,在Qt中引入资源文件好处在于他能提高应用程序的部署效率并且减少一些错误的发生。 在程序编译过程中, 添加到资源文件中的文件也会以二进制的形式被打包到可执…

Agent TARS与Manus的正面竞争

Agent TARS 是 Manus 的直接竞争对手,两者在 AI Agent 领域形成了显著的技术与生态对抗。 一、技术架构与功能定位的竞争 集成化架构 vs 模块化设计 Agent TARS 基于字节跳动的 UI-TARS 视觉语言模型,将视觉感知、推理、接地(grounding&#…

使用ssh连接上开发板

最后我发现了问题,我忘记指定用户名了,在mobaXterm上左上角打开会话,点击ssh,然后输入要连接的开发板主机的ip地址,关键在这里,要指定你要连接的开发板的系统中存在的用户,因为通过ssh连接一个设…

【性能优化点滴】odygrd/quill在编译期做了哪些优化

Quill 是一个高性能的 C 日志库,它在编译器层面进行了大量优化以确保极低的运行时开销。以下是 Quill 在编译器优化方面的关键技术和实现细节: 1. 编译时字符串解析与格式校验 Quill 在编译时完成格式字符串的解析和校验,避免运行时开销&…

【数据结构】排序算法(中篇)·处理大数据的精妙

前引:在进入本篇文章之前,我们经常在使用某个应用时,会出现【商品名称、最受欢迎、购买量】等等这些榜单,这里面就运用了我们的排序算法,作为刚学习数据结构的初学者,小编为各位完善了以下几种排序算法&…

混杂模式(Promiscuous Mode)与 Trunk 端口的区别详解

一、混杂模式(Promiscuous Mode) 1. 定义与工作原理 定义:混杂模式是网络接口的一种工作模式,允许接口接收通过其物理链路的所有数据包,而不仅是目标地址为本机的数据包。工作层级:OSI 数据链路层&#x…

大学生机器人比赛实战(一)综述篇

大学生机器人比赛实战 参加机器人比赛是大学生提升工程实践能力的绝佳机会。本指南将全面介绍如何从零开始准备华北五省机器人大赛、ROBOCAN、RoboMaster等主流机器人赛事,涵盖硬件设计、软件开发、算法实现和团队协作等关键知识。 一、比赛选择与准备策略 1.1 主…

【Linux】动静态库知识大梳理

亲爱的读者朋友们😃,此文开启知识盛宴与思想碰撞🎉。 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 在 Linux 系统编程中,动静态库是重要的组成部分&#xff0…

06-公寓租赁项目-后台管理-公寓管理篇

尚庭公寓项目/公寓管理模块 https://www.yuque.com/pkqzyh/qg2yge/5ba67653b51379d18df61b9c14c3e946 一、属性管理 属性管理页面包含公寓和房间各种可选的属性信息,其中包括房间的可选支付方式、房间的可选租期、房间的配套、公寓的配套等等。其所需接口如下 1.1…

Links for llama-cpp-python whl安装包下载地址

Links for llama-cpp-python whl安装包下载地址 Links for llama-cpp-python whl安装包下载地址 https://github.com/abetlen/llama-cpp-python/releases

为境外组织提供企业商业秘密犯法吗?

企业商业秘密百问百答之九十六:为境外组织提供企业商业秘密犯法吗? 在日常的对外交流中,企业若暗中为境外的机构、组织或人员窃取、刺探、收买或非法提供商业秘密,这种行为严重侵犯了商业秘密权利人的合法权益,更深远…

grep 命令详解(通俗版)

1. 基础概念 grep 是 Linux 下的文本搜索工具,核心功能是从文件或输入流中筛选出包含指定关键词的行。 它像“文本界的搜索引擎”,能快速定位关键信息,特别适合日志分析、代码排查等场景。 2. 基础语法 grep [选项] "搜索词" 文件…

JSVMP逆向实战:原理分析与破解思路详解

引言 在当今Web安全领域,JavaScript虚拟机保护(JSVMP)技术被广泛应用于前端代码的保护和反爬机制中。作为前端逆向工程师,掌握JSVMP逆向技术已成为必备技能。本文将深入剖析JSVMP的工作原理,并分享实用的逆向破解思路…

【youcans论文精读】弱监督深度检测网络(Weakly Supervised Deep Detection Networks)

欢迎关注『youcans论文精读』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans论文精读】弱监督深度检测网络 WSDDN 0. 弱监督检测的开山之作0.1 论文简介0.2 WSDNN 的步骤0.3 摘要 1. 引言2. 相关工作3. 方法3.1 预训练网络3.2 弱监督深度检测网络3.3 WSDDN训练3.4 空间…

基于Contiue来阅读open-r1中的GRPO训练代码

原创 快乐王子HP 快乐王子AI说 2025年04月03日 23:54 广东 前面安装了vscode[1]同时也安装了Coninue的相关插件[2],现在想用它们来阅读一下open-r1项目的代码[3]。 首先,从启动训练开始(以GRPO为例子) 第一步,使用TRL的vLLM后端…

JVM深入原理(六)(二):双亲委派机制

目录 6.5. 类加载器-双亲委派机制 6.5.1. 双亲委派机制-作用 6.5.2. 双亲委派机制-工作流程 6.5.3. 双亲委派机制-父加载器 6.5.4. 双亲委派机制-面试题 6.5.5. 双亲委派机制-代码主动加载一个类 6.6. 类加载器-打破双亲委派机制 6.6.1. 打破委派-ClassLoader原理 6.6.…