
# Redis实例CPU使用率高问题排查和解决
#### 问题现象
Redis实例CPU使用率短时间内冲高。CPU过高可能会导致连接超时，影响业务。CPU过高也可能触发主备倒换。
#### 可能原因
1. 客户的业务负载过重，QPS过高，导致CPU被用满，排查方法请参考[排查QPS是否过高]。
2. 使用了keys等消耗资源的命令，排查及处理措施请参考[查找并禁用高消耗命令]。
3. 发生Redis的持久化重写操作，排查及处理措施请参考[是否存在Redis的持久化重写操作]。
4. 如果实例扩容后存在CPU短暂冲高现象，属于正常现象，稳定后会趋于平稳，对业务无影响。
 
 #### 排查QPS是否过高
在分布式缓存服务控制台的缓存管理页面，单击实例进入实例详情界面，单击左侧的性能监控，进入性能监控页面，查询实例级别的每秒并发操作数（QPS）。
如果QPS过高，建议优化客户业务或者[变更实例规格](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0713006.html)。不同实例规格支持的QPS请参考[实例规格](https://support.huaweicloud.com/productdesc-dcs/dcs-pd-200713003.html)。
 #### 查找并禁用高消耗命令
使用了keys等消耗资源的命令，高消耗资源的命令即时间复杂度为O(N)或更高的命令，通常情况下，命令时间复杂度越高，在执行时消耗的资源越高，这会导致CPU使用率超高，容易触发主备倒换。关于各命令对应的时间复杂度信息请参见[Redis官网](https://redis.io/commands/)。例如，使用了keys等消耗资源的命令，导致CPU超高，建议客户改成scan命令或者禁用keys命令。
1. 通过性能监控功能，确认CPU使用率高的具体时间段。 
   ![](https://support.huaweicloud.com/trouble-dcs/zh-cn_image_0000001161126414.png "点击放大")
   
   
2. 通过下述方法，找出高消耗的命令。 
   - 慢查询功能会记录执行超过指定时间阈值的命令，通过分析慢查询的语句和执行时长可帮助您找出高消耗命令，具体操参见[慢查询](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190926001.html)。
   
   - 通过实例诊断功能，选择CPU冲高的时间点进行诊断后，可以看到报告中的对应时间段命令的执行情况以及CPU耗时百分比，具体操作参见[实例诊断](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0107001.html)。
     ![](https://support.huaweicloud.com/trouble-dcs/zh-cn_image_0000001837072521.png "点击放大")
     
   
   
   
   
3. 处理措施。 
   - 评估并禁用高风险命令和高消耗命令，例如**FLUSHALL** 、**KEYS** 、**HGETALL**等。
   
   - 优化业务，例如避免频繁执行数据排序操作。
   
   - **可选：** 根据业务情况，选择下述方法对实例进行调整：
     - 调整实例为读写分离实例，对高消耗命令或应用进行分流。
     
     - 扩容实例增强实例处理能力。
      
   
   
   
   
 
 #### 是否存在Redis的持久化重写操作
除单机及单副本Cluster集群实例外，华为云其他Redis实例默认开启AOF数据落盘，实例开启了AOF持久化功能后，会定期进行AofRewrite的磁盘整理，AOF磁盘持久化整理一般在以下2种场景执行：
- 数据量写入不大，AOF文件不大时，固定在每天的凌晨1-4点进行AOF持久化重写。所以容易出现这个时间点实例CPU使用率超高的现象。
- 数据量写入过大，AOF文件大小超过阈值（缓存实例容量的4.5倍）时，不论当前的所处的时间，会自动触发后台AOF持久化重写。
Redis的持久化重写操作（Bgsave或Bgrewriteaof）比较消耗CPU资源（请参考[为什么使用Fork执行Bgsave和Bgrewriteaof](https://github.com/redis/redis/issues/6722)），Bgsave和Bgrewriteaof会调用系统的Fork机制，造成CPU短暂时间冲高。
如果客户没有需要用到持久化功能，建议将实例修改为仅从节点持久化（将实例参数appendonly设置为only-replica）或关闭持久化功能（将实例参数appendonly设置为no）。配置方式请参见[修改DCS实例配置参数](https://support.huaweicloud.com/usermanual-dcs/dcs-ug-0312024.html)。
![](https://support.huaweicloud.com/trouble-dcs/public_sys-resources/caution_3.0-zh-cn.png)
- 仅从节点持久化相对于主从节点同时持久化，因主节点减少了AOF写入和重写的影响，性能会有所提升，但可靠性会有所降低，请根据实际业务情况选择。
- 关闭持久化功能会导致极端故障场景下恢复时，由于没有落盘造成的数据丢失，请根据实际业务慎重操作。
 
