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使用率高。

解决方法:

通常是由于热点Key引起,应在分析相应节点的慢日志和审计日志的基础上,再分析各节点的热点Key,从而消除或缓解热点Key。具体操作,请参见查询实时热点Key

优化短连接

现象:

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

解决方法:

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

关闭AOF

现象:

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

解决方法:

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

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

评估服务能力

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

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

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