跳转至

RUNBOOK:token-proxy 缓存探测(cache_probe)

本手册只覆盖 cache_probe 这一个功能;代理整体的启动/路由/计费见 docs/BASELINE.md(命令速查 §3)与 docs/HANDOFF.md。

1. 它是什么 / 异常时的业务影响

会话空闲 ≥1 h 后,代理先发一个「复用该会话前缀的前 50 K token」的极小请求, 读回 cached_tokens 算命中占比:

  • 命中 ≥90% → 缓存还在,正常转发(零感知);
  • 命中 <90% → 缓存已失效,返回 500 拒绝本次请求,提示「请先压缩上下文再继续」。

异常时的影响:仅在「空闲 ≥1 h 后的第一次请求」上生效。若本功能整体故障, 表现为探测失败 → 自动放行(业务不受影响),代价是退化为「按时间猜」的旧状态。

2. 日常速查表

# 1) 看当前生效参数(启动日志最后一行)
journalctl --user -u token-proxy -n 30 --no-pager | grep '代理启动'

# 2) 看最近的探测判定
journalctl --user -u token-proxy --since '1 hour ago' --no-pager | grep '缓存探测'

# 3) 看最近的拒绝
journalctl --user -u token-proxy --since '1 hour ago' --no-pager | grep '拒绝请求'

# 4) 探测花了多少钱(单独一行、conv_key=null)
grep '"probe": true' /home/rain/Documents/services/token_proxy/logs/usage.jsonl | tail -20

# 5) 一键关闭(改 enabled: false 后重启,最常用)
cd /home/rain/Documents/services/token_proxy
sed -i 's/^  enabled: true/  enabled: false/' config.yaml && systemctl --user restart token-proxy

# 6) 恢复开启
sed -i 's/^  enabled: false/  enabled: true/' config.yaml && systemctl --user restart token-proxy

注:第 5/6 条的 sed 只改 cache_probe 段内的 enabled 行;改完务必 grep -n -A3 '^cache_probe:' config.yaml 复核。

3. 配置项

项 默认 含义 调整建议
enabled true 总开关 误拦过多时先置 false 观察
idle_seconds 3600 距上次请求超过该秒数才探测 想更早介入可降到 1800;0 = 每次请求都探测,仅调试
probe_tokens 50000 探测前缀长度(token) 失效时残留命中实测 ≤25.2 K,50 K 留了一倍余量;调小会增加误判风险
hit_ratio 0.90 命中占比低于该值判失效 阈值区间 (0,1];调低=更宽松(更少拦截),调高=更严格
timeout 15 探测请求超时(秒) 超时即放行,宁可漏拦不可阻塞
max_convs 64 会话快照 LRU 上限 并发会话多时上调

改完必须重启:systemctl --user restart token-proxy(会打断在途回答)。

4. 观测

看什么 命令 正常表现
启动参数 速查表 1 末段含 缓存探测=开启(空闲>=3600s, 探前 50000 tok, 命中<90% 拦截, 超时 15s)
探测判定 速查表 2 缓存探测 conv=… 空闲=…s 命中=…/… (…%) 阈值=90%
拒绝 速查表 3 拒绝请求:前缀缓存已失效 空闲=…min 命中=…/…
探测开销 速查表 4 命中时 cache_hit_tokens≈prompt_tokens;失效时 cache_miss_tokens 占多数

5. 故障处置

场景 A:被拒绝后不知道怎么办

症状:客户端报 500,提示 前缀缓存已失效。

诊断:journalctl --user -u token-proxy --since '5 min ago' | grep '缓存探测' 看命中占比是否真的 <90%。

处置:在 Trae 里点「压缩」,然后回一句「继续」即可续跑。

验证:grep -c '"probe": true' logs/usage.jsonl 计数继续增长,且新的业务请求 miss 明显下降。

场景 B:怀疑误拦(缓存其实还在)

症状:空闲时间不长却被拦。

诊断:查日志里的 空闲= 值——若明显小于 idle_seconds,说明是快照时间被误刷新; 若 空闲 正常但 命中 很低,说明缓存确实失效。

处置:先 enabled: false 重启止血;再把 hit_ratio 调低(如 0.7)观察。 若「空闲」确实偏小,属代码缺陷,按 cache-probe-20261008/SOP.md §7 回滚。

验证:改完重启,日志中不再出现该会话的拒绝。

场景 C:探测变慢、拖累首次请求

症状:空闲后第一次请求明显变慢。

诊断:journalctl --user -u token-proxy --since '10 min ago' | grep -E '缓存探测|上游请求失败'

处置:把 timeout 降到 5;仍慢则 enabled: false。

验证:首次请求耗时回到正常区间。

场景 D:想彻底关掉

处置:sed -i 's/^ enabled: true/ enabled: false/' config.yaml && systemctl --user restart token-proxy

验证:启动日志显示 缓存探测=关闭;logs/usage.jsonl 不再新增 "probe": true。

6. 回滚

  • 只关开关(推荐,秒级):见场景 D。
  • 回滚代码:cache-probe-20261008/SOP.md §7(含备份路径与命令)。
  • 备份台账:cache-probe-20261008/backup/README.md。

来源:/home/rain/Documents/services/token_proxy/cache-probe-20261008/RUNBOOK.md | 最后更新:2026-10-08 00:55(由 build/sync.py 同步,请勿在站点侧修改)