Redis中的高CPU使用率

默认情况下,Redis使用单线程模型来处理读写请求。高CPU使用率可能导致数据库响应变慢,影响正常的业务操作。

检查CPU使用情况

您可以从实例本身或Pods的角度检查CPU使用情况。

  • 使用Redis的info命令获取Redis实例的CPU使用统计信息。您还可以在Redis实例详情 > 监控中找到相应的指标。

    指标名称说明
    Cpu Userused_cpu_user:用户模式下的CPU使用率。used_cpu_user_children:后台进程在用户模式下使用的CPU。
    Cpu Sysused_cpu_sys:系统模式下的CPU使用率。used_cpu_sys_children:后台进程在系统模式下使用的CPU。
  • Redis下每个Pod的CPU使用统计信息将按Pod逐一显示,展示每个容器的CPU统计情况。您可以在Redis实例详情 > 副本 > StatefulSet > Pods中找到相应的Pod CPU监控。

    指标名称说明
    CPU使用率每个Pod的CPU使用情况。

如何排查高CPU使用率?

  1. 检查Redis日志中的错误或警告信息。

  2. 使用类似top或htop的系统级监控工具检查Redis进程的CPU使用率、内存使用情况及其他信息,确定是否仅是Redis进程的CPU使用率高,或整个系统的负载是否过重。

  3. 检查Redis配置文件中的maxmemory参数是否设置合理。如果Redis超出maxmemory限制,可能会导致高CPU使用率。

  4. 验证Redis的持久化方式是否正确。如果Redis的持久化配置不合理,例如频繁的AOF操作,可能导致高CPU使用率。

  5. 检查是否存在慢查询。

    在使用默认参数启动的Redis实例中,执行时间超过20毫秒的查询被视为慢查询。执行时间是指执行一个查询命令所用的时间,不包括客户端响应(交谈)、发送回复和其他IO操作。可以通过参数slowlog-log-slower-thanslowlog-max-len自定义慢查询阈值和保留数量。可以使用Redis的slowlog get命令查看慢查询。

    通常,Redis命令的CPU使用率与其时间复杂度密切相关。通常认为,在业务代码设计中,O(N)复杂度或以上的命令在流量评估时应谨慎使用。有关每个Redis命令的时间复杂度,请参阅Redis官方文档

    最常见的慢日志包括KEYSLRANGEEVALHGETALLPUBSUB等。这些通常涉及扫描大数据集或在Redis中进行大量计算逻辑的命令。由于Redis支持多种数据类型,常见的数据类型如哈希和列表的长度限制较高,可能导致实际使用中的大键问题。

  6. 检查是否有过量的客户端请求量发送到Redis。过量的客户端请求量可能导致高CPU使用率。

    如果没有明显的慢查询,请考虑是否客户端请求量过大。如果CPU使用率突然增加而业务代码没有变化,请监控Redis实例的QPS以查看是否出现峰值。

    如果确认CPU使用率激增是由于正常的业务流量增长或热键造成的,您可以通过架构升级来解决:

    • 对于极端热的哈希键,考虑将其拆分为字符串类型并在多个Redis实例中分散。

    • 对于极端热的字符串键,如果在您的业务架构中不便于实施流量限制,可以考虑增加多线程配置并提升实例的CPU规格。

    • 对于读操作频繁的场景,可以考虑在哨兵模式下添加只读实例以处理高并发的读取请求,或者在业务代码中添加缓存逻辑;在集群模式下,可以考虑增加分片。

    • 对于写操作频繁而读操作较少的场景,建议在集群模式下使用Redis。

  7. 如果您在集群模式下使用Redis,请检查是否存在不均匀的流量分配。当集群中存在响应延迟时,如果提供外部服务的所有节点的CPU使用率均高,请考虑更改数据分配规则或扩展实例。

  8. 如果在Redis中使用Lua脚本,请检查脚本中是否存在可能导致高CPU使用率的问题。