默认情况下,Redis使用单线程模型来处理读写请求。高CPU使用率可能导致数据库响应变慢,影响正常的业务操作。
您可以从实例本身或Pods的角度检查CPU使用情况。
使用Redis的info
命令获取Redis实例的CPU使用统计信息。您还可以在Redis实例详情 > 监控中找到相应的指标。
指标名称 | 说明 |
---|---|
Cpu User | used_cpu_user:用户模式下的CPU使用率。used_cpu_user_children:后台进程在用户模式下使用的CPU。 |
Cpu Sys | used_cpu_sys:系统模式下的CPU使用率。used_cpu_sys_children:后台进程在系统模式下使用的CPU。 |
Redis下每个Pod的CPU使用统计信息将按Pod逐一显示,展示每个容器的CPU统计情况。您可以在Redis实例详情 > 副本 > StatefulSet > Pods中找到相应的Pod CPU监控。
指标名称 | 说明 |
---|---|
CPU使用率 | 每个Pod的CPU使用情况。 |
检查Redis日志中的错误或警告信息。
使用类似top或htop的系统级监控工具检查Redis进程的CPU使用率、内存使用情况及其他信息,确定是否仅是Redis进程的CPU使用率高,或整个系统的负载是否过重。
检查Redis配置文件中的maxmemory
参数是否设置合理。如果Redis超出maxmemory
限制,可能会导致高CPU使用率。
验证Redis的持久化方式是否正确。如果Redis的持久化配置不合理,例如频繁的AOF操作,可能导致高CPU使用率。
检查是否存在慢查询。
在使用默认参数启动的Redis实例中,执行时间超过20毫秒的查询被视为慢查询。执行时间是指执行一个查询命令所用的时间,不包括客户端响应(交谈)、发送回复和其他IO操作。可以通过参数slowlog-log-slower-than
和slowlog-max-len
自定义慢查询阈值和保留数量。可以使用Redis的slowlog get
命令查看慢查询。
通常,Redis命令的CPU使用率与其时间复杂度密切相关。通常认为,在业务代码设计中,O(N)复杂度或以上的命令在流量评估时应谨慎使用。有关每个Redis命令的时间复杂度,请参阅Redis官方文档。
最常见的慢日志包括KEYS
、LRANGE
、EVAL
、HGETALL
、PUBSUB
等。这些通常涉及扫描大数据集或在Redis中进行大量计算逻辑的命令。由于Redis支持多种数据类型,常见的数据类型如哈希和列表的长度限制较高,可能导致实际使用中的大键问题。
检查是否有过量的客户端请求量发送到Redis。过量的客户端请求量可能导致高CPU使用率。
如果没有明显的慢查询,请考虑是否客户端请求量过大。如果CPU使用率突然增加而业务代码没有变化,请监控Redis实例的QPS以查看是否出现峰值。
如果确认CPU使用率激增是由于正常的业务流量增长或热键造成的,您可以通过架构升级来解决:
对于极端热的哈希键,考虑将其拆分为字符串类型并在多个Redis实例中分散。
对于极端热的字符串键,如果在您的业务架构中不便于实施流量限制,可以考虑增加多线程配置并提升实例的CPU规格。
对于读操作频繁的场景,可以考虑在哨兵模式下添加只读实例以处理高并发的读取请求,或者在业务代码中添加缓存逻辑;在集群模式下,可以考虑增加分片。
对于写操作频繁而读操作较少的场景,建议在集群模式下使用Redis。
如果您在集群模式下使用Redis,请检查是否存在不均匀的流量分配。当集群中存在响应延迟时,如果提供外部服务的所有节点的CPU使用率均高,请考虑更改数据分配规则或扩展实例。
如果在Redis中使用Lua脚本,请检查脚本中是否存在可能导致高CPU使用率的问题。