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

这是第二轮关于 ElixirGo 的对比测试。我收到了一份来自 Elixir 创作者的 Pull Request ,并且我认为有必要分享他所做的一些改进。他还表示,在 Kubernetes 环境下比较这两种语言是没问题的,我只需要为应用程序分配整个 VM(虚拟机)。因此,我使用了 Tolerations(容忍度)和 Affinity(亲和性)来实现这一点。


第一轮测试

在第一轮测试中,我们的目标是返回硬编码的对象给客户端,并测量 P90(90% 分位数)的延迟。同时,我们还会通过每秒请求数(Requests per Second,简称 RPS)的指标来衡量吞吐量,并记录以下关键数据:

  • CPU 使用率
  • 内存使用率
  • 可用性(错误率)
  • CPU 限流(Throttling)

由于我们会将这两个应用程序部署到 AWS 上的生产级 Kubernetes 集群,因此这些指标至关重要。这次 Pull Request 带来了一些改进,我建议你也可以与之前的基准测试进行对比。


第二轮测试

第二轮测试模拟了一个更接近实际应用场景的案例:

  • 当应用程序接收到 POST 请求时,它会解析请求体,并将记录插入到关系型数据库中,然后返回数据库生成的 ID 给客户端。
  • 除了前述的性能指标,我们还会额外测量:
    • 数据库操作的延迟(通过内部监测每个应用程序)
    • 数据库的 CPU 使用率(使用 Node Exporter 进行监测)
    • 应用程序创建的数据库连接池大小(使用 Postgres Prometheus Exporter 监测)

所有的基准测试都在 AWS 上运行。在本次测试中,我使用了一台 存储优化型 Graviton2 xlarge 实例 作为数据库服务器。不过,我认为未来可能需要升级它。此外,我还创建了一个 EKS 集群,其中:

  • 计算优化型节点 用于 PrometheusGrafana客户端 生成负载。
  • M7A Large 实例 用于运行应用程序,每个应用程序都部署在自己的 EC2 实例上。

AWS 并不便宜,为了支持我的频道,我提供 一对一咨询服务。如果你感兴趣,可以在视频描述中找到更多信息。


开始执行第一轮测试

整个测试持续 1.5 小时,但我会将其压缩到 1.5 分钟 的展示时间。此外,你可以在此处找到 完整的源代码。


第一轮测试结果

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

  • Elixir 处理了 20,000 RPS,比之前的基准测试提升了 2,000 RPS,可以看到一定的性能提升。
  • Go 预期达到了 60,000 RPS,依然领先。
2. 客户端延迟

  • Elixir 的延迟相比之前的基准测试略有降低,延迟越低越好
  • 但它仍然远远落后于 Go 的性能。
3. CPU 使用率

  • CPU 使用率越高,吞吐量越低,延迟越高,这并不意外。
  • Elixir 在这个测试中表现不如 Go,至少在这个特定的工作负载下。
4. 可用性(错误率)

  • 可用性 通过每秒错误数来衡量,错误数越低,代表系统越稳定。
  • 这个图表展示的是每秒错误数,错误数越高,代表可用性下降。
5. 内存使用情况

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 之前已经预料到,在 Go 崩溃之前,它的内存使用率会不断上升
6. CPU 限流(CPU Throttling)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • ElixirCPU Throttling 现象更严重,因为它更早达到 CPU 使用率的上限,相比之下 Go 应用程序的 CPU 资源管理更高效。

这一轮静态测试的结果可以作为后续测试的基准。


开始执行第二轮测试

这轮测试的展示时间同样压缩到了 1.5 分钟


第二轮测试结果

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

  • 这次测试中,相较于之前的基准测试,并没有明显的提升,甚至可以说有轻微的下降
  • Go 在两次测试中都稳定在 22,000 RPS
2. POST 请求延迟

  • Elixir 的延迟相比之前的测试有所降低,表现略有提升,但仍然不及 Go
3. 数据库插入延迟

  • 大部分请求的延迟都来自数据库操作,这在预期之内。
  • 我按照建议创建了 4 个数据库连接池,每个池有 125 个连接
