性能比拼: Go(Gin) vs Python(Flask)

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


在本视频中,我们将比较 Golang 和 Python 的性能。

但我们不会采用纯粹的算法方法,而是使用真实场景的例子。我们将构建两个简单的 REST 应用程序,不使用像 Fiber 这样的最快库,而是使用当前最流行的库。其他在代码中使用的库也是如此,无论是官方库,比如 Prometheus 客户端,还是最受欢迎的第三方库。

接下来,我们将比较每个应用程序的 CPU 使用情况,然后比较内存使用情况。最重要的是,我们将比较每个请求的延迟,并从客户端侧进行测量,这比仅仅对应用程序进行监测更准确。我们将在两个测试中分别测量每秒请求数。

在第二个测试中,我们将测量 Python 和 Golang 从 S3 存储桶中下载一张图片所花费的时间。最后,我们将测量将最后修改日期存储到 Postgres 数据库中所需的平均延迟。

此外,我还将向您展示如何使用 OpenTelemetry 对 Python 和 Golang 应用进行监控,并在本地通过 Grafana 可视化追踪信息,无需使用任何外部服务。

例如,从这个追踪信息中你可以看到,整个请求大约耗时 7 毫秒,其中有 5 毫秒用于从 S3 下载图片,1.5 毫秒用于将图片元数据存储到 Postgres 数据库中。Python 应用也有相同的追踪可显示。

源代码已发布在我的 GitHub 公共仓库中。我将在下一期视频中做一个逐步教程,演示如何使用 OpenTelemetry 项目对 Python 应用进行追踪并暴露指标。

为了运行这些测试,我使用了一个拥有 8 核处理器和 64GB 内存的 VMware。我使用 kubeadm 工具安装了最新版的 Kubernetes,并额外创建了一个专用 VM 用于 Postgres 数据库。所有这些虚拟机都有 2 个虚拟 CPU 和 4GB 内存,除了 Postgres,它有 4 个 CPU 和 8GB 内存。

现在,我来解释一下测试配置。

在第一个测试中,我们会将这两个应用部署到 Kubernetes 中。为了运行测试,我们将使用一个客户端应用,它将作为 Kubernetes Job 部署,用于生成流量。

首先,我们将使用 /api/devices 端点,它返回一个硬编码的设备数组。因此,第一个测试将纯粹比较 Python Flask 应用和 Golang Gin 应用。

然后,每个客户端都在 /metrics 端点暴露 Prometheus 指标,我们将使用 Prometheus 来抓取它们的数据。通过这些数据,我们可以在 Grafana 仪表盘中可视化请求时长。

我们将使用 summary 类型的 Prometheus 指标来自动生成百分位数指标。

顺便提醒一下,如果您的应用是水平扩展的,您无法跨实例聚合 summary 类型的指标,这种情况下需要使用带有硬编码桶的 histogram 类型。

在第二个测试中,我们将使用相同的应用,但使用的是 /api/images 端点。当客户端访问该端点时,每个应用将从 S3 存储桶中下载一张图片。我将使用 MinIO,它是一个兼容 S3 的对象存储系统。

应用下载图片后,将提取其最后修改日期,并将其保存在 Postgres 数据库中。

在这个示例中,我们还将从应用本身暴露用于测量 S3 和 Postgres 请求延迟的指标。

此外,我们会使用 OpenTelemetry 创建追踪数据,并通过 OTLP 协议将其导出到同样部署在 Kubernetes 中的 Tempo。然后我们将使用 Grafana 中的数据源 Tempo 来查询追踪数据。

这就是本视频的整个配置过程。

为了部署所有这些开源组件,如 Grafana、Prometheus、Tempo 和 MinIO,我使用了 Terraform 结合 Helm 和 kubectl 提供器。

你也可以在 GitHub 仓库中找到 Golang 应用、Python 应用和客户端。视频中用到的所有内容都包含在该仓库中,我还会在 README 文件中添加一些命令。


好了,我们开始运行第一个测试。

我们将逐渐增加请求数量,直到每个应用达到大约每秒 400 个请求。

