亚马逊AWS官方博客

Amazon ElastiCache for Redis 7 新增功能:通过增强型 I/O 多路复用将吞吐量提升高达 72%

Original URL: https://aws.amazon.com/blogs/database/enhanced-io-multiplexing-for-amazon-elasticache-for-redis/

Amazon ElastiCache for Redis 是一种内存数据存储,可为现代应用程序提供成本优化的实时性能。这是一项完全托管式的服务,可扩展到每秒数百万次操作,同时提供微秒级的响应时间。

开源 Redis(“Redis OSS”)是极受欢迎的 NoSQL 键值存储之一,以出色的性能而闻名。我们的客户选择在 ElastiCache for Redis 上运行缓存,以帮助降低数据库成本并提升性能。随着应用的不断扩展,客户对高吞吐量和大量并发连接的需求不断增长。2019 年 3 月,我们推出了增强型 I/O,使吞吐量提高了多达 83%,同时每个节点的延迟降低了多达 47%。在2021 年 11 月,我们通过将加密转移到非 ElastiCache 引擎线程来提高 TLS 支持型集群的吞吐量。在这篇文章中,我们很高兴地宣布推出增强型 I/O 多路复用,进一步提高吞吐量并降低延迟,同时无需对应用程序执行额外更改。

ElastiCache for Redis 7 中的增强型 I/O 多路复用

ElastiCache for Redis 7 和更高版本现在包含增强型 I/O 多路复用功能,从而显著提高大规模应用的吞吐量并降低延迟。增强型 IO 多路复用功能非常适合于具有多个客户端连接的吞吐量限制型工作负载,其优势可以随工作负载并发水平而扩展。例如,在使用 r6g.xlarge 节点并运行 5200 个并发客户端时,与 ElastiCache for Redis 6 相比,吞吐量(每秒读写操作数)最高可提升 72%,P99 延迟最高可降低 71%。对于这些类型的工作负载,ElastiCache for Redis 6.2 处理可能成为影响扩展能力的限制因素。借助增强型 I/O 多路复用,每个专用网络 I/O 线程会将来自多个客户端的命令传送到 ElastiCache for Redis 引擎,从而充分利用 ElastiCache for Redis 高效批量处理命令的能力。在所有亚马逊云科技区域中,使用 ElastiCache for Redis 7 时,将会免费自动提供增强型 I/O 多路复用功能。有关更多信息,请参阅 ElastiCache 用户指南。使用 ElastiCache for Redis 7 时,无需进行应用程序或服务配置更改即可使用增强型 IO 多路复用功能。

下面更深入了解此功能的工作原理。下图简要演示了 Redis OSS(直到 ElastiCache for Redis 6)如何处理客户端 I/O。

Redis OSS 引擎同时为多个客户端提供服务。该引擎是单线程的,其处理能力在连接的多个客户端之间共享。对于每个客户端而言,该引擎负责处理连接、解析请求并运行命令。在这种情况下,可用的 CPU 未得到利用。

下图演示了启用了增强型 I/O(在 Redis OSS 5.0.3 中发布)的 ElastiCache for Redis,其中可用 CPU 用于代表 ElastiCache for Redis 引擎转移客户端连接。Redis OSS 6 也采用了类似的方法,它引入了名为 I/O 线程的类似概念。

采用增强型 I/O 后,引擎将专注于处理命令的运行,而非处理网络连接。这样,每个节点的吞吐量最高可提升 83%,延迟最高可降低 47%。通过多路复用,不再为每个客户端打开一个通道(如上图所示),而是如下图所示,由每个增强型 I/O 线程使用 ElastiCache for Redis 引擎将命令组合在单个通道中。

在上图中,多个客户端由每个增强型 I/O 多路复用线程处理,该线程又使用连接 ElastiCache for Redis 主引擎线程的单个通道。增强型 I/O 线程采集客户端命令并将其多路复用到单个批处理中,然后转发到 ElastiCache for Redis 引擎进行处理。正如我们在下一部分中演示,这种方法可以更高效地运行命令,从而提升速度。

