Redis实例CPU使用率高问题排查和解决
问题现象
Redis实例CPU使用率短时间内冲高。
可能原因
- 客户的业务负载过重,QPS过高,导致CPU被用满,排查方法请参考排查QPS是否过高。
- 使用了keys等消耗资源的命令,排查及处理措施请参考查找并禁用高消耗命令。
- 发生Redis的持久化重写操作,排查及处理措施请参考是否存在Redis的持久化重写操作。
排查QPS是否过高
在分布式缓存服务控制台的缓存管理页面,单击实例进入实例详情界面,单击左侧的性能监控,进去性能监控页面,可以查询实例级别的每秒并发操作数(QPS)。如果QPS过高,建议优化客户业务或者升级实例规格,不同实例规格的QPS请参考实例规格章节。
查找并禁用高消耗命令
使用了keys等消耗资源的命令,高消耗资源的命令即时间复杂度为O(N)或更高的命令,通常情况下,命令时间复杂度越高,在执行时消耗的资源越高,这会导致CPU使用率超高,容易触发主备倒换。关于各命令对应的时间复杂度信息请参见Redis官网。例如,使用了keys等消耗资源的命令,导致CPU超高,建议客户改成scan命令或者禁用keys命令。
- 通过性能监控功能,确认CPU使用率高的具体时间段。
- 通过下述方法,找出高消耗的命令。
- 慢查询功能会记录执行超过指定时间阈值的命令,通过分析慢查询的语句和执行时长可帮助您找出高消耗命令,具体操参见查询Redis实例慢查询。
- 通过实例诊断功能,选择CPU冲高的时间点进行诊断后,可以看到报告中的对应时间段命令的执行情况以及CPU耗时百分比,具体操作参见实例诊断。
- 处理措施。
- 评估并禁用高风险命令和高消耗命令,例如FLUSHALL、KEYS、HGETALL等。
- 优化业务,例如避免频繁执行数据排序操作。
- 可选:根据业务情况,选择下述方法对实例进行调整:
扩容实例增强实例处理能力。
是否存在Redis的持久化重写操作
对于主备和集群实例,DCS 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”。