Redis实例CPU使用率达到100%的原因
问题现象
Redis实例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”。
Redis使用所有常见问题
- 什么是预留内存,如何配置预留内存?
- Redis实例CPU使用率达到100%的原因
- Redis实例能否修改VPC和子网?
- Redis 4.0/5.0/6.0实例为什么不支持安全组?
- Redis实例支持的单个Key和Value数据大小是否有限制?
- Redis集群可以读取每个节点的IP地址吗?
- 创建的缓存实例为什么可使用内存比实例规格少一些?
- Redis实例是否支持读写分离?
- Redis实例是否支持多DB方式?
- Redis集群实例是否支持原生集群?
- 什么是哨兵?
- Redis实例是否支持哨兵模式?
- Redis默认的数据逐出策略是什么?
- 使用redis_exporter出错怎么办?
- Redis的安全加固方面有哪些建议?
- Redis 3.0 Proxy集群不支持redisson分布式锁的原因
- 实例是否支持自定义或修改端口?
- 实例是否支持修改访问地址?
- 按需实例转包周期失败是什么原因?
- 按需实例转包周期需要停服么?
- 实例无法删除是什么原因?
- DCS实例是否支持跨可用区部署?
- 集群实例启动时间过长是什么原因?
- 客户使用Redis版本和DCS Redis版本不同是否存在兼容问题?
- DCS Redis有没有后台管理软件?
- Redis实例经常内存满了但是key不多的原因
- DCS缓存实例的数据被删除之后,能否找回?
- Redis实例是否支持SSL连接?
- 如何修改Redis 3.0实例的SSL开关?
- 为什么实例实际可用内存比申请规格小而且已使用内存不为0?
- 如何估算Redis内存占用量
- Cluster集群实例容量和性能未达到瓶颈,但某个分片容量或性能已过载是什么原因?
- DCS是否支持外部扩展模块、插件或者Module?
- Redis key丢失是什么原因
- 访问Redis报OOM错误提示
- 不同编程语言如何使用Cluster集群客户端
- 使用Cluster的Redis集群时建议配置合理的超时时间
- 读取redis数据报超时错误
- Proxy集群使用多DB限制
- 实例是否支持变更可用区
- hashtag的原理、规则及用法示例
- 重启实例后缓存数据会保留吗?
- 如何购买多DB的Proxy集群实例?
more