性能分析

在这一部分,我们将介绍内存优化型 R5(x86)和 R6g(ARM-Graviton2)节点的基准测试结果。我们选择典型的缓存场景,其中包括 20% 的 SET(写入)和 80% 的 GET(读取)命令,并且使用带有 512B 字符串值的 3M 16B 键初始化数据集。ElastiCache 和客户端应用程序均在同一可用区内运行。

吞吐量提升

下图演示了针对不同节点大小运行基准测试并运用一系列客户端并发性(400 个客户端、2000 个客户端和 5200 个客户端)的结果。该图记录增强型 I/O 多路复用带来的吞吐量(每秒请求数)提升百分比。

增强型 I/O 多路复用可提升高达 72% 的每秒请求数,全面提高吞吐量,如上图所示。值得注意的是,系统上的客户端负载越多,提升程度就越高。例如,在 400、2000 和 5200 个并发客户端上运行时,r6g.xlarge 分别表现出 26%、48% 和 72% 的每秒操作数提升。下表列出了证明这一提升的原始数据。

ElastiCache for Redis 版本 400 个客户端 2000 个客户端 5200 个客户端
6.2.6(操作/秒) 313,143 235,562 202,770
7.05(操作/秒) 395,819 348,550 349,239
改进 26% 48% 72%

多路复用技术提升了 ElastiCache for Redis 的处理效率,与 Redis OSS 管道功能类似。对于 Redis OSS 管道和 ElastiCache for Redis 增强型 I/O 多路复用,命令都是批量处理的。但是,Redis OSS 管道批处理包括单个客户端的命令,而 ElastiCache for Redis 增强型 I/O 多路复用则包括来自多个客户端的单个批处理命令。

降低客户端延迟

不建议最大限度提高吞吐量,这会导致 CPU 利用率激增和响应时间减慢。为了避免这种情况,我们测试了每秒 14.2 万个请求的延迟,这相当于在 r6g.xlarge 上运行时 70% 的 ElastiCache for Redis 6.2.6 吞吐量利用率。我们使用 ElastiCache for Redis 6 测量客户端延迟,并将其与 ElastiCache for Redis 7 上的相同负载进行比较。下表显示了在 r6g.xlarge 上运行的测试结果。该测试获取 P50 和 P99 延迟降低的百分比。

 ElastiCache for Redis 版本 P50 延迟 P99 延迟
6.2.6(毫秒) 0.55 8.3
7.05(毫秒) 0.44 2.45
延迟降低 20% 71%

与吞吐量提升类似,可以在支持增强型 I/O 多路复用的 ElastiCache 实例上看到客户端延迟的降低。

当 ElastiCache 为更多的并发客户端提供服务时,增强型 I/O 多路复用可提供更低的延迟。原因何在?

增强型 I/O 多路复用将来自多个客户端(有时是数千个客户端)的命令组合到少量通道中,这相当于增强型 I/O 线程的数量。通道数量的减少增加了本地访问量,从而提高了内存缓存的使用率。例如,不是每个客户端都有读/写缓冲区,而是所有客户端共享相同的通道缓冲区。减少代价高昂的内存缓存丢失次数,缩短用于单个命令的时间。从而提高了命令处理速度,并降低了延迟,提高了吞吐量。

总结

借助增强型 I/O 多路复用,无需更改应用程序即可提高吞吐量和降低延迟。在所有亚马逊云科技区域中,使用 ElastiCache for Redis 7 时,将会免费自动提供增强型 I/O 多路复用功能。

有关更多信息,请参阅支持的节点类型。首先,使用 ElastiCache 控制台创建新集群或升级现有集群。

敬请关注 ElastiCache for Redis 未来更多的性能改进。祝您顺利缓存!