Rust主流框架性能比拼: Actix vs Axum vs Rocket

news2025/4/19 1:10:05

本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准


在以下中,我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序部署到 Kubernetes,并使用 Prometheus 和 Grafana 进行监控。

我们将测量每个应用程序的 CPU 使用率,相对于 Kubernetes 部署中设定的限制。同时,我们也会测量内存使用情况,相对于其设定的限制。当然,你也可以测量实际数值,比如应用程序使用了多少 MB 或 GB 的内存,但基于使用率百分比阈值设定告警会更加简单。

此外,我们还会测量每个应用程序可以处理的请求数量,最重要的是客户端延迟---即处理每个请求所需的时间。我们将使用 p99 百分位 进行测量(我在另一个视频里详细解释了百分位的概念)。

我们还会测量应用程序的 可用性,计算方式为:成功请求数 ÷ 总请求数 × 100。最后,由于这些应用程序运行在 Kubernetes 中,我们还需要测量 CPU 限制节流(CPU Throttling)

为了进行测试,我在 AWS 上创建了一个 生产级的 EKS 集群。如果你感兴趣,我的频道里有完整的教程,教你如何搭建。我使用了最新的 m7a.8xlarge 实例,每个应用程序只获取一部分可用的 CPU 和内存,其余资源则用于其他基础设施和用于生成负载的客户端。


代码概览

每个应用程序都包含一个 /api/devices 端点,返回 JSON 格式的数据给客户端。你可以在我的 GitHub 公开仓库 中找到源代码。如果你有任何改进建议,欢迎提供意见或提交 Pull Request!如果某些更改确实带来了影响,我会更新视频并展示新的测试结果。

所有应用程序都使用了 Rust 的 标准优化,并以 release 选项构建。此外,我使用了 distroless Debian 镜像来构建 Docker 镜像。

如果你感兴趣,以下是最终的镜像大小。我们可以使用 UPX 进一步压缩,就像我对 Go 语言的镜像所做的那样,使其减少到 3-4 MB。不过,在这次测试中,镜像大小并不会影响性能表现,因此不作进一步优化。


测试过程

现在,我们将所有三个应用程序部署到 Kubernetes,并让它们在 空闲状态 下运行 15 分钟。你会发现,各个框架的 CPU 使用率 存在一些轻微差异,但非常小,几乎可以忽略不计。另一方面,内存使用情况 也很小,但你可能会注意到不同的行为模式:

  • Axum 的内存使用较为平稳;
  • ActixRocket 则会出现 短暂的内存尖峰

接下来,我们开始 测试,并部署 Kubernetes Jobs 来生成负载。整个测试持续了约 1.5 小时,但我在视频中将其缩短至几分钟。最后,我们会查看整个测试过程中的各项 监控图表

我们将 每 3 分钟 增加 1000 个请求/秒,持续增加,直到这些应用程序开始 无法承受负载


初步结果

在测试初期,负载较小,此时最重要的指标是 客户端延迟。你会发现:

  • Rocket 框架 的延迟 从一开始就最高,并且 CPU 使用率 也高于其他框架;
  • 然而,其内存使用保持稳定,因为 Rust 没有垃圾回收(Garbage Collection),并且测试时只返回了 硬编码的 JSON 数据,并未占用太多内存。
  • Actix 和 AxumCPU 和延迟方面表现相似

此时,测试负载仅为最大可承受负载的 20%,因此我们可以得出结论:在低负载下,Actix 和 Axum 的性能几乎相同。但在实际应用中,我们希望测试所有可能的场景,包括让应用程序承受 极限负载

为了确保测试结果的稳定性,我在不同的 EC2 实例上多次运行了测试,结果始终一致。


增加负载后的结果

当负载达到 30%(仍属于轻负载)时,我们开始看到明显的区别:

  • Actix 的延迟最低,其次是 AxumRocket 依然是最慢的
  • 随着负载增加,Actix 和 Axum 之间的差距逐渐扩大,不仅表现在 延迟,还体现在 CPU 使用率 上(尽管差距较小,但可以观察到)。

此时,平均请求处理时间仅为 100-200 微秒(注意,不是毫秒)。我将 客户端超时时间 设为 200 毫秒,当请求超时时,客户端会收到 408 状态码,这会影响应用的 可用性

需要注意的是,应用程序崩溃的原因并不一定是 CPU 或内存达到 100% 使用率。应用程序可能会因 响应过慢、无法处理请求 而导致客户端超时。此外,Kubernetes 的健康检查(Readiness Probes) 也可能超时,导致应用被移出 服务池(Service Pool)