4. CPU 使用率

  • 这里没有太多意外的发现。
  • 未来我可能需要增加数据库连接池的大小,以便让 CPU 资源利用率达到更高水平。
  • 数据库连接池大小网络 I/O 通常是瓶颈,连接数越多,吞吐量越大。但同时,也需要监控数据库本身的健康状况,确保它不会成为新的瓶颈。
5. 可用性

  • 这次测试中,我将超时时间增加到 5 秒,因此没有看到错误
6. PostgreSQL 数据库的 CPU 使用

  • 上一次测试 使用的是 AMD 处理器,这次测试采用的是 Graviton4 第四代处理器
7. 数据库连接池大小

  • Elixir 应用在启动时会立即创建 500 个数据库连接
  • Go 则会根据负载逐步增加连接数
  • 我认为未来可能需要将连接数增加至 1,000,以进一步优化性能。
  • 值得一提的是,Amazon RDS 默认的最大连接数是 5,000,所以应该不会有太大问题。
8. 内存使用情况

  • 如果你有更好的优化方案,欢迎提交 Pull Request
  • 我总是愿意承认自己的错误,并在合理的情况下重新运行测试

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

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

相关文章

接口自动化 ——fixture allure

一.参数化实现数据驱动 上一篇介绍了参数化,这篇 说说用参数化实现数据驱动。在有很多测试用例的时候,可以将测试用例都存储在文件里,进行读写调用。本篇主要介绍 csv 文件和 json 文件。 1.读取 csv 文件数据 首先创建 csv 文件&#xff…

`peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么

peft(Parameter-Efficient Fine-Tuning:高效微调)是什么 peft库是Hugging Face推出的用于高效参数微调的库,它能在不调整模型全部参数的情况下,以较少的可训练参数对预训练模型进行微调,从而显著降低计算资源需求和微调成本。以下从核心功能、优势、常见微调方法、使用场…

编程常见错误归类

上一篇讲了调试&#xff0c;今天通过一个举例回忆一下上一篇内容吧&#xff01; 1. 回顾&#xff1a;调试举例 在VS2022、X86、Debug的环境下&#xff0c;编译器不做任何优化的话&#xff0c;下⾯代码执⾏的结果是啥&#xff1f; #include <stdio.h> int main() {int …

在windows上交叉编译opencv供RK3588使用

环境 NDK r27、RK3588 安卓板子、Android 12 步骤操作要点1. NDK 下载选择 r27 版本&#xff0c;解压到无空格路径&#xff08;如 C:/ndk&#xff09;2. 环境变量配置添加 ANDROID_NDK_ROOT 和工具链路径到系统 PATH3. CMake 参数调整指定 ANDROID_NATIVE_API_LEVEL31、ANDRO…

浅析MySQL事务锁

在 MySQL 中,事务锁是用于确保数据一致性和并发控制的重要机制。事务锁可以帮助防止多个事务同时修改同一数据,从而避免数据不一致和脏读、不可重复读、幻读等问题。 以下是 MySQL 事务锁的关键点总结: 事务锁:用于确保数据一致性和并发控制。锁的类型: 行级锁:InnoDB,粒…

vue3 文件下载(excel/rar/zip)

安装axios npm install axios 在项目中引入 import axios from axios; 1、get接口excel文件下载 const file_key ref() const downLoadExcel (value:any) > {//file_key.value value axios({method: "get",url: "/api/da/download_excel/",//url:…

RT-Thread RTThread studio 初使用

RT-Thread Studio 下载 https://www.rt-thread.org/studio.html 安装使用 https://bbs.elecfans.com/jishu_2425653_1_1.html 4 编译问题解决 问题一&#xff1a;error: unknown type name clock_t 具体的类型值是在sys/_types.h中定义的&#xff0c;需要包含sys/_types.h 这个…

汉诺塔专题:P1760 通天之汉诺塔 题解 + Problem D: 汉诺塔 题解

1. P1760 通天之汉诺塔 题解 题目背景 直达通天路小A历险记第四篇 题目描述 在你的帮助下&#xff0c;小 A 成功收集到了宝贵的数据&#xff0c;他终于来到了传说中连接通天路的通天山。但是这距离通天路仍然有一段距离&#xff0c;但是小 A 突然发现他没有地图&#xff0…

探索 HumanoidBench:类人机器人学习的新平台

在科技飞速发展的当下&#xff0c;类人机器人逐渐走进我们的视野&#xff0c;它们有着和人类相似的外形&#xff0c;看起来能像人类一样在各种环境里完成复杂任务&#xff0c;潜力巨大。但实际上&#xff0c;让类人机器人真正发挥出实力&#xff0c;还面临着重重挑战。 这篇文…

数据结构中的宝藏秘籍之广义表

广义表&#xff0c;也被称作列表&#xff08;Lists&#xff09;&#xff0c;是一种递归的数据结构。它就像一个神秘的盒子&#xff0c;既可以装着单个元素&#xff08;原子&#xff09;&#xff0c;也可以嵌套着其他的盒子&#xff08;子列表&#xff09;。比如广义表 (a (b c)…

【jenkins】首次配置jenkins

第一步&#xff0c;输入管理员密码 cat /var/jenkins_home/secrets/initialAdminPassword第二步&#xff0c;点击安装推荐的插件 第三步&#xff0c;创建管理员用户 第四步&#xff0c;返回实例 第五步&#xff0c; 升级jenkins 第六步&#xff0c; 修复提示 第七步&#xff0c…

Android studio—socketIO库return与emit的使用

文章目录 一、Socket.IO库简单使用说明1. 后端 Flask Flask-SocketIO2. Android 客户端集成 Socket.IO3. 布局文件注意事项 二、接受服务器消息的二种方法1. 客户端接收通过 emit 发送的消息功能使用场景后端代码&#xff08;Flask-SocketIO&#xff09;客户端代码&#xff08…

用Prompt 技术【提示词】打造自己的大语言智能体

机器如何按照人类的指令执行任务的探索 机器需具备理解任务叙述的能力&#xff0c;以便能够按照人类的指令执行任务&#xff0c;为机器提供一些范例作为参考&#xff0c;使其能够理解该执行的任务类型。这样的学习方式称为“Instruction learning”&#xff0c;透过精心设计的…

Node.js 数据库 事务 项目示例

1、参考&#xff1a;JavaScript语言的事务管理_js 函数 事务性-CSDN博客 或者百度搜索&#xff1a;Nodejs控制事务&#xff0c; 2、实践 2.1、对于MySQL或MariaDB&#xff0c;你可以使用mysql或mysql2库&#xff0c;并结合Promise或async/await语法来控制事务。 使用 mysql2…

【Mamba】MambaVision论文阅读

文章目录 MambaVision一、研究背景&#xff08;一&#xff09;Transformer vs Mamba​&#xff08;二&#xff09;Mamba in CV​ 二、相关工作​&#xff08;一&#xff09;Transformer 在计算机视觉领域的进展​&#xff08;二&#xff09;Mamba 在计算机视觉领域的探索​ 三、…

前端面试宝典---原型链

引言----感谢大佬的讲解 大佬链接 原型链示意图 原型链问题中需要记住一句话&#xff1a;一切变量和函数都可以并且只能通过__proto__去找它所在原型链上的属性与方法 原型链需要注意的点 看上图可以发现 函数&#xff08;构造函数&#xff09;也可以通过__proto__去找到原…

C语言---FILE结构体

一、FILE 结构体的本质与定义 基本概念 FILE 是 C 语言标准库中用于封装文件操作的结构体类型&#xff0c;定义于 <stdio.h> 中。它代表一个“文件流”&#xff0c;可以是磁盘文件、标准输入输出&#xff08;stdin/stdout/stderr&#xff09;或其他输入输出设备。 实现特…

基于大模型的直肠息肉诊疗全流程风险预测与方案优化研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型技术概述 2.1 大模型原理简介 2.2 大模型在医疗领域应用现状 三、直肠息肉术前预测与准备 3.1 基于大模型的术前风险预测 3.1.1 息肉性质预测 3.1.2 手术难度预测 3.2 基于预测结果的术前准备 3.…

华为OD机试真题——MELON的难题(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《MELON的…

AI数据分析与BI可视化结合:解锁企业决策新境界

大家好&#xff0c;今天我们来聊聊一个前沿而热门的话题——AI数据分析与BI可视化结合&#xff0c;如何携手推动企业决策迈向新高度。在数据爆炸的时代&#xff0c;企业如何高效利用这些数据&#xff0c;成为制胜的关键。AI数据分析与BI可视化的结合&#xff0c;正是解锁这一潜…