如何检查自行设计的 ElastiCache for Redis 集群中的内存使用情况,并实施最佳实践来控制高内存使用量?

2 分钟阅读
1

我想检查我自行设计的 Amazon ElastiCache for Redis 集群中的内存使用情况,并实施最佳实践来控制高内存使用量。

简短描述

以下是您自行设计的 ElastiCache for Redis 集群中内存使用率过高的原因:

  • **最近添加的密钥:**额外的 key-value 对会导致内存使用量增加。此外,已有密钥上的其他元素会导致内存使用量增加。要确定节点上最近的数据变化,请检查 SetTypeCmds 指标。有关更多信息,请参阅 Redis 网站 INFO 页面上的 commandstats 命令。
  • 缓冲区使用率增加:客户端通过网络连接到 Redis。如果客户端(包括 Pub/Sub 客户端)从缓存区中读取的速度不够快,则 Redis 会将响应数据保留在客户端输出缓冲区中。有关更多信息,请参阅 Redis 网站上的 Redis Pub/SubOutput buffer limits。如果网络带宽出现瓶颈,或者集群负载持续过重,则缓冲区使用率可能会累积。这会导致内存耗尽和性能下降。默认情况下,ElastiCache for Redis 不限制输出缓冲区的增长,并且每个客户端都有自己的缓冲区。要检查缓冲区使用率,请使用 client list 命令。有关更多信息,请参阅 Redis 网站上的 CLIENT LIST
  • **大量新连接:**大量新连接可能会增加内存使用量。所有新连接都会创建一个消耗内存的文件描述符,而该内存消耗总量可能会导致数据驱逐或 OOM 错误。要查看新连接的数量,请检查 NewConnections 指标。
  • 交换区使用量高: 当有可用内存时,在缓存节点上使用一些交换区是正常行为。但是,过高的交换区使用量可能会导致性能下降。交换区使用量过高发生在高内存压力的节点中。这会导致可用内存不足。要监控主机上的交换区,请使用 SwapUsage 指标。
  • **高内存碎片率:**内存碎片率高表明操作系统内存管理效率较低。删除密钥后,Redis 可能无法释放内存。要监控碎片率,请使用 MemoryFragmentationRatio 指标。如果您遇到碎片问题,请打开 activedefrag 参数以激活内存碎片整理。
  • **大密钥:**大密钥具有较大的数据量或大量元素。大密钥可能会导致高内存使用率。要检测数据集中的大密钥,请使用 redis-cli --bigkeys 命令或 redis-cli --memkeys 命令。有关更多信息,请参阅 Redis 网站上的 Scanning for big keysScanning keys

解决方法

检查内存使用情况

要检查您自行设计的 ElastiCache for Redis 集群中的内存使用情况,请查看以下 Redis 指标
**注意:**集群中每个节点的这些指标都会发表到 Amazon CloudWatch 中。

  • **BytesUsedForCache:**这是 Redis 为所有用途分配的总字节数。该值用于确定集群的内存利用率。要检索此指标,请在 Redis 节点上运行 INFO 命令。有关更多信息,请参阅 Redis 网站上的 INFO
  • **FreeableMemory:**这是一项主机指标,显示主机上可用的空闲内存量。如果内存使用量由于缓存数据或开销而增加,则 FreeableMemory 会降低。FreeableMemory 的减少表示主机上的内存不足。当 FreeableMemory 过低时,可能会发生交换。
  • **DataBaseMemoryUsagePercentage:**这是集群节点使用的内存百分比。当该指标达到其阈值的 100% 时,Redis 将启动 Redis 最大内存驱逐策略。有关更多信息,请参阅 Redis 网站上的 Key eviction。要检索此指标,请在 Redis 节点上运行 INFO 命令。有关更多信息,请参阅 Redis 网站上的 INFO

**注意:**默认情况下,ElastiCache 会预留 maxmemory 的 25% 用于非数据用途,例如失效转移和备份。如果您没有为非数据用途指定足够的预留内存,则交换可能会增加。有关更多信息,请参阅 Managing reserved memory

控制高内存使用量的最佳实践

  • 对密钥使用 TTL: 要防止存储不必要的密钥并删除过期的密钥,请为密钥指定 TTL 失效期。有关更多信息,请参阅 Redis 网站上的 TTL。如果您有大量密钥被驱逐,那么您的节点会在内存压力下运行。为避免多个密钥在同一时间段内过期,请在使用 TTL 时增加随机性。
  • 使用驱逐策略: 当缓存内存已满时,Redis 会根据 maxmemory-policy 删除密钥以释放空间。默认 maxmemory-policy 策略设置为 volatile_lru。最佳实践是选择适合您工作负载的驱逐策略。
  • 分配预留内存: 为避免失效转移或备份期间出现问题,最佳实践是将非数据用途的 reserved_memory_percentage 参数设置为至少 25%。如果没有足够的预留内存来执行失效转移或备份,则会出现交换和性能问题。
  • 使用连接池: 连接池允许您控制 Redis 客户端尝试带来的大量新连接。有关更多信息,请参阅 Redis 客户端和 ElastiCache for Redis 的最佳实践是什么?
  • 配置服务器端空闲超时: 无论客户端是否向 ElastiCache for Redis 发送请求,打开的连接都会消耗内存,使用量也会随着时间的推移而增加。要最大限度地减少空闲连接的不必要内存使用量,请通过参数组配置服务器端超时,以在指定时间段后关闭空闲连接。为避免提前关闭连接,请将服务器端空闲超时值设置为高于客户端库中的客户端超时值。
  • 调整输出缓冲区大小限制: 调整输出缓冲区限制以控制缓冲区空间的使用。ElastiCache for Redis 参数组包括以 client-output-buffer-limit 开头的参数,以避免客户端输出缓冲区使用率过高。这些参数没有建议的限制。确保对工作负载进行基准测试,以便为输出缓冲区限制选择一个适当的值。
  • 使用哈希映射: 哈希映射有助于处理具有大量密钥的数据结构。此外,与哈希表相比,使用 ziplist 编码可减少内存占用。有关更多信息,请参阅 Redis 网站上的 Memory optimization。注意:哈希映射是一项复杂的命令,可能会导致 Redis 引擎使用量激增。
  • 扩展集群: 如果工作负载在预期的范围,但内存压力增加,则扩展集群以减轻内存压力。
  • 为内存使用情况设置告警: 要针对达到预设阈值的内存使用情况启动告警,请使用 CloudWatch 告警。当您创建 CloudWatch 告警时,使用 BytesUsedForCacheDatabaseMemoryUsagePercentage 参数。
AWS 官方
AWS 官方已更新 1 年前