在本次测试中,我们认为 可用性下降 并且 应用无法在 200 毫秒内处理请求,即视为 测试失败


推至极限负载

在负载增加到 27,000 请求/秒 时,所有应用程序都开始 出现失败。因此,我们可以认为 最大可承受的负载大约为 26,000 请求/秒,之后响应时间会 急剧恶化,应用将被移出服务池。

尽管三者的 延迟表现不同,但它们 几乎在同一时间开始崩溃。不过,在整个过程中:

  • Actix 的延迟始终是最低的


数据分析

接下来,我们查看各项图表:

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

  1. 内存使用情况(Memory Usage)
    • 当应用开始变慢,需要存储更多 待处理请求 时,内存使用出现尖峰

  1. CPU 使用率(CPU Usage)
    • Rocket 使用的 CPU 最高Actix 的 CPU 使用率最低

  1. 可用性(Availability)
    • 虽然所有应用几乎在同一时间开始失败,但 Actix 的可用性更高,即:它在 更低的延迟下处理了更多请求
    • 下次测试时,我会 减少负载递增的幅度,看看哪一个框架能处理更多请求。

  1. 客户端延迟(Client Latency)
    • 在测试后期,我们看到了一些延迟 尖峰,但它们并不是最重要的部分。
    • 在应用程序仍然健康的阶段,Actix 的延迟最低,并且是最后一个失败的框架。

  1. CPU 限制节流(CPU Throttling)

    • 没有任何应用程序达到 100% CPU 使用率,因此没有发生 CPU 限制节流

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

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

相关文章

【QT】QT的消息盒子和对话框(自定义对话框)

QT的消息盒子和对话框(自定义对话框) 一、消息盒子QMessageBox1、弹出警告盒子示例代码:现象: 2、致命错误盒子示例代码:现象: 3、帮助盒子示例代码:现象: 4、示例代码: …

【结合vue源码,分析vue2及vue3的数据绑定实现原理】

结合vue源码,分析vue2及vue3的数据绑定实现原理 Vue 2 数据绑定实现整体思路详细实现1. Observer 类:数据劫持2. Dep 类:依赖收集3. Watcher 类:订阅者 Vue 3 数据绑定实现整体思路详细实现1. reactive 函数:创建响应式…

如何实现H5端对接钉钉登录并优雅扩展其他平台

如何实现H5端对接钉钉登录并优雅扩展其他平台 钉钉H5登录逻辑后端代码如何实现?本次采用策略模式工厂方式进行定义接口确定会使用的基本鉴权步骤具体逻辑类进行实现采用注册表模式(Registry Pattern)抽象工厂进行基本逻辑定义具体工厂进行对接…

LabVIEW真空度监测与控制系统

开发了一种基于LabVIEW的真空度信号采集与管理系统,该系统通过图形化编程语言实现了真空度的高精度测量和控制。利用LabVIEW的强大功能,研制了相应的硬件并设计了完整的软件解决方案,以满足工业应用中对真空度监测的精确要求。 项目背景 随着…

虚拟dom工作原理以及渲染过程

浏览器渲染引擎工作流程都差不多,大致分为5步,创建DOM树——创建StyleRules——创建Render树——布局Layout——绘制Painting 第一步,用HTML分析器,分析HTML元素,构建一颗DOM树(标记化和树构建)。 第二步,用…

数据采集爬虫三要素:User-Agent、随机延迟、代理ip

做爬虫的朋友都懂:你刚打开一个页面,还没来得及发第二个请求,服务器已经把你当成了“可疑流量”。403、429、验证码、JS挑战……这些“欢迎仪式”你是不是也经常收到?防爬策略越来越猛,采集工程师越来越秃。 但别慌&am…

汽车的四大工艺

文章目录 冲压工艺核心流程关键技术 焊接工艺核心流程 涂装工艺核心流程 总装工艺核心流程终检与测试静态检查动态检查四轮定位制动转鼓测试淋雨测试总结 简单总结下汽车的四大工艺(从网上找了一张图,感觉挺全面的)。 冲压工艺 将金属板材通过…

【JVM是什么?JVM解决什么问题?JVM在JDK体系中是什么?虚拟机和JVM、操作系统是什么关系?】

