摘要:本内容是对知名性能评测博主 Anton Putra Rust vs Zig vs Go: Performance (Latency - Throughput - Saturation - Availability)[1] 内容的翻译与整理, 有适当删减, 相关
本内容是对知名性能评测博主 Anton Putra Rust vs Zig vs Go: Performance (Latency - Throughput - Saturation - Availability)[1] 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准
在本视频中,我们将对 Rust、Zig 和 Golang 进行比较。我使用 Actix HTTP 框架 运行 Rust,标准库 运行 Golang,并使用 较新的 Zek 框架 运行 Zig。
我之所以更新这个基准测试,是因为我收到了一位 熟悉 Zig 的开发者 提交的 Pull Request[2],因此我决定重新进行一次测试。
在本次测试中,我们将重点关注 四个关键指标:
延迟(Latency):使用 P99 百分位 进行测量。吞吐量(Throughput):即 每秒可以处理的请求数,用于衡量不同 HTTP 框架的性能。资源使用情况(Saturation):包括 CPU 使用率(相对于 Kubernetes 定义的限额) 和 内存使用情况。在本测试中,我们直接使用 实际的内存使用值。此外,由于测试是在 Kubernetes 中运行的,我们还需要测量 CPU 限制(Throttling)。错误率或可用性(Errors/Availability):对于 HTTP 服务来说,这指的是 成功请求数与总请求数的比率。我使用了 生产级 Kubernetes 集群 在 AWS 上运行大部分基准测试,以确保测试环境尽可能接近 真实的生产环境。应用程序部署在 大型 EC2 实例 上,客户端运行在 四核 Graviton 实例(基于 ARM 架构,成本略低于 AMD)。
测试方法
/api/api/devices),客户端会向该端点发送请求,并获取一个 硬编码的设备信息。这个测试虽然非常简单,但可以很好地反映 每个应用程序的基准性能。测试开始
首先,我运行 三个应用程序5 分钟,并 不施加任何负载。
这次测试中,我决定 直接显示实际的内存使用量(单位:字节)。Rust 在空闲状态下仅占用不到 1MB 内存,而 Zig 约占 25MB。接下来,我 部署客户端 并施加负载。整个测试持续 大约 2 小时,但我已将其 压缩为几分钟 展示结果。
测试结果
CPU 和延迟
吞吐量
当请求数达到 20,000 QPS(每秒请求数)时,Golang 开始 性能下降,延迟上升。我已应用了所有推荐的优化技术,相关 源代码可在我的仓库中查看[3]。当 QPS 达到 33,000 时,Golang 的延迟问题变得更加明显,已经无法与 Rust 和 Zig 竞争,因此从这里开始,我的重点将放在 Rust 和 Zig 的对比 上。可用性(Availability)
当 QPS 达到 40,000 时,Rust 的 可用性曲线出现小幅下降。由于 平均请求处理时间低于 1ms,我将 超时时间设定为 100ms。当客户端 请求超时,它会收到 HTTP 408 错误码,导致 可用性下降。资源使用情况
当 QPS 达到 98,000 时,Rust 开始 性能下降:
RPS(每秒请求数)下降,无法维持原有吞吐量。延迟上升。Rust 开始返回错误,导致可用性下降(由于大量超时请求)。
在 RPS 计算时,我仅统计成功请求,因此 Rust 的请求总数出现了 略微下降。
总体吞吐量
数据可视化
每秒请求数(RPS)[1]
Rust vs Zig vs Go: Performance (Latency - Throughput - Saturation - Availability):
[2]
[3]
来源:鼠meme