性能比拼: Elixir vs Go(第二轮)

news2025/4/23 22:02:18

本内容是对知名性能评测博主 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.coloradmin.cn/o/2341056.html

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

相关文章

【数字图像处理】立体视觉信息提取

双目立体视觉原理 设一个为参考平面,一个为目标平面。增加了一个摄像头后,P与Q在目标面T上有分别的成像点 双目立体视觉:从两个不同的位置观察同一物体,用三角测量原理计算摄像机到该物体的距离的 方法 原理:三角测量…

【漏洞复现】Struts2系列

【漏洞复现】Struts2系列 1. 了解Struts21. Struts2 S2-061 RCE (CVE-2020-17530)1. 漏洞描述2. 影响版本3. 复现过程 1. 了解Struts2 Apache Struts2是一个基于MVC设计模式的Web应用框架,会对某些标签属性(比如 id)的…

Sentinel源码—5.FlowSlot借鉴Guava的限流算法二

大纲 1.Guava提供的RateLimiter限流使用示例 2.Guava提供的RateLimiter简介与设计 3.继承RateLimiter的SmoothBursty源码 4.继承RateLimiter的SmoothWarmingUp源码 3.继承RateLimiter的SmoothBursty源码 (1)SmoothBursty的初始化流程 (2)SmoothBursty的初始化完成后的变量…

重构未来智能:Anthropic 解码Agent设计哲学三重奏

第一章 智能体进化论:从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…

Gradle与Idea整合

文章目录 1. Groovy 简介2. Groovy 安装[非必须]3. 在idea中创建java工程 1. Groovy 简介 在某种程度上,Groovy可以被视为Java的一种脚本化改良版,Groovy也是运行在JVM上,它可以很好地与Java代码及其相关库进行交互操作。它是一种成熟的面向对象编程语言…

基于springboot+vue的校园二手物品交易平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

OpenCV图像上加数字水印示例

OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 14.1 基本概念 当今,生成式人工智能(Artificial Intelligence Generated Content,AIGC)的火爆引燃了数字水印,说实话数字水印并不是一项新的技术&…

Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术

1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…

Day-1 漏洞攻击实战

实训任务1 漏洞攻击实战一 使用 御剑 得到网站后台地址 数据库登录与日志配置​​ 使用默认密码 root:root 登录phpMyAdmin,执行 SHOW VARIABLES LIKE general% 查看日志状态。 开启日志功能:set global general_log "ON";(配图&…

AOSP Android14 Launcher3——RecentsView最近任务数据加载

最近任务是Launcher中的一个重要的功能,显示用户最近使用的应用,并可以快速切换到其中的应用;用户可以通过底部上滑停顿进入最近任务,也可以在第三方应用底部上滑进最近任务。 这两种场景之前的博客也介绍过,本文就不…

基于深度学习的校园食堂菜品智能结算系统

校园食堂菜品智能结算系统说明文档 1. 系统概述 本系统是一款基于YOLO深度学习算法的校园食堂菜品智能结算平台,旨在通过计算机视觉技术实现食堂菜品的自动识别与结算,提高结算效率,减少人工成本,优化用户体验。系统采用PyQt5框…

【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass

从 HBuilderX 4.56 ,vue2 项目也将默认使用 dart-sass 预编译器。 vue2开发者sass预处理注意: sass的预处理器,早年使用node-sass,也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。node-sass已经停维很久了。 另…

AI 硬件定制:开启智能新时代的钥匙

AI 硬件定制:开启智能新时代的钥匙 在科技飞速发展的当下,人工智能(AI)已不再是遥不可及的概念,它正以惊人的速度融入我们生活的方方面面。从智能手机中的语音助手,到工厂里的自动化生产线,AI 的身影无处不在。而在这股 AI 浪潮中,AI 硬件定制正逐渐崭露头角,成为推动…

SpringBoot中配置文件的加载顺序

下面的优先级由高到低 命令行参数java系统属性java系统环境变量外部config文件夹的application-{profile}.ym文件外部的application-{profile}.ym文件内部config文件夹的application-{profile}.ym文件内部的application-{profile}.ym文件外部config文件夹的application.ym文件外…

hooker frida版just_trust_me.js 2025升级 支持boringssl unpinning

曾几何时,我翻版了 Xposed 的 just_trust_me.apk, just_trust_me.js 脚本仿佛是一张通行证,让我们在 SSL Pinning 的高墙前轻松穿越。 但时代变了。BoringSSL、Cronet、静态 inline hook、动态 verify callback……一切都变得更加隐蔽和棘手…

React Article模块

实现基础文章发布 安装富文本编辑器 使用useEffect钩子函数获取到channelList,对channelList函数进行一个遍历 渲染到option 实现表单校验 1给Form组件绑定onFinish()函数 拼接表单数据 上传封面 onChange函数获得的参数

机器学习第二篇 多变量线性回归

数据集:世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom,来预测幸福指数得分。 文件一:linear,…

C语言对n进制的处理

先看一道题目: 从键盘获取一个正整数,如果把它转为16进制的数字,那么它是一个几位数呢?如果把它转为28进制又是一个几位数呢? 在讲这个题目之前,我们先要了解进制转换 什么是进制转换? 简单来说,进制就是数位的表示方法。 十进制(常用&am…

Ubuntu数据连接访问崩溃问题

目录 一、分析问题 1、崩溃问题本地调试gdb调试: 二、解决问题 1. 停止 MySQL 服务 2. 卸载 MySQL 相关包 3. 删除 MySQL 数据目录 4. 清理依赖和缓存 5.重新安装mysql数据库 6.创建程序需要的数据库 三、验证 1、动态库更新了 2、头文件更新了 3、重新…

Spark-Streaming简介和核心编程

Spark-Streaming简介 概述:用于流式数据处理,支持Kafka、Flume等多种数据输入源,可使用Spark原语运算,结果能保存到HDFS、数据库等。它以DStream(离散化流)为抽象表示,是RDD在实时场景的封装&am…