第2章 缓存耗时异常现象识别

缓存耗时异常不会凭空出现,它总是以一组可观测的“症状”浮现在监控屏上。本章围绕四种最典型的异常现象——响应延迟波动、吞吐量下降、缓存命中率骤降、业务超时,建立从现象到根因的完整排查链路。全章按照“现象识别 → 数据采集 → 原因定位 → 修复动作 → 复测 → 预防”展开,每一阶段都配有可直接落地的排查工具与判断标准。

2.1 四种典型异常现象速览

下表从观测窗口、典型指标、第一怀疑对象三个维度快速定义四种现象,帮助你在收到告警时立即完成初步归类。

现象 观测窗口 典型指标阈值 第一怀疑对象
响应延迟波动 分钟级~小时级 p99 变异系数 > 0.3;延迟标准差 > 基线 2× 大 Value、GC 暂停、热点 Key
吞吐量下降 小时级~天级 QPS 下降 > 20%;线程池活跃数 < 70% 缓存雪崩、连接池耗尽
缓存命中率骤降 分钟级~小时级 命中率 < 80% 且 5 分钟内跌幅 > 15% 缓存穿透、缓存击穿、Key 大量过期
业务超时 秒级~分钟级 超时率 > 1%;平均响应时间 > 客户端超时阈值 80% 缓存雪崩、GC 暂停、网络抖动的连锁效应
现场速判口诀:
延迟看 p99 变异系数,吞吐看 QPS 趋势线,命中率盯跌幅斜率,超时数客户端重试日志。四个指标对齐后,现象归属就不难。

2.2 现象识别决策树

下图以“缓存耗时异常”为起点,根据四个可定量判断的问题分支,引导你快速识别当前属于哪种现象,并直接给出下一阶段的数据采集建议。

缓存耗时异常 · 现象识别决策树 缓存耗时异常 p99波动大? QPS下降? 命中率低? 超时增多? 响应延迟波动 吞吐量下降 命中率骤降 业务超时 Trace + 延迟分布 p99/p50/火焰图 QPS + 线程池监控 活跃数/排队数 命中率 + Key 分析 过期分布/穿透率 超时日志 + 堆栈 客户端重试/异常链 交叉验证:Trace span + Metrics 对齐
决策树使用说明: 从顶部“缓存耗时异常”开始,依次回答四个判断问题。若多个分支同时为“是”,则按“超时 → 命中率 → 延迟 → 吞吐”优先级处理,因为超时对业务影响最直接。

2.3 数据采集方法与 Trace 命令

确认现象归属后,立即执行对应的数据采集。以下是四种现象的标准采集命令与日志示例。

2.3.1 响应延迟波动 → 采集 Trace 延迟分布

# 使用 perf-trace 采集 60 秒缓存调用栈
perf-trace record -e cache:redis_get -ag -- sleep 60

# 输出延迟分布直方图
perf-trace report --sort=delay --percent-limit=1

# 实时查看 p99/p50 延迟
redis-cli --latency -h <cache_host> -p 6379

2.3.2 吞吐量下降 → 采集 QPS 与线程池

# 缓存服务端 QPS 监控
redis-cli info stats | grep instantaneous_ops_per_sec

# 应用端线程池活跃数
jstack <pid> | grep "pool-" | awk '{print $2,$5}' | sort | uniq -c

# 采集 5 分钟 QPS 曲线
sar -n TCP 1 300 > /tmp/tcp_qps.log

2.3.3 命中率骤降 → 采集 Key 过期与穿透

# 缓存命中率
redis-cli info stats | grep keyspace_hits
redis-cli info stats | grep keyspace_misses

# 过期 Key 分布(抽样)
redis-cli --bigkeys -i 0.1

# Trace 穿透请求
strace -e trace=network -p <cache_pid> -o /tmp/cache_trace.log

# 查看当前过期 Key 数量
redis-cli info keyspace | grep -E "keys=|expires="

2.3.4 业务超时 → 采集超时日志与堆栈

# 应用端超时日志(典型格式)
tail -f /var/log/app/error.log | grep "TimeoutException"

# 缓存客户端超时堆栈
jstack -l <pid> | grep -A 20 "redis.clients.jedis.exceptions.JedisConnectionException"

# 网络往返延迟
ping -c 100 <cache_host> | tail -3
采集避坑: 不要在业务高峰期执行长时间的 strace 或 bigkeys 扫描,可能引发二次性能抖动。优先用采样模式(-i 0.1)或只采集 30 秒。

2.4 原因定位排查表

将采集到的数据与下表对照,快速定位根因。表中列出了每种现象最常见的前三位根因及判断规则。

<
现象 根因 判断规则 关键证据
响应延迟波动 大 Value 延迟 > 100ms 且 Value 大小 > 10KB bigkeys 输出中 value_size > 10KB 的 key
GC 暂停 延迟尖峰与 GC pause 时间戳对齐 GC 日志中 "pause_time > 200ms" 与 Trace 尖峰重合
热点 Key 单个 Key QPS > 总 QPS 的 30% redis-cli --hotkeys 输出频次 top1
吞吐量下降