一开始你就可以注意到,Python 应用的内存使用明显更高。

顺便说一下,我对两个应用设置了相同的请求和限制:512MB 内存和 2 个核心的限制。

同样的情况也出现在 CPU 使用上,Python Flask 应用使用了更多的 CPU。

但最重要的是,Python 的延迟几乎是 Golang 应用的 4 倍,Python 大约是 4 到 5 毫秒,而 Golang 是 1 毫秒左右。

提醒一下,这些测试都是在同一台服务器上运行的,因此请求中没有网络延迟。

好了,我将这个测试再运行几秒钟。整个测试大约花了 20 分钟。

接下来,我会停止客户端并重置 Prometheus。


接下来运行第二个测试,我们将从 S3 下载图片并将数据存储到 Postgres。

在这个测试中,我只向每个应用发送大约 20 个并发请求。

你可以看到内存使用基本不变。CPU 使用在这样的低负载下也差不多。

但我们从客户端侧测得的总延迟,Python 依然明显更高,大约为 20 到 25 毫秒,而 Golang 为 10 到 12 毫秒。

你还可以注意到,S3 下载函数的平均延迟差不多,但将数据保存到数据库的时间几乎少了一半。

我也会将这个测试再运行几秒钟。

现在,用 Python 开发应用更加容易,尤其是在你需要快速创建一个概念验证项目时。你完全可以使用 Python。

Python 广泛用于大数据和机器学习领域,如果这是你的使用场景,你当然继续使用 Python。

但如果你需要实现更低的延迟和更高的效率,尤其是服务端应用,Golang 会是更好的选择。

Rust 的效率更高,但它还未完全成熟,而且开发和维护都更困难。

如果你喜欢这类基准测试,我还有一个播放列表,比较不同语言和开源项目。

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

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

相关文章

Android版本更新服务通知下载实现

