文档首页/ 分布式缓存服务 DCS/ 故障排除/ Redis实例CPU使用率高问题排查和解决
更新时间:2024-06-19 GMT+08:00

Redis实例CPU使用率高问题排查和解决

问题现象

Redis实例CPU使用率短时间内冲高。CPU过高可能会导致连接超时,影响业务。CPU过高也可能触发主备倒换。

可能原因

  1. 客户的业务负载过重,QPS过高,导致CPU被用满,排查方法请参考排查QPS是否过高
  2. 使用了keys等消耗资源的命令,排查及处理措施请参考查找并禁用高消耗命令
  3. 发生Redis的持久化重写操作,排查及处理措施请参考是否存在Redis的持久化重写操作

排查QPS是否过高

在分布式缓存服务控制台的缓存管理页面,单击实例进入实例详情界面,单击左侧的性能监控,进入性能监控页面,查询实例级别的每秒并发操作数(QPS)。

如果QPS过高,建议优化客户业务或者变更实例规格。不同实例规格支持的QPS请参考实例规格

查找并禁用高消耗命令

使用了keys等消耗资源的命令,高消耗资源的命令即时间复杂度为O(N)或更高的命令,通常情况下,命令时间复杂度越高,在执行时消耗的资源越高,这会导致CPU使用率超高,容易触发主备倒换。关于各命令对应的时间复杂度信息请参见Redis官网。例如,使用了keys等消耗资源的命令,导致CPU超高,建议客户改成scan命令或者禁用keys命令。

  1. 通过性能监控功能,确认CPU使用率高的具体时间段。

  2. 通过下述方法,找出高消耗的命令。

    • 慢查询功能会记录执行超过指定时间阈值的命令,通过分析慢查询的语句和执行时长可帮助您找出高消耗命令,具体操参见慢查询
    • 通过实例诊断功能,选择CPU冲高的时间点进行诊断后,可以看到报告中的对应时间段命令的执行情况以及CPU耗时百分比,具体操作参见实例诊断

  3. 处理措施。

    • 评估并禁用高风险命令和高消耗命令,例如FLUSHALLKEYSHGETALL等。
    • 优化业务,例如避免频繁执行数据排序操作。
    • 可选:根据业务情况,选择下述方法对实例进行调整:
      • 调整实例为读写分离实例,对高消耗命令或应用进行分流。
      • 扩容实例增强实例处理能力。

是否存在Redis的持久化重写操作

除单机及单副本Cluster集群实例外,华为云其他Redis实例默认开启AOF数据落盘,实例开启了AOF持久化功能后,会定期进行AofRewrite的磁盘整理,AOF磁盘持久化整理一般在以下2种场景执行:

  • 数据量写入不大,AOF文件不大时,固定在每天的凌晨1-4点进行AOF持久化重写。所以容易出现这个时间点实例CPU使用率超高的现象。
  • 数据量写入过大,AOF文件大小超过阈值(缓存实例容量的3-5倍)时,不论当前的所处的时间,会自动触发后台AOF持久化重写。

Redis的持久化重写操作(Bgsave或Bgrewriteaof)比较消耗CPU资源(请参考为什么使用Fork执行Bgsave和Bgrewriteaof),Bgsave和Bgrewriteaof会调用系统的Fork机制,造成CPU短暂时间冲高。

如果客户没有需要用到持久化功能,建议将该功能关闭(请根据实际业务慎重操作,关闭持久化功能会导致极端故障场景下恢复时,由于没有落盘造成的数据丢失)。关闭操作:在实例详情页面,选择“配置参数”页签,将“appendonly”修改为“no”。