我想解决适用于 Valkey 的 Amazon ElastiCache 或 Amazon ElastiCache for Redis OSS 集群中的高延迟问题。
简短描述
以下是导致适用于 Valkey 的 ElastiCache 或 ElastiCache for Redis OSS 集群出现高延迟问题的常见原因:
- 命令速度慢
- 内存使用率高导致交换活动增加
- 网络问题
- 客户端延迟问题
- Redis 同步
- Amazon ElastiCache 集群事件
解决方法
命令速度慢
由于 Valkey 和 Redis OSS 集群是单线程的,因此 ElastiCache 在当前请求完成之前无法为客户端提供服务。这种减速会导致请求的总时间增加,并导致高延迟。
要监控平均延迟,您可以使用 Valkey 和 Redis 的 Amazon CloudWatch 指标来监控特定命令。有关详细信息,请参阅 Valkey 和 Redis OSS 的指标。
要检索引擎处理时间超过 10 毫秒的命令列表,请使用 SLOWLOG GET 命令。您可以连接到受影响的节点,在 valkey-cli 中运行 slowlog get 128 命令。
此外,ElastiCache 以微秒延迟计算常见的 Redis 操作。CloudWatch 每分钟对指标进行采样,并将延迟指标显示为多个命令的总和。单个命令可能会导致超时等小问题,而指标图表不会有显著变化。
需要很长时间才能完成的慢速命令可能会导致 ElastiCache 节点上的 CPU 使用率增加。如果 EngineCPUUtilization 指标有所增加,请参阅如何解决自行设计的 ElastiCache for Redis 集群中 CPU 使用率增加的问题?
以下是可能会减慢 ElastiCache 集群速度的复杂命令示例:
- 在具有大型数据集的生产环境中使用 KEYS 命令: KEYS 命令可扫描整个密钥空间并搜索指定的模式。有关详细信息,请参阅 Valkey 网站上的 KEYS。
- 需要较长时间来运行的 Lua 脚本: 根据脚本的复杂程度或数据集的大小,Lua 脚本可能会运行很长时间并导致延迟问题。
内存使用率高导致交换活动增加
当集群的内存压力增加时,Redis 会更换内存页面。由于内存页会转入并从更换区域转出,因此交换会导致延迟增加和超时。CloudWatch 指标中的以下变化表明交换活动有所增加:
- SwapUsage 增加
- FreeableMemory 较低
- BytesUsedForCache 和 DatabaseMemoryUsagePercentage 指标较高
要解决更换活动增加的问题,请查看以下文章:
网络问题
网络问题可能会导致集群出现高延迟。根据您的网络问题,请完成以下任务以解决高延迟问题。
客户端与 ElastiCache 集群之间的网络延迟
为了减少客户端和 ElastiCache 集群之间的延迟,您可以隔离客户端和集群节点之间的网络延迟。有关详细信息,请参阅如何排查虚拟私有云 (VPC) 中的 EC2 Linux 或 Windows 实例与本地主机之间通过互联网网关通信时的网络性能问题?
集群达到网络限制
ElastiCache 节点与相关的 Amazon Elastic Compute Cloud (Amazon EC2) 实例具有相同的网络限制。例如,ElastiCache cache.m6g.large 节点类型和 Amazon EC2 m6g.large 实例的网络限制是相同的。有关支持的 ElastiCache 节点类型和网络带宽限制的详细信息,请参阅支持的节点类型。
要解决 ElastiCache 节点网络限制问题,请参阅网络相关限制。
**注意:**最佳做法是监控 Amazon EC2 实例的网络性能、带宽能力、每秒数据包 (PPS) 性能和跟踪的连接。
TCP/SSL 握手延迟
当客户端连接到 Redis 集群时,创建 TCP 连接可能需要几毫秒。在此期间,延迟可能会给您的 Redis 操作和 ElastiCache 节点 CPU 带来额外的压力。当您有许多新连接时,这种压力可能会导致网络高延迟。
要控制连接量并减少延迟,您可以使用连接池将已建立的 TCP 连接缓存到池中。要配置连接池,请使用您的 Redis 客户端库。或者,您可以手动构建连接池。
要优化连接池,您还可以使用聚合命令,例如 MSET、MGET 或 Redis 管道。有关详细信息,请参阅 Redis 网站上的 Redis 管道。
ElastiCache 节点上有大量连接
如果在 ElastiCache 节点上有大量的 TCP 连接,您可能会耗尽 maxclients 限制。当达到此限制时,您会收到“错误:已达到最大客户端数错误”,并且可能会遇到连接超时的情况。
要减少高延迟,最佳做法是跟踪 CurrConnections 和 NewConnections CloudWatch 指标。您可以监控这些指标,以查看您的 ElastiCache 节点拥有的 TCP 连接数量。要在耗尽 maxclients 限制时解决问题,请参阅大量连接部分(最佳实践: Redis 客户端和 Amazon ElastiCache for Redis)。
客户端延迟问题
如果您使用过低的超时值配置客户端资源,则可能会收到超时错误。要确定客户端资源是否导致延迟问题,请检查客户端的内存、CPU 和网络利用率。如果这些资源接近其限制,请将客户端超时值配置为更大的值,以便资源能够响应。
如果您的应用程序在 Amazon EC2 实例上运行,可以使用 CloudWatch 指标进一步发现问题。或者,在 Amazon EC2 实例内使用监视工具,如 atop 或 CloudWatch 代理。
要确定客户端是否导致高延迟,请查找以下问题:
- 检查超时是频繁发生还是在一天中的特定时间发生。
- 检查超时是发生在某个特定客户端还是多个客户端上。
- 检查超时是发生在某个特定 Valkey 或 Redis 节点还是多个节点上。
- 检查超时是发生在某个特定集群还是多个集群上。
Redis 同步
Redis 同步在备份、节点更换和扩展事件时开始。此过程是一种计算密集型工作负载,可能会导致延迟。
要检查同步是否影响了您的节点性能,您可以在 CloudWatch 中查看 SaveInProgress 指标。
**注意:**为了最大限度地减少对用户流量的影响,最佳做法是在非高峰时段计划同步事件。
ElastiCache 集群事件
如果您的 ElastiCache 集群有集群事件,则在事件期间您可能会遇到高延迟。您可以在延迟期间使用 ElastiCache 控制台查看事件。检查后台活动,如可能由 ElastiCache 托管的维护和服务更新引起的节点更换或失效转移事件。
如果您认为意外硬件故障导致了高延迟,请联系 AWS Support。
**注意:**您可以在 AWS Health Dashboard 中查看计划的事件通知。
事件日志示例:
Finished recovery for cache nodes 0001
Recovering cache nodes 0001
Failover from master node cluster_node to replica node cluster_node completed
相关信息
Monitoring best practices with Amazon ElastiCache for Redis using Amazon CloudWatch
持续连接问题
如何在 ElastiCache for Redis OSS 或 ElastiCache for Valkey 集群中启用日志传输?