默认情况下,Redis 使用单线程模型来处理读写请求。高 CPU 使用率可能导致数据库响应变慢,影响正常的业务运行。
您可以从实例自身或 Pods 的角度检查 CPU 使用率。
使用 Redis 的 info 命令获取 Redis 实例自身的 CPU 使用统计信息。您也可以在 Redis Instance Details > Monitoring 中找到对应的指标。
| 指标名称 | 含义 |
|---|---|
| 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 维度展示,显示每个 Pod 下各容器的 CPU 统计信息。您可以在 Redis Instance Details > Replicas > StatefulSet > Pods 中查看对应的 Pod CPU 监控。
| 指标名称 | 含义 |
|---|---|
| CPU Usage | 每个 Pod 的 CPU 使用率。 |
检查 Redis 日志中是否有错误或警告信息。
使用系统级监控工具如 top 或 htop 检查 Redis 进程的 CPU 使用率、内存使用情况等信息,判断是否仅 Redis 进程的 CPU 使用率高,还是整个系统负载较重。
检查 Redis 配置文件中的 maxmemory 参数是否设置合理。Redis 超过 maxmemory 限制时,可能导致高 CPU 使用率。
确认 Redis 的持久化方式是否正确。如果 Redis 持久化配置不合理,例如频繁的 AOF 操作,可能会引起高 CPU 使用率。
检查慢查询。
在使用默认参数启动的 Redis 实例中,执行时间超过 20ms 的查询被视为慢查询。执行时间指的是执行查询命令的时间,不包括客户端响应(talking)、发送回复及其他 IO 操作时间。您可以通过参数 slowlog-log-slower-than 和 slowlog-max-len 自定义慢查询阈值和保留数量。可以使用 Redis 的 slowlog get 命令查看慢查询。
通常,Redis 命令的 CPU 使用率与其时间复杂度密切相关。一般认为,时间复杂度达到 O(N) 或以上的命令,在业务代码设计时应谨慎评估流量。各 Redis 命令的时间复杂度请参考 Redis 官方文档。
常见的慢日志命令包括 KEYS、LRANGE、EVAL、HGETALL、PUBSUB 等,这些通常涉及扫描大数据集或 Redis 中的复杂计算逻辑。由于 Redis 支持多种数据类型,常见数据类型如 hash 和 list 的长度限制较高,实际使用中可能出现大 key 问题。
检查是否存在过多的客户端请求量。过高的客户端请求量可能导致高 CPU 使用率。
如果没有明显的慢查询,考虑客户端请求量是否过大。如果 CPU 使用率突然升高且业务代码无变化,监控 Redis 实例的 QPS 是否出现峰值。
如果确认 CPU 使用率激增是由于正常业务流量增长或热点 key 导致,可以通过架构升级进行应对:
对于极热的 hash key,考虑拆分为 string 类型并分布到多个 Redis 实例。
对于极热的 string key,如果业务架构中无法做限流,考虑增加多线程配置并提升实例的 CPU 规格。
对于读多写少场景,可以考虑在 Sentinel 模式下增加只读实例以应对高并发读请求,或在业务代码中增加缓存逻辑;在集群模式下,可以考虑增加分片。
对于写多读少场景,建议使用 Redis 集群模式。
如果使用 Redis 集群模式,检查流量分布是否均匀。当集群出现响应延迟,且所有对外服务节点 CPU 使用率都较高时,考虑调整数据分布规则或扩容实例。
如果 Redis 中使用了 Lua 脚本,检查脚本是否存在导致高 CPU 使用率的问题。