Redis实例CPU使用率高问题排查和解决
问题现象
Redis实例CPU使用率短时间内冲高。CPU过高可能会导致连接超时,影响业务。CPU过高也可能触发主备倒换。
可能原因
- 客户的业务负载过重,QPS过高,导致CPU被用满,排查方法请参考排查QPS是否过高。
- 使用了keys等消耗资源的命令,排查及处理措施请参考查找并禁用高消耗命令。
- 发生Redis的持久化重写操作,排查及处理措施请参考是否存在Redis的持久化重写操作。
查找并禁用高消耗命令
使用了keys等消耗资源的命令,高消耗资源的命令即时间复杂度为O(N)或更高的命令,通常情况下,命令时间复杂度越高,在执行时消耗的资源越高,这会导致CPU使用率超高,容易触发主备倒换。关于各命令对应的时间复杂度信息请参见Redis官网。例如,使用了keys等消耗资源的命令,导致CPU超高,建议客户改成scan命令或者禁用keys命令。
- 通过性能监控功能,确认CPU使用率高的具体时间段。
- 通过下述方法,找出高消耗的命令。
- 处理措施。
- 评估并禁用高风险命令和高消耗命令,例如FLUSHALL、KEYS、HGETALL等。
- 优化业务,例如避免频繁执行数据排序操作。
- 可选:根据业务情况,选择下述方法对实例进行调整:
- 调整实例为读写分离实例,对高消耗命令或应用进行分流。
- 扩容实例增强实例处理能力。
是否存在Redis的持久化重写操作
对于主备和集群实例,华为云Redis实例默认开启AOF数据落盘,实例开启了AOF持久化功能后,华为云Redis会定期进行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”。