1. JVM 是什么? JVM(Java Virtual Machine,Java 虚拟机) 是一个虚拟的计算机程序,它是 Java 程序运行的核心环境。JVM 的主要职责是加载、验证、解释或编译 Java 字节码(.class 文件)&#xff…

10-MySQL-性能优化思路

1、优化思路 当我们发现了一个慢SQL的问题的时候,需要做性能优化,一般我们是为了提高SQL查询更快,一个查询的流程由下图的各环节组成,每个环节都会消耗时间,要减少消耗时候需要从各个环节都分析一遍。 2 连接配置优化 第一个环节是客户端连接到服务端,这块可能会出现服务…

MySQL学习笔记十

第十二章汇总数据 12.1聚集函数 聚集函数运行在行组上,计算和返回单个值。 12.1.1AVG()函数 输入: SELECT AVG(prod_price) AS avg_price FROM products; 输出: 说明:AVG()函数通过对表中行数计数并计算特定列值之和&#…

Redis快的原因

1、基于内存实现 Redis将所有数据存储在内存中,因此它可以非常快速地读取和写入数据,而无需像传统数据库那样将数据从磁盘读取和写入磁盘,这样也就不受I/O限制。 2、I/O多路复用 多路指的是多个socket连接;复用指的是复用一个线…

如何在React中集成 PDF.js?构建支持打印下载的PDF阅读器详解

本文深入解析基于 React 和 PDF.js 构建 PDF 查看器的实现方案,该组件支持 PDF 渲染、图片打印和下载功能,并包含完整的加载状态与错误处理机制。 完整代码在最后 一个PDF 文件: https://mozilla.github.io/pdf.js/web/compressed.tracemo…

【完美解决】VSCode连接HPC节点,已配置密钥却还是提示需要输入密码

目录 问题描述软件版本原因分析错误逻辑链 解决方案总结 问题描述 本人在使用 ​​VSCode Remote-SSH 插件​​连接超算集群节点时,遇到以下问题:已正确配置 SSH 密钥,且 VSCode 能识别密钥文件(如图1),但在…

【JSON2WEB】16 login.html 登录密码加密传输

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

从递归入手一维动态规划

从递归入手一维动态规划 1. 509. 斐波那契数 1.1 思路 递归 F(i) F(i-1) F(i-2) 每个点都往下展开两个分支,时间复杂度为 O(2n) 。 在上图中我们可以看到 F(6) F(5) F(4)。 计算 F(6) 的时候已经展开计算过 F(5)了。而在计算 F(7)的时候,还需要…

轻量级爬虫框架Feapder入门:快速搭建企业级数据管道

一、目标与前置知识 1. 目标概述 本教程的主要目标是: 介绍轻量级爬虫框架 Feapder 的基本使用方式。快速搭建一个采集豆瓣电影数据的爬虫,通过电影名称查找对应的电影详情页并提取相关信息(电影名称、导演、演员、剧情简介、评分&#xf…

golang gmp模型分析

思维导图: 1. 发展过程 思维导图: 在单机时代是没有多线程、多进程、协程这些概念的。早期的操作系统都是顺序执行 单进程的缺点有: 单一执行流程、计算机只能一个任务一个任务进行处理进程阻塞所带来的CPU时间的浪费 处于对CPU资源的利用&…

【算法竞赛】树上最长公共路径前缀(蓝桥杯2024真题·团建·超详细解析)

目录 一、题目 二、思路 1. 问题转化:同步DFS走树 2. 优化:同步DFS匹配 3. 状态设计:dfs参数含义 4. 匹配过程:用 map 建立权值索引 5. 终止条件:无法匹配则更新答案 6. 总结 三、完整代码 四、知识点总…

【windows10】基于SSH反向隧道公网ip端口实现远程桌面

【windows10】基于SSH反向隧道公网ip端口实现远程桌面 1.背景2.SSH反向隧道3.远程连接电脑 1.背景 ‌Windows 10远程桌面协议的简称是RDP(Remote Desktop Protocol)‌。 RDP是一种网络协议,允许用户远程访问和操作另一台计算机。 远程桌面功…

Python----概率论与统计(贝叶斯,朴素贝叶斯 )

一、贝叶斯 1.1、贝叶斯定理 贝叶斯定理(Bayes Theorem)也称贝叶斯公式,是关于随机事件的条件概率的定理 贝叶斯的的作用:根据已知的概率来更新事件的概率。 1.2、定理内容 提示: 贝叶斯定理是“由果溯因”的推断&…