Amazon ElastiCache for Redis是一种内存数据存储,可为现代应用程序提供实时、成本优化的性能。它是一项完全托管的服务,可扩展到每秒数百万次操作,响应时间为微秒。
开源Redis(“Redis OSS”)是最受欢迎的NoSQL键值存储之一,并以其出色的性能而闻名。我们的客户选择在 ElastiCache for Redis 上运行缓存,以帮助降低数据库成本并提高性能。随着他们扩展应用程序,他们对高吞吐量和大量并发连接的需求不断增长。2019 年 3 月,我们推出了增强型 I/O,使每个节点的吞吐量提高了 83%,延迟降低了 47%。2021 年 11 月,我们通过将加密卸载到非 Redis 引擎线程来提高启用 TLS 的集群的吞吐量。在这篇文章中,我们很高兴地宣布增强的 I/O 复用,这进一步提高了吞吐量和延迟,而不需要您对应用程序进行额外的更改。
ElastiCache for Redis 7 中增强的 I/O 多路复用
适用于 Redis 7 及更高版本的 ElastiCache 现在包括增强的 I/O 多路复用,可大规模显着提高吞吐量和延迟。增强型 I/O 多路复用非常适合具有多个客户端连接的吞吐量受限工作负载,其优势随着工作负载并发级别的增加而扩展。例如,与 ElastiCache for Redis 6 相比,当使用 r6g.xlarge 节点并运行 5,200 个并发客户端时,吞吐量(每秒读写操作数)提高高达 72%,P99 延迟降低高达 71%。对于这些类型的工作负载,ElastiCache for Redis 6.2 处理可能成为扩展能力的限制因素。通过增强的 I/O 多路复用,每个专用网络 I/O 线程将命令从多个客户端传输到 ElastiCache for Redis 引擎中,利用 ElastiCache for Redis 高效批量处理命令的能力。在所有 AWS 区域中使用 ElastiCache for Redis 7 时,增强型 I/O 多路复用将自动可用,且无需额外付费。请参阅ElastiCache 用户指南了解更多信息。使用 ElastiCache for Redis 版本 7 后,无需更改应用程序或服务配置即可使用增强型 I/O 多路复用。
让我们更深入地研究一下它是如何工作的。下图显示了 Redis OSS 如何处理客户端 I/O(直至 ElastiCache for Redis 6)的高级视图。
Redis OSS引擎同时为多个客户端提供服务。该引擎是单线程的,处理能力在连接的客户端之间共享。对于每个客户端,引擎处理连接、解析请求并运行命令。在这种情况下,不会使用可用的 CPU。
下图显示了具有增强型 I/O 的 ElastiCache for Redis(针对 Redis OSS 5.0.3 发布),其中可用 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(读取)命令,数据集使用 300 万个 16B 键和 512B 字符串值初始化。ElastiCache 和客户端应用程序都在同一可用区中运行。
吞吐量增益
在下图中,我们分享了针对不同节点大小执行一系列客户端并发(400 个客户端、2,000 个客户端和 5,200 个客户端)的基准运行结果。该图显示了增强型 I/O 多路复用带来的吞吐量(每秒请求数)的改进百分比。
增强型 I/O 多路复用使每秒请求量提高了 72%,全面提高了吞吐量,如上图所示。值得注意的是,系统上的客户端负载越多,改进就越高。例如,r6g.xlarge 在 400、2,000 和 5,200 个并发客户端的情况下分别显示每秒操作次数提高了 26%、48% 和 72%。下表列出了证明改进的原始数据。
ElastiCache for Redis 版本 | 400 个客户 | 2,000 名客户 | 5,200 名客户 |
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 利用率峰值和响应时间减慢。为了避免这种情况,我们测试了每秒 142,000 个请求的延迟,这是 r6g.xlarge 上 ElastiCache for Redis 6.2.6 的 70% 吞吐量利用率。我们使用 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 多路复用,您将受益于增加的吞吐量和减少的延迟,而无需更改您的应用程序。在所有 AWS 区域中使用 ElastiCache for Redis 7 时,增强型 I/O 多路复用将自动可用,无需额外付费。
有关更多信息,请参阅支持的节点类型。首先,创建一个新集群,或使用ElastiCache 控制台升级现有集群。