当前位置: 首页 > article >正文

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

本内容是对知名性能评测博主 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 限制节流

相关文章:

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

本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在以下中,我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序…...

设计模式-观察者模式和发布订阅模式区别

文章目录 其他不错的文章 二者有类似的地方,也有区别。 引用的文章说的已经比较清楚了,这里只列出对比图。 对比点观察者模式发布订阅模式中间人角色无事件中心,观察者直接订阅目标有事件中心,发布者与订阅者通过事件中心通信关系…...

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

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

ArcGIS 给大面内小面字段赋值

文章目录 引言:地理数据处理中的自动化赋值为何重要?实现思路模型实现关键点效果实现步骤1、准备数据2、执行3、完成4、效果引言:地理数据处理中的自动化赋值为何重要? 在地理信息系统(GIS)的日常工作中,空间数据的属性字段赋值是高频且关键的操作,例如在土地利用规划…...

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

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

WebGPU:前端图形技术的革命性进化与WebGL的未来

WebGPU:前端图形技术的革命性进化与WebGL的未来 WebGPU作为新一代Web图形API,正在引发前端图形领域的深刻变革。本文将全面剖析WebGPU的技术优势、性能表现、应用场景,以及它与WebGL的关系和未来发展趋势。 WebGPU与WebGL的技术代差 WebGP…...

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

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

Android MediaStore访问的外部存储公共空间都不需要申请权限,这些目录具体指的是哪些

在 Android 10 及更高版本中,通过 MediaStore 访问以下 ​​外部存储公共目录​​ 时,如果操作的是应用自己创建的文件,则​​无需申请存储权限​​。这些目录属于系统明确定义的媒体集合,具体包括: 1. 媒体类型目录​…...

Java中的Exception和Error有什么区别?还有更多扩展

概念 在Java中,Exception和Error都是Throwable的子类,用于处理程序中的错误和异常情况。 然而,它们在用途和处理方式上有显著的不同: Exception: 用于表示程序在正常运行过程中可能出现的错误,如文件未找…...

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…...

21 天 Python 计划:MySQL中DML与权限管理

文章目录 前言一、介绍二、MySQL数据操作:DML2.1 插入数据(INSERT)2.1.1 插入完整数据(顺序插入)2.1.2 指定字段插入数据2.1.3 插入多条记录2.1.4 插入查询结果 2.2 更新数据(UPDATE)2.3 删除数…...

10-MySQL-性能优化思路

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

MySQL学习笔记十

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

在Halcon的语义分割中,过度拟合解决方法

在Halcon语义分割中出现过拟合是比较常见的问题,以下是一些解决方法。 数据方面 - 扩大数据集:收集更多不同场景、角度、光照条件下的图像数据。例如,在做工业零件语义分割时,如果仅用少量固定角度和光照下的零件图像训练&#xf…...

Active Directory 域服务

1.活动目录有什么特点 1. 目录服务 集中管理:提供集中式的用户、计算机、组和其他资源的管理。 结构化存储:以层次结构的方式存储信息,便于组织和检索。 2. 域和林结构 域(Domain):一个逻辑分组&#x…...

Redis快的原因

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

Android 自己的智能指针

在 Android 系统中&#xff0c;强指针模板类&#xff08;sp<T>&#xff09; 是一种基于引用计数的智能指针实现&#xff0c;专门用于管理对象的生命周期。它被广泛用于 Android Framework 的底层&#xff08;Native 层/C 代码&#xff09;&#xff0c;尤其是与 Binder 通…...

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

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

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

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

智能DNS解析:解决高防IP地区访问异常的实战指南

摘要&#xff1a;针对高防IP在部分地区无法访问的问题&#xff0c;本文设计基于智能DNS的流量调度方案&#xff0c;提供GeoDNS配置与故障切换代码示例。 一、问题背景 运营商误拦截或线路波动可能导致高防IP在福建、江苏等地访问异常。传统切换方案成本高&#xff0c;智能DNS可…...

【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…...

ruby超高级语法

以下是 Ruby 中一些 极度硬核 的语法和底层特性&#xff0c;涉及元编程的深渊、虚拟机原理、语法黑魔法等&#xff0c;适用于追求极限的 Ruby 开发者&#xff1a; 高级语法一 一、语法核弹级操作 1. 动态修改继承链 class A; def foo; "A"; end end class B; def …...

第十二天 - Flask/Django基础 - REST API开发 - 练习:运维管理后台API

从零开始用Flask/Django构建运维管理后台API&#xff08;实战指南&#xff09; 前言&#xff1a;为什么选择Python Web框架&#xff1f; 在运维自动化领域&#xff0c;构建管理后台是每个运维工程师的必修课。本文将通过Flask和Django两个主流框架&#xff0c;手把手教你构建…...

Docker 容器内运行程序的性能开销

在 Docker 容器内运行程序通常会有一定的性能开销&#xff0c;但具体损失多少取决于多个因素。以下是详细分析&#xff1a; 1. CPU 性能 理论开销&#xff1a;容器直接共享宿主机的内核&#xff0c;CPU 调度由宿主机管理&#xff0c;因此 CPU 运算性能几乎与原生环境一致&…...

从递归入手一维动态规划

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

【2025年认证杯数学中国数学建模网络挑战赛】A题解题思路与模型代码

【2025年认证杯数学建模挑战赛】A题 该题为典型的空间几何建模轨道动力学建模预测问题。 ⚙ 问题一&#xff1a;利用多个天文台的同步观测&#xff0c;确定小行星与地球的相对距离 问题分析 已知若干地面天文台的观测数据&#xff1a;方位角 (Azimuth) 和 高度角 (Altitude)&…...