为什么我发现自己的 ElastiCache for Redis 集群中的 CPU 利用率过高或不断增加?

2 分钟阅读
1

我发现自己的 Amazon ElastiCache for Redis 集群中的 CPU 利用率过高或不断增加。我应该如何排查此问题?

简短描述

ElastiCache for Redis 有两个 Amazon CloudWatch CPU 指标:

  • EngineCPUUtilization:此指标报告 Redis 引擎线程的 CPU 利用率。由于 Redis 是单线程的,因此最佳做法是监测拥有四个或更多 vCPU 的节点的 EngineCPUUtilization 指标。
  • CPUUtilization:此指标显示整个主机的 CPU 利用率百分比。对于 vCPU 数量不超过两个的较小节点,请使用 CPUUtilization 指标来监测集群工作负载。

解决方法

高 EngineCPUUtilization

下面是高 EngineCPUUtilization 的常见原因:

  • **长时间运行的命令耗费高 CPU 时间:**高时间复杂性的命令,例如 keyshkeyshgetall 等,会消耗更高的 CPU 时间。有关每个命令的时间复杂性和性能建议,请参阅 redis.io 网站上的命令Lua 脚本(由 EVALEVALSHA Redis 命令运行)是 Redis 中的原子操作。在 Lua 脚本的整个运行时间内,所有服务器活动都会被阻止,从而导致高 EngineCPUUtilization。 使用 Redis 慢日志检查是否存在长时间运行的命令或长时间运行的 Lua 脚本。
  • **大量请求:**检查命令统计信息以确定是否存在命令突发或延迟是否正在增加。您可以使用 GetTypeCmdsHashBasedCmds 之类的 CloudWatch 指标检查命令统计信息。或者,您也可以使用 Redis 命令 info commandstats。如果由于应用程序的预期工作负载而导致大量请求,请考虑扩展集群
  • **备份和复制:**检查 SaveInProgress 指标以了解是否正在进行备份或复制。当正在进行后台保存(分叉或无分叉)时,此二进制指标返回“1”。如果未在进行后台保存,该指标将返回“0”。确保您有足够的内存来创建 Redis 快照
  • **大量新连接:**建立 TCP 连接是一种计算成本高昂的操作,特别是对于启用了 TLS 的集群。短时间内出现大量的新客户端连接请求可能会导致 EngineCPUUtilization 升高。 从 Redis 6.2 开始,对于使用拥有八个或更多 vCPU 的 x86 节点类型或拥有四个或更多 vCPU 的 Graviton2 节点类型的启用了 TLS 的集群,性能已得到改进。有关处理大量连接的建议,请参阅最佳实践:Redis 客户端和 Amazon ElastiCache for Redis
  • 大量驱逐:Redis 根据 maxmemory-policy 参数驱逐键。当缓存没有足够的内存保留新数据时,就会发生驱逐。如果驱逐量很高,那么 EngineCPUUtilization 就会增加,因为 Redis 正忙于驱逐键。驱逐量可以使用 CloudWatch 指标 Evictions(驱逐)进行监测。如果驱逐率很高,则使用更大的节点类型向上扩展集群,或通过添加更多节点进行横向扩展
  • **大量回收:**为了释放内存,Redis 采样并删除已经超时过期的所有键。此进程称为“reclaim”。 如果过期数量很多,则 EngineCPUUtilization 将会升高,因为 Redis 正忙于回收键。您可以使用 CloudWatch 指标 Reclaimed 监测键过期事件的数量。 最佳做法是不要同时使太多键过期,例如通过运行 EXPIREAT Redis 命令。

有关对高 EngineCPUUtilization 进行故障排除的详细信息,请参阅连接故障排除 - CPU 利用率

高 CPUUtilization

下面是高 CPUUtilization 的常见原因:


AWS 官方
AWS 官方已更新 2 年前