在日常开发中,我们肯定会有检查版本更新的需求,那我版本更新的轮子网上也是有的,想自己实现一下代码如下: 下载管理类: public class DownLoadManager {private static final String MAIN "main"; //Tagp…

UE5学习笔记 FPS游戏制作33 换子弹 动画事件

新建动画蒙太奇 为Rifle和Launcher各自新建一个动画蒙太奇,拖入动画,注意动画的轨道要和动画蓝图里的一致 在蒙太奇添加动画事件 在通知一栏新增一个轨道,右键轨道,新增一个 换枪完成 通知,不同动画的同名通知需要…

uniapp中uploadFile的用法

基本语法 uni.uploadFile(OBJECT)OBJECT 是一个包含上传相关配置的对象,常见参数如下: 参数类型必填说明urlString是开发者服务器地址。filePathString是要上传文件资源的本地路径。nameString是文件对应的 key,开发者在服务端可以通过这个 …

Android设计模式之责任链模式

一、定义: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系将这些对象连城一条链,并沿着这条链传递该请求,只到有对象处理它为止。 二、模式结构: 抽象处理者(Handler&#xff…

Oracle数据库数据编程SQL<3.3 PL/SQL 游标>

游标(Cursor)是Oracle数据库中用于处理查询结果集的重要机制,它允许开发者逐行处理SQL语句返回的数据。 目录 一、游标基本概念 1. 游标定义 2. 游标分类 二、静态游标 (一)显式游标 【一】不带参数,普通的显示游标 1. 显式…

逗万DareWorks|创意重构书写美学,引领新潮无界的文创革命

当传统文具陷入同质化泥潭时,逗万DareWorks品牌犹如一颗璀璨的明星,以其独特的创意理念和卓越的产品品质,迅速赢得了广大消费者的青睐。 逗万DareWorks隶属于东莞司贸文教赠品有限公司,后者深耕制笔行业45年,占地4.6万…

写Prompt的技巧和基本原则

一.基本原则 1.一定要描述清晰你需要大模型做的事情,不要模棱两可 2.告诉大模型需要它做什么,不需要做什么 改写前: 请帮我推荐一些电影 改写后: 请帮我推荐2025年新出的10部评分比较高的喜剧电影,不要问我个人喜好等其他问题&#xff…

【React】基于 React+Tailwind 的 EmojiPicker 选择器组件

1.背景 React 写一个 EmojiPicker 组件,基于 emoji-mart 组件二次封装。支持添加自定义背景 、Emoji 图标选择!并在页面上展示! 2.技术栈 emoji-mart/data 、emoji-mart : emoji 图标库、元数据 tailwindcss: 原子化 CSS 样式库 antd : 组…

Qt中绘制不规则控件

在Qt中绘制不规则控件可通过设置遮罩(Mask)实现。以下是详细步骤: ‌继承目标控件‌:如QPushButton或QWidget。‌重写resizeEvent‌:当控件大小变化时,更新遮罩形状。‌创建遮罩区域‌:使用QRegion或QPain…

Parallel_Scheduling_of_DAGs_under_Memory_Constraints论文阅读

内存约束下的 DAG 并行调度 点击阅读原文语雀链接更清晰 摘要 科学工作流通常被建模为任务的有向无环图(DAG),这些任务代表计算模块及其依赖关系,依赖关系表现为任务生成的数据被其他任务使用。这种形式化方法允许使用运行时系统&…

探索MVC、MVP、MVVM和DDD架构在不同编程语言中的实现差异

MVC与MVP/MVVM/DDD架构对比,不同语言实现 MVC 分层架构设计概述 模型-视图-控制器(Model-View-Controller,简称 MVC)是一种经典软件架构设计,通过分层解耦,使得系统结构清晰和易于维护,具有良…

一文读懂 UML:基础概念与体系框架

UML 图是一种标准化的建模语言,在软件开发和系统设计等领域有着广泛的应用。以下是对 UML 图各类图的详细介绍: 1.用例图 定义:用例图是从用户角度描述系统功能的模型图,展现了系统的参与者与用例之间的关系。作用:帮…

Spring 及 Spring Boot 条件化注解(15个)完整列表及示例

Spring 及 Spring Boot 条件化注解完整列表及示例 1. 所有条件化注解列表 Spring 和 Spring Boot 提供了以下条件化注解(共 15 个),用于在配置类或方法上实现条件化注册 Bean 或配置: 注解名称作用来源框架Conditional自定义条件…

【Kafka】深入探讨 Kafka 如何保证一致性

文章目录 Kafka 基本概念回顾​副本角色​ 数据写入一致性​同步副本(ISR)集合​数据读取一致性​故障处理与一致性恢复​总结​ 在分布式系统领域,数据一致性是至关重要的一环。作为一款高性能的分布式消息队列系统,Kafka 在设计…

从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!

引言:为什么SQL注入攻击依然如此强大? SQL注入(SQL Injection)是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施,但SQL注入依然在许多情况下能够突破防线&#…

【算法day27】有效的数独——请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

36. 有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例…

leetcode 2360. 图中的最长环 困难

给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多 有一条出边。 图用一个大小为 n 下标从 0 开始的数组 edges 表示,节点 i 到节点 edges[i] 之间有一条有向边。如果节点 i 没有出边,那么 edges[i] -1 。…

PySpur: AI 智能体可视化开发平台

GitHub:https://github.com/PySpur-Dev/pyspur 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI PySpur是一个开源的轻量级可视化AI智能体工作流构建器,旨在简化AI系统的开发流程。通过拖拽式界面,用户…

vcpkg安装及使用教程,以安装matio库解析mat文件为例

vcpkg安装及使用教程,以安装matio库解析mat文件为例 1. vcpkg安装2 安装matio三方库3 将三方库集成到VS中3.1 全局集成3.2 集成到特定工程4 结语Vcpkg 是微软开发的一款开源的 C/C++ 包管理工具,旨在简化 C/C++ 项目依赖库的安装和管理。它支持跨平台(Windows、Linux、macO…

LLM架构解析:NLP基础(第一部分)—— 模型、核心技术与发展历程全解析

本专栏深入探究从循环神经网络(RNN)到Transformer等自然语言处理(NLP)模型的架构,以及基于这些模型构建的应用程序。 本系列文章内容: NLP自然语言处理基础(本文)词嵌入&#xff0…