亚马逊AWS官方博客

推陈出新 – Valkey 性能测试:探索版本变迁与云托管的效能提升

自 Redis Labs 2024 年 3 月 20 日将 BSD-3-clause 源码使用协议修改为 RSAv2SSPLv1 协议,包括亚马逊云科技在内的 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 规格下推荐的 iothreads 设置也是不同,官方关于 iothreads 配置建议为: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 的规格,通过压测可以发现:

  • 随着 iothreads 数量的提升,Get QPS 会有明显的提升,在当前规格和压力下,6→8 增加的比较少
  • 随着 iothreads 数量的提升,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,调大 iothreads 对高并发的场景能带来性能的提升,但需要结合服务器规格来设置,会存在临界点,即再增加 IO 线程,不会再带来额外性能提升。Get 比 Set 能享受到 IO 线程红利的几率更大。 Set 有 IO 线程多路复用。Get 有 IO 线程多路复用和内存访问摊销,因此在部分压测场景下,Get QPS 增幅明显大于 Set。

上述结论基于我们自己对 redis-benchmark 的压测,不同负载下可能达到的效果不尽相同。从理论分析,IO 多路复用的提升,内存资源的节约应该对性能有正向的提升。建议您结合您的应用负载综合评估测试 Valkey 的效果。

本篇作者

王海忠

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案架构的咨询和设计,在云计算行业有 9 年+的从业经验,具有丰富的项目实践经验,目前专注于游戏行业。

马丽丽

亚马逊云科技数据库解决方案架构师,十余年数据库行业经验,先后涉猎 NoSQL 数据库 Hadoop/Hive、企业级数据库 DB2、分布式数仓 Greenplum/Apache HAWQ 以及亚马逊云原生数据库的开发和研究。