Redis 中的高 CPU 使用率
默认情况下,Redis 使用单线程模型来处理读写请求。高 CPU 使用率可能导致数据库响应变慢,影响正常的业务运行。
检查 CPU 使用率
您可以从实例自身或 Pods 的角度检查 CPU 使用率。
-
使用 Redis 的
info命令获取 Redis 实例自身的 CPU 使用统计信息。您也可以在 Redis Instance Details > Monitoring 中找到对应的指标。 -
Redis 下每个 Pod 的 CPU 使用统计会按 Pod 维度展示,显示每个 Pod 下各容器的 CPU 统计信息。您可以在 Redis Instance Details > Replicas > StatefulSet > Pods 中查看对应的 Pod CPU 监控。
如何排查高 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 使用率的问题。