亚马逊AWS官方博客
推陈出新 – Valkey 性能测试:探索版本变迁与云托管的效能提升
![]() |
自 Redis Labs 2024 年 3 月 20 日将 BSD-3-clause 源码使用协议修改为 RSAv2 和 SSPLv1 协议,包括亚马逊云科技在内的 40 多家公司持续投入在 Valkey 项目上。上篇博客介绍了 Valkey 的新特性,那用户最关心的性能部分表现如何?和 Redis 相比是否有性能提升或者下降?通过多个全面的性能测试对比,我们来一探究竟。
一、性能测试整体概述
本文中对自建/托管 Redis/Valkey 在不同版本、不同 EC2 实例规格进行了对比测试,得出 2 个主要结论:1. 托管 Valkey7.2/托管 Redis7.1 性能均优于自建 Redis7.2.4;2. 随着新的版本迭代,新的 Valkey/Redis 托管版本性能优于老的托管版本。下面,让我们深入了解各个版本在不同场景下的具体表现。
二、压测环境和压测方式
在压测环境上,考虑到会进行非常高的 QPS 压测,为确保不因为施压端带宽等资源成为瓶颈点,因此施压端统一使用了 EC2 C7i.16xlarge 的规格,EC2 规格表请参考该链接。
序号 | 配置项 | 配置内容 | 备注 |
1 | 压测机 | EC2 C7i.16xlarge | |
2 | 参数配置 | 自建 Valkey 环境参数与云托管 Valkey 参数保持一致,没有开启 AOF | IO-Threads 参数云托管环境已调试至最优值,自建环境测试过程中调整了不同设置 |
3 | 部署架构 | 云托管环境和自建环境均选择一主一从的架构,主从节点规格保持一致且位于不同的 AZ | |
4 | 网络环境 | 压测机和数据库 Server 端主节点位于同一个 AZ | |
5 | 数据库服务端规格 | 使用 r7g 系列,使用了 4 个类型来做测试,r7g.large、r7g.xlarge、r7g.2xlarge、r7g.4xlarge | |
6 | 压测脚本 | 使用 Python 语言构建压测脚本 | 压测脚本放在最后的附录中 |
7 | 压测工具 | 使用 redis-benchmark 作为压测工具 | |
8 | 压测命令类型 | Get、Set | |
9 | 压测 key 大小 | 16 Bytes、64 Bytes、256 Bytes、512 Bytes | Value 大小对 QPS 也会有影响,因此测试多个 Value Size |
在 Valkey/Redis 中,存在一个参数 io-threads,对应着 Valkey 中运行任务的线程数。通过增加 IO 线程数,Redis 可以并行处理更多的网络 IO 操作,减少单线程处理的瓶颈。这样可以显著提高 Redis 处理网络请求的能力,尤其在高并发场景下,可以显著提升整体性能和吞吐量。亚马逊云科技已经在托管的服务中做了最适配的设置,对于自建 Valkey,可以按照需要设置。在不同 EC2 规格下推荐的 io–threads 设置也是不同,官方关于 io–threads 配置建议为:So for instance if you have a four cores boxes, try to use 2 or 3 I/O threads, if you have a 8 cores, try to use 6 threads. 详情请参考 Valkey 官方介绍。
三、压测对比和分析
3.1 托管 Valkey 7.2 与托管 Redis 7.1 、托管 Redis 6.2 对比
测试目的:测试不同版本的托管 ElastiCache 服务的性能对比表现。
测试结果:
![]() |
在服务端使用 r7g.4xlarge 的规格,通过压测可以发现:
- 托管 Redis 7.1 和托管 Valkey 7.2 Get QPS 均能超过 100W
- 不论 Set 还是 Get,托管 Redis 和 Valkey 7.x 版本性能均好于 Redis 6.x 版本
- 托管 Redis 7.1 版本和托管 Valkey 7.2 版本在 4xlarge 的摸高测试下比较接近
压测结论:在 4xlarge 机型下,托管 Valkey 7.2/托管 Redis 7.1 性能均好于托管 Redis 6.2,特别是高并发场景下性能表现要更好。
3.2 托管 Valkey 7.2 与托管 Redis 7.1、自建 Redis 7.2 对比
测试目的:评估托管 Valkey 与自建 Redis 在不同 EC2 规格下对比的性能表现
3.2.1 服务器规格为 r7g.xlarge,自建环境 io-threads 配置为 4
测试结果:
在 Value 为 64 Bytes 情况下:
![]() |
在 Value 为 512 Bytes 的情况下:
![]() |
在服务端使用 r7g.xlarge 的规格,通过压测可以发现:
- 托管 Redis 7.1 和托管 Valkey 7.2 QPS 相对接近,QPS 最高到 60W
- 托管 Redis 7.1 和托管 Valkey 7.2 QPS 对不同大小的 item 性能都优于自建 Redis 7.2
3.2.2 服务端规格为 r7g.2xlarge,其中自建环境 io-threads 配置为 8
测试结果:
在 Value 为 64 Bytes 的情况下:
![]() |
在 Value 为 512 Bytes 的情况下:
![]() |
在服务端使用 r7g.2xlarge 的规格,通过压测可以发现:
- 托管 Valkey 7.2 QPS 最高超过 100W+,托管 Redis 7.1 QPS 最高超过 80W+
- 托管 Redis 7.1 和托管 Valkey 7.2 QPS 对不同大小的 item 性能都优于自建 Redis 7.2
3.2.3 服务端规格为 r7g.4xlarge,其中自建环境 io-threads 配置为 8
测试结果:
在 Value 为 64 Bytes 的情况下:
![]() |
在 Value 为 512 Bytes 的情况下:
![]() |
在服务端使用 r7g.4xlarge 的规格,通过压测可以发现:
- 托管 Valkey 7.2 、托管 Redis 7.1 最高 QPS 均超过 100W+
- 托管 Redis 7.1 和托管 Valkey 7.2 QPS 对不同大小的 item 性能都优于自建 Redis 7.2
压测结论:托管 Valkey 7.2 和托管 Redis 7.1 QPS 在不同规格、不同 item 大小测试,性能均优于自建 Redis 7.2
3.3 自建 Valkey 8.0、自建 Redis7.2 增加 io-threads 对比
测试目的:评估 io-threads 参数设置对于自建 Valkey 性能表现的影响
3.3.1 服务端规格为 r7g.xlarge,自建 Valkey 8.0
测试结果:
在 Value 为 16 Bytes 的情况下:
![]() |
在 Value 为 64 Bytes 的情况下:
![]() |
在服务端使用 r7g.xlarge 的规格,通过压测可以发现:
- 随着 io-threads 数量的提升,不论 Get 和 Set QPS 都有明显的提升
3.3.2 服务端规格为 r7g.2xlarge,自建 Valkey 8.0
测试结果:
在 Value 为 64 Bytes 的情况下:
![]() |
在 Value 为 512 Bytes 的情况下:
![]() |
在服务端使用 r7g.xlarge 的规格,通过压测可以发现:
- 随着 io–threads 数量的提升,Get QPS 会有明显的提升,在当前规格和压力下,6→8 增加的比较少
- 随着 io–threads 数量的提升,Set QPS 会增加,64 字节在 2→4 有跃升,512 字节的 2→4→6 都有提升
- 2xlarge 在 IO 线程数打满到 8 核后,SET 性能不稳定
3.3.3、服务端规格为 r7g.2xlarge,自建 Redis 7.2
测试结果:
在 Value 为 64 Bytes 的情况下:
![]() |
在 Value 为 512 Bytes 的情况下:
![]() |
在服务端使用 r7g.xlarge 的规格,通过压测可以发现:
- 随 IO 线程数增加,GET/SET RPS 会增加,但增加幅度较小,不及 Valkey,尤其在 6→8 时,基本看不到变化
- 自建 2 在不同 io-threads 设置下,性能都和自建 Valkey8.0 差距较大: GET, 40w vs 90w; SET,35w vs 70w
压测结论:
- IO 线程数增加,会带来自建 0 的性能提升。但是到达临界点,再增加 IO 线程,不会再带来额外性能提升
- 自建 0 GET 比 SET 能享受到 IO 线程红利的几率更大。原因分析 SET 能利用到 IO 线程多路复用。GET 能利用到 IO 线程多路复用和内存访问摊销的双重优势。
IO 多路复用:通过 IO 多路复用技术可以在高并发场景下显著提升服务端处理能力,详情可以参考 Enhanced I/O multiplexing
内存访问摊销:内存访问分摊(MAA),这是一种用于降低内存访问成本的技术,尤其适用于大型动态数据结构,例如在 Redis 中使用的结构。MAA 将许多数据结构操作的步骤交错在一起,以确保并行访问内存并减少内存访问延迟,详情可以参考博客:借助 HAQM ElastiCache for Redis 7.1,可实现每个集群每秒超过 5 亿个请求。
四、压测结论总结
经过上述多轮对比和压测,我们得出的结论有:1. 亚马逊云科技托管 Valkey 7.2 和托管 Redis 7.1 在增强 IO 多路复用的加持下,QPS 最大可以超过 100W,性能均好于托管 Redis 6.2 和自建的 Valkey;2. 对于自建 Valkey,调大 io–threads 对高并发的场景能带来性能的提升,但需要结合服务器规格来设置,会存在临界点,即再增加 IO 线程,不会再带来额外性能提升。Get 比 Set 能享受到 IO 线程红利的几率更大。 Set 有 IO 线程多路复用。Get 有 IO 线程多路复用和内存访问摊销,因此在部分压测场景下,Get QPS 增幅明显大于 Set。
上述结论基于我们自己对 redis-benchmark 的压测,不同负载下可能达到的效果不尽相同。从理论分析,IO 多路复用的提升,内存资源的节约应该对性能有正向的提升。建议您结合您的应用负载综合评估测试 Valkey 的效果。