latency monitor 是记录 redis 主线程阻塞位置与时长的工具,非测延迟;需 config set latency-monitor-threshold > 0 开启,建议按 sla 的 50%–70% 设定阈值,修改后立即生效但需 config rewrite 持久化。

Latency Monitor 不是“测延迟”,而是“录卡点”——它只记录 Redis 主线程被阻塞的具体位置和时长,LATENCY DOCTOR 才负责把零散的卡点连成因果链。没开监控就跑 LATENCY DOCTOR,它只会回你一句 “Dave, I have observed latency spikes…” 然后沉默。
CONFIG SET latency-monitor-threshold 必须大于 0
这是整个机制的开关,设为 0 就等于关掉所有钩子。线上实例默认就是 0,不显式设置就不会存任何事件。
- 阈值不是越小越好:
latency-monitor-threshold 1会高频记录fast-command类抖动,掩盖真正问题;建议按 SLA 的 50%–70% 设,比如业务容忍 ≤80 ms,就设100或60 - 修改后无需重启:直接
CONFIG SET latency-monitor-threshold 100,返回OK即生效 - 注意持久化:如果写进
redis.conf,记得同步CONFIG REWRITE,否则重启丢失
LATENCY HISTORY fork vs LATENCY HISTORY command 区分根因类型
fork 和 command 是两类完全不同的瓶颈:fork 是操作系统级挂起(BGSAVE/BGREWRITEAOF),command 是 Redis 自身命令执行慢(如 KEYS、ZINTERSTORE)。混着看会误判。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
LATENCY HISTORY fork出 spike → 查宿主机内存压力、页表大小、是否开启透明大页(THP) -
LATENCY HISTORY command出 spike → 结合SLOWLOG GET看具体命令,重点盯O(N)操作和大 value 删除 -
LATENCY HISTORY expire-cycle高频出现 → 检查是否有大量 key 在同一秒过期,改用随机 TTL 偏移
LATENCY DOCTOR 输出里藏着三个关键线索
它不直接说“你该改什么”,但每行都带可操作指向。重点盯这三处:
- “Your current Slow Log configuration only logs events that are slower than your configured latency monitor threshold” → 说明
slowlog-log-slower-than太大,漏掉了中等耗时命令,应调低(比如设为1000) - “Deleting, expiring or evicting large objects is a blocking operation” → 不是让你删 key,而是提示你检查
INFO memory中used_memory_peak_human和淘汰策略是否频繁触发 - “Worst all time event 500ms” → 这个值来自历史最大桶,不是实时值;如果它远高于当前
LATENCY LATEST,说明问题已缓解但未根除
redis-cli --intrinsic-latency 只能在服务端本机跑
这个命令测的是操作系统+虚拟化层给 Redis 带来的固有延迟底限,结果不准或报错,99% 是因为没在 Redis 进程所在机器执行。
- 容器环境必须进容器内执行:
kubectl exec -it redis-pod -- redis-cli --intrinsic-latency 60 - 输出里若出现
2000000 usecs(即 2 秒)以上波动,基本可判定是 CPU 被强抢占或启用了 CPU 频率调节器(ondemand模式) - 它和
LATENCY DOCTOR无直接关联,但若 intrinsic latency 已达 5ms,再谈“优化 Redis”就是本末倒置
真正难的不是跑出 LATENCY DOCTOR 报告,而是判断哪一行建议该信、哪一行该跳过——比如它总提“fragment large objects”,但如果你的业务模型根本无法拆,就得转去压 maxmemory-policy 或换 LFU 淘汰策略。










