使用 Redis 命令进行高级故障排除

Azure托管 Redis 支持许多内置 Redis 命令,这些命令可帮助你监视性能、诊断问题并了解缓存的行为。 您可以在 Azure 门户的控制台边栏窗口中运行这些命令,也可以通过任何连接到您的缓存的 Redis 客户端运行这些命令。

本文介绍最常用的诊断命令,并介绍了它们在 Azure Managed Redis 上的行为方式。

SLOWLOG

Redis 慢日志记录执行时间超过可配置阈值的命令。 使用它查找可能导致延迟或超时问题的昂贵命令。

执行时间仅度量 Redis 引擎处理命令的时间。 它不包括网络 I/O、客户端通信或在队列中等待所花费的时间。

SLOWLOG 在 Azure 托管 Redis 上的工作原理

Azure托管 Redis 使用 Redis Enterprise,它通过代理层路由所有客户端流量。 SLOWLOG 的行为取决于缓存上配置的群集策略:

  • 企业集群策略:代理会自动将 SLOWLOG GET、SLOWLOG LEN 和 SLOWLOG RESET 分发到所有主分片,并以一个统一列表返回合并后的结果。 无需查询单个分片即可获取慢速命令的群集范围视图。
  • OSS 群集策略:每个节点都有自己的终结点,SLOWLOG 仅从该节点的本地分片返回条目。 在 OSS 群集模式下,Redis 客户端库根据密钥哈希槽自动将命令路由到正确的节点。 若要在整个缓存中收集慢速命令的完整视图,客户端库必须查询每个节点。 大多数 Redis 客户端库都通过支持集群的命令来实现这一点。

SLOWLOG 命令

命令 DESCRIPTION
SLOWLOG GET [count] 获取最新的慢命令条目。 可选 count 限制返回的条目数。
SLOWLOG LEN 返回当前慢日志中的条目数。
SLOWLOG RESET 清除慢速日志中的所有条目。

配置 SLOWLOG

两个配置参数控制 SLOWLOG 行为:

参数 DESCRIPTION 默认
slowlog-log-slower-than 阈值(以微秒为单位)。 记录超过此值的命令。 将其设置为 0 以记录每条命令。 设置为 -1,禁用。 10,000 (10 毫秒)
slowlog-max-len 每个分片存储的最大条目数。 日志已满时,将删除最早的条目。 128

若要查看或更改这些设置,请执行以下操作:

CONFIG GET slowlog-log-slower-than
CONFIG SET slowlog-log-slower-than 5000
CONFIG GET slowlog-max-len
CONFIG SET slowlog-max-len 256

注释

该 slowlog-max-len 设置适用于每个分片。 在具有企业群集策略的缓存中, SLOWLOG GET 返回所有主分片的合并结果,因此返回的条目总数最多可以 slowlog-max-len 乘以主分片数。 允许的最大值为 slowlog-max-len 1,024。

解读 SLOWLOG 结果

  • 执行时间仅为分片处理时间。 这不包括网络延迟、代理开销或在命令队列中等待的时间。
  • 条目 ID 可能不会在重启时按顺序排列。 发生故障转移或分片重启时,条目 ID 计数器会重置。 改用时间戳、执行时间和命令的组合来标识唯一条目。
  • 内部群集流量。 在低阈值(低于 1,000 微秒)时,你可能会看到内部群集管理命令,例如 INFO 和 PING。 这些命令是正常的,可以忽略。

常见的昂贵命令

命令 时间复杂性 Recommendation
KEYS * O(N) 替换为 SCAN 以进行增量迭代。
SORT O(N+M*log(M)) 对于大型集合,应避免这样做,或使用 LIMIT 和 BY 子句。
LRANGE 在大型列表中 O(S+N) 使用小范围分页。
SMEMBERS 在大型数据集上 O(N) 使用 SSCAN 进行增量迭代。
HGETALL 关于较大的哈希 O(N) 使用 HSCAN 或 HMGET 用于特定字段。
ZRANGEBYSCORE 在大型有序集合上 O(log(N)+M) 用于 LIMIT 限制结果大小。

有关 SLOWLOG 命令的完整参考,请参阅 Redis 文档中的 SLOWLOG GET。

信息

该 INFO 命令以易于读取和分析的格式返回有关 Redis 服务器的信息和统计信息。 它涵盖内存使用情况、CPU 消耗、复制状态、密钥空间统计信息等。

INFO [section]

常用部分:

章节 DESCRIPTION
INFO memory 内存使用情况、碎片比率和分配器统计信息。
INFO cpu Redis 进程消耗的 CPU 时间。
INFO stats 常规统计数据,例如接收的连接总数、已处理的命令数,以及键空间命中次数和未命中次数。
INFO replication 复制状态,包括实例是主实例还是副本和复制偏移量。
INFO keyspace 数据库级密钥计数和过期统计信息。
INFO clients 已连接客户端数量和被阻止客户端数量。
INFO server Redis 版本、运行时间和配置详细信息。

注释

对于采用 Enterprise Cluster 策略的 Azure Managed Redis,INFO 会返回你所连接节点的聚合信息。 使用 OSS 群集策略,每个节点终结点返回自己的本地信息。

有关完整的命令参考,请参阅 Redis 文档中的 INFO。

监视

该 MONITOR 命令实时流式传输 Redis 服务器处理的每个命令。 此命令可用于调试,因为你可以准确查看应用程序发送的命令。

MONITOR

Warning

MONITOR 资源密集型,可能会降低缓存性能。 它仅用于非生产环境中的简短调试会话。 不要让 MONITOR 在生产环境中运行。

有关完整的命令参考,请参阅 Redis 文档中的 MONITOR 。

命令统计信息

该 INFO commandstats 部分提供每命令执行统计信息,包括每个命令类型的调用数、总执行时间和平均执行时间。

INFO commandstats

使用命令统计信息可以执行以下操作:

  • 查找哪些命令类型消耗了执行时间最多的时间。
  • 识别不经常调用但成本高昂的命令。
  • 为您的工作负载建立正常命令模式基线。

有关详细信息,请参阅 commandstats Redis 文档中 INFO 下的部分。

  1. 检查缓存延迟指标。 在Azure门户中,打开缓存并选择“监视>指标”。 添加 缓存延迟(微秒) 指标。 如果看到持续的高值,请转到下一步。

  2. 查看慢日志。

    SLOWLOG GET 25
    

    查找执行时间高或频繁出现的命令。

  3. 查看命令统计信息。 运行 INFO commandstats 以查看哪些命令类型在工作负荷中消耗的时间最多。

  4. 根据需要降低 SLOWLOG 阈值。 如果慢速日志为空,但延迟较高,请暂时降低阈值:

    CONFIG SET slowlog-log-slower-than 1000
    
  5. 识别并优化。 常见模式包括:

    • 主宰日志的单个命令类型 - 优化或替换命令。
    • 针对特定大型键的命令——请考虑拆分大型数据结构。
    • 在同一时间戳处条目集中出现——表明存在一个阻塞命令,使其他命令在其后排队。
  6. 重置并监控。 进行更改后,清除慢速日志并再次检查:

    SLOWLOG RESET
    
  7. 还原默认值。 诊断后,还原默认的 SLOWLOG 阈值:

    CONFIG SET slowlog-log-slower-than 10000