跳至内容

如何解决适用于 Valkey 的 ElastiCache 或 ElastiCache for Redis OSS 中的高延迟问题?

2 分钟阅读
0

我想解决适用于 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 较低
  • BytesUsedForCacheDatabaseMemoryUsagePercentage 指标较高

要解决更换活动增加的问题,请查看以下文章:

网络问题

网络问题可能会导致集群出现高延迟。根据您的网络问题,请完成以下任务以解决高延迟问题。

客户端与 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 客户端库。或者,您可以手动构建连接池。

要优化连接池,您还可以使用聚合命令,例如 MSETMGET 或 Redis 管道。有关详细信息,请参阅 Redis 网站上的 Redis 管道

ElastiCache 节点上有大量连接

如果在 ElastiCache 节点上有大量的 TCP 连接,您可能会耗尽 maxclients 限制。当达到此限制时,您会收到“错误:已达到最大客户端数错误”,并且可能会遇到连接超时的情况。

要减少高延迟,最佳做法是跟踪 CurrConnectionsNewConnections CloudWatch 指标。您可以监控这些指标,以查看您的 ElastiCache 节点拥有的 TCP 连接数量。要在耗尽 maxclients 限制时解决问题,请参阅大量连接部分(最佳实践: Redis 客户端和 Amazon ElastiCache for Redis)。

客户端延迟问题

如果您使用过低的超时值配置客户端资源,则可能会收到超时错误。要确定客户端资源是否导致延迟问题,请检查客户端的内存、CPU 和网络利用率。如果这些资源接近其限制,请将客户端超时值配置为更大的值,以便资源能够响应

如果您的应用程序在 Amazon EC2 实例上运行,可以使用 CloudWatch 指标进一步发现问题。或者,在 Amazon EC2 实例内使用监视工具,如 atopCloudWatch 代理

要确定客户端是否导致高延迟,请查找以下问题:

  • 检查超时是频繁发生还是在一天中的特定时间发生。
  • 检查超时是发生在某个特定客户端还是多个客户端上。
  • 检查超时是发生在某个特定 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 集群中启用日志传输?

AWS 官方已更新 9 个月前