*Redis LATENCY 命令

LATENCY 是 Redis 延迟监控子系统的前缀命令,包含多个子命令(LATENCY LATESTLATENCY HISTORYLATENCY RESETLATENCY GRAPHLATENCY DOCTOR)用于记录、分析和诊断 Redis 内部事件延迟。


*语法

LATENCY subcommand [argument ...]

*子命令说明

子命令 参数 说明
LATEST 返回所有延迟事件最近的数据点(名称、时间戳、延迟、最大延迟)
HISTORY event-name event-name 返回指定延迟事件的历史数据数组(最多 160 个采样点)
GRAPH event-name event-name 以 ASCII 直方图形式展示指定事件的历史延迟
RESET [event-name ...] 可选事件名 重置指定事件或所有事件的延迟历史数据,返回重置的事件数
DOCTOR 输出延迟诊断报告,给出可能的问题原因和建议
HELP 返回 LATENCY 命令的帮助信息

常见延迟事件名称:

  • command:命令执行延迟
  • fast-command:快速命令执行延迟
  • fork:BGSAVE / BGREWRITEAOF 时的 fork 延迟
  • rdb-unlink-temp-file:RDB 临时文件删除延迟
  • aof-fsync-always:AOF fsync=always 时的延迟
  • aof-write:AOF 写入延迟
  • aof-write-active-child:存在子进程时的 AOF 写入延迟

*返回值

  • 各子命令返回值不同:
    • LATEST:Array of arrays,每个元素为 [event-name, timestamp, latest-delay, max-delay]
    • HISTORY:Array of [timestamp, delay] 对
    • GRAPH:ASCII 直方图字符串
    • RESET:Integer,重置的事件数量
    • DOCTOR:String,诊断报告文本
    • HELP:Array,帮助信息

*时间复杂度

O(N),其中 N 为采样点数量(HISTORY / GRAPH)或事件数量(LATEST / RESET)。


*示例

*查看最新延迟

> LATENCY LATEST
1) 1) "command"
   2) (integer) 1717489200
   3) (integer) 150
   4) (integer) 500

*查看 fork 事件历史

> LATENCY HISTORY fork
1) 1) (integer) 1717489000
   2) (integer) 200
2) 1) (integer) 1717489100
   2) (integer) 180

*ASCII 图形展示

> LATENCY GRAPH fork
fork - high level ops/sec 4.2K
.--.
|\ .
|. \
| .\
|  .\ 
.---'

*延迟诊断报告

> LATENCY DOCTOR
Dave, I have observed ...
I'm sorry, but there are no latency issues here.

*重置数据

> LATENCY RESET fork
(integer) 1

*常见错误

错误 原因 解决
ERR unknown subcommand or wrong number of arguments 子命令拼写错误或参数数量不对 检查子命令名称和所需参数
Latency monitoring not enabled. 未启用延迟监控 配置 latency-monitor-threshold 100(单位毫秒)后重启或 CONFIG SET

*最佳实践

  • 延迟监控默认关闭,需在配置文件中设置 latency-monitor-threshold 100(记录超过 100ms 的事件)
  • LATENCY DOCTOR 是排查性能问题的利器,会自动分析数据并给出建议(如 fork 延迟高建议检查内存和 THP)
  • 生产环境建议配合 LATENCY LATEST 定期采样,告警阈值应根据业务 SLA 设定
  • 高延迟事件通常与 fork、AOF fsync、大 key 删除、RDB 写入有关,重点监控这几个事件

*FAQ

Q1: 为什么 LATENCY LATEST 返回空数组? A: 延迟监控默认未启用。需要设置 latency-monitor-threshold N(记录超过 N 毫秒的事件),设置后仅记录超过阈值的延迟事件。

Q2: LATENCY 和 SLOWLOG 有什么区别? A: SLOWLOG 记录执行时间超过阈值的具体命令(含完整参数);LATENCY 记录内部事件的延迟(如 fork、fsync)。两者互补,SLOWLOG 看命令层面,LATENCY 看系统层面。

Q3: 延迟监控会消耗很多资源吗? A: 不会。延迟监控是采样机制,最多保留 160 个数据点,内存和 CPU 开销极低。但不应将阈值设得过低(如 1ms),否则会产生大量采样数据。