Redis实例的CPU使用率升高会影响整体的吞吐量和应用的响应速度,极端情况下甚至会导致应用不可用。当平均CPU使用率高于50%、连续5分钟内的CPU平均峰值使用率高于90%时,您需要及时关注并排查该问题,以保障应用的稳定运行。

查找并禁用高消耗命令

高消耗命令:即时间复杂度为O(N)或更高的命令。通常情况下,命令的时间复杂度越高,在执行时会消耗较多的资源,从而导致CPU使用率上升。关于各命令对应的时间复杂度信息,请参见Redis官网

由于单线程的特性,Redis在执行高消耗命令时会引发排队导致应用响应变慢。极端情况下,甚至可能导致实例被整体阻塞,引发应用超时中断或流量跳过缓存层直接到达后端的数据库侧,引发雪崩效应。

  1. 通过性能监控功能,确认CPU使用率高的具体时间段。具体操作,请参见查看监控数据
  2. 通过下述方法,找出高消耗的命令:
    • 审计日志功能会记录对Redis数据执行的修改和删除操作信息,通过分析指定时间段内的命令及趋势,可帮助您找出高消耗的命令。具体操作,请参见查询审计日志
      图 1. 审计日志查询示例
      审计日志查询示例
    • 慢日志功能会记录执行超过指定时间阈值的命令,通过分析慢日志的语句和执行时长可帮助您找出高消耗命令。具体操作,请参见查询慢日志
      图 2. 慢日志查询示例
      慢日志查询示例
      说明 执行时长的单位为微秒。
  3. 评估并禁用高风险命令和高消耗命令,例如FLUSHALLKEYSHGETALL等。具体操作,请参见禁用高风险命令
  4. 优化业务,例如避免频繁执行数据排序操作。
  5. 可选:根据业务情况,选择下述方法对实例进行调整:
    说明 关于如何变更实例的架构和类型,请参见变更实例配置

优化热点Key

现象:

Redis实例为集群架构读写分离架构,实例中部分数据节点的CPU使用率高。

解决方法:

  • 启用代理查询缓存功能(Proxy Query Cache),代理节点会缓存热点Key对应的请求和查询结果,当在有效时间内收到同样的请求时直接返回结果至客户端,无需和后端的数据分片交互,可改善对热点Key的发起大量读请求导致的访问倾斜。通过Proxy Query Cache优化热点Key问题
    说明 该功能仅在集群架构的企业版(性能增强型)中支持。
  • 在分析相应节点的慢日志和审计日志的基础上,再分析各节点的热点Key,从而消除或缓解热点Key。具体操作,请参见查询实时和历史热点Key

优化短连接

现象:

频繁地建立连接,导致Redis实例的大量资源消耗在连接处理上。具体表现为CPU使用率较高,连接数较高,但QPS(每秒访问次数)未达到预期的情况。

解决方法:

  • 将短连接调整为长连接,例如使用JedisPool连接池连接。具体操作,请参见Jedis客户端
  • 调整实例为性能增强型(具备短连接优化特性)。

关闭AOF

现象:

Redis实例默认开启了AOF(append-only file),当实例处于高负载状态时,频繁地执行AOF会一定程度上导致CPU使用率升高。

解决方法:

在业务允许的前提下,您可以考虑关闭持久化。另外将Redis数据备份时间设定到低访问/维护时间窗口内,降低影响。

警告 如果您的实例为企业版(性能增强型),关闭AOF后,您将无法通过AOF文件恢复Redis数据(即无法使用通过数据闪回按时间点恢复数据),仅能通过备份集恢复数据(即从备份集恢复至新实例),请谨慎操作。

优化Proxy节点连接与管道的使用

现象:

Redis实例为集群架构读写分离架构,通过控制台的性能趋势查看Proxy节点的CPU使用率不均衡,差额过大。

图 3. Proxy节点的CPU使用率
Proxy节点的CPU使用率

解决方法:

  1. 通过性能趋势功能,确认连接使用率是否均衡。具体操作,请参见性能趋势
  2. 根据连接使用率是否均衡,选择下述操作:
    • 均衡:重启业务所属的客户端或Proxy节点使连接重分配。
    • 不均衡:通常因pipelinebatch的操作规模过大引起,需要减少对应的操作规模,例如将其拆分为多个操作来执行。

评估服务能力

经过上述方法优化后,在业务正常运行的情况下,还是经常遇到实例整体的负载较高(平均CPU使用率在50%以上),可能存在性能瓶颈。

首先,应排查是否存在异常的业务访问,例如异常的命令、来自某台应用主机的异常访问等,此类情况需要从业务上进行优化。如果均为正常访问,此时的高负载是正常业务行为,为保障业务平稳运行,建议升级实例的规格,或将其升级为集群架构读写分离架构。关于如何升级实例,请参见变更实例配置

说明 为保障业务的正常运行,在正式升级实例前,建议先购买一个按量付费的实例,完成业务负载和兼容性测试,测试完成后可将其释放。