Skip to content

Troubleshooting.zh

sikkatu edited this page Nov 2, 2026 · 8 revisions

English | Русский | 中文

故障排查

先检查三样东西:

bash scripts/budget-report.sh status        # 占用、命名空间、磁盘空闲
tail -n 100 "$KVP_CACHE_ROOT/lmcache-server.log"   # 缓存服务
docker logs --tail 100 mimo-pro-tp4-kvp     # 引擎(kv-persistence 启动器)

(KVP_CACHE_ROOT 定义在 configs/generic/cache.env.local。)

预检报告身份问题

  • KVP_MODEL_REVISION must be a full 40-hex SHA —— 粘贴提交 SHA,而不是分支名 (见快速开始步骤 3)。
  • KVP_CHAT_TEMPLATE_DIGEST must be 64 hex —— 带 KVP_MODEL_DIR="$HOME/models/MiMo-V2.6-Pro-MOPD" 再运行 一次预检;复制打印出的值。

lmcache CLI 缺失或 ABI 不匹配

ERROR: lmcache CLI missing —— 按快速开始步骤 4 安装。如果环境内 import lmcache 因未定义符号报错,说明 pip wheel 与当前 PyTorch/CUDA 栈不匹配。 备用方案:直接从生产镜像运行服务:

docker run --rm --entrypoint lmcache "$IMAGE" server --help

若此命令可行,把 scripts/start-cache.sh 中的 lmcache server 一行改为在 docker run 内执行,参数完全相同(端口/路径不变)。

缓存服务已启动,但 vLLM 连不上

  1. 启动顺序:start-cache.sh 必须在 vLLM 启动器之前 (run-vllm-with-persist.sh 否则会拒绝启动)。
  2. 查看服务日志的错误行;两个进程使用同一主机网络 —— 不要在不改两边的情况下更换请求端口。
  3. 用配方集成(KV_PERSIST=1)时:启动器应打印 KV_PERSIST=1: attaching LMCache connector … —— 若缺失,旋钮没传到启动器 (检查 tp4.env 以及变量是否已导出)。

重启后没有缓存命中(TTFT 没下降)

按顺序检查:

  1. 响应中 cached_tokens > 0。
  2. grep -c Retrieved "$KVP_CACHE_ROOT/lmcache-server.log" 在请求期间增长; 重启后的条目就是磁盘恢复的证据。
  3. used_bytes 没有因重建同样数据而增长(前后对比 budget-report.sh status)。
  4. 身份未变 —— 重新运行 scripts/preflight.sh;版本/dtype/模板变化会悄悄进入 新命名空间(按设计如此)。
  5. KVP_PERSIST_ENABLED 为 true(否则 start-cache.sh 会警告)。

磁盘满 / 写入被拒

报告中 free_bytes: 0,或适配器在硬上限处记录拒绝 —— 提高 KVP_CACHE_BUDGET_GB 或显式清理旧命名空间(purge --namespace=NAME --yes, 名称来自 status)。硬上限是 L2 适配器中的 max_capacity_gb:一旦用量达到 它,新写入被拒绝(服务继续运行,只是不再写入缓存)。软阈值(90%)的淘汰 通常会先回收空间,但这不是防止把磁盘本身写满的保证 —— 真正的边界是 存放 KVP_CACHE_ROOT 的卷上的可用空间(在参考主机上该卷还存放 Docker、 模型和系统)。请保留可用空间余量,磁盘紧张时调低预算。服务运行期间切勿 手动删除缓存根目录里的个别文件。

淘汰太激进(或太迟钝)

提高 KVP_EVICT_TRIGGER_WATERMARK(更晚开始)或调整 KVP_EVICT_RATIO (每周期回收更多)。先用很小的隔离预算验证,再指望 1.5 TB 规模的效果。 实际模式见状态报告中的 evictions/reclaimed_bytes 计数。

缓存复用很少(看起来都是冷的)

测量提示词中真正稳定的那部分:

python3 "$REPO/implementation/prompt_probe.py" --tokenizer "$MODEL_DIR" \
  --request-file a.json --request-file b.json

用从客户端导出的两个真实请求体。若 stable_prefix_tokens 很小,说明动态值 (时间戳、工具调用 id)破坏了前缀 —— 从源头修复序列化,或接受这一限制。 为了缓存而截断历史是被禁止的。

损坏文件的恢复

损坏是可容忍的:未命中即重新计算。要手动清理:停止缓存服务, 执行 bash scripts/budget-report.sh purge --all --yes,再启动。 绝不会自动发生。无损编解码的帧还携带 CRC32:损坏或被截断的帧会在读取时 被检测并报告为缓存未命中 —— 绝不会作为错误的 KV 返回。

无损编解码问题

  • CodecError: zstandard/lz4 python bindings not installed —— 所选编解码 需要其 Python 包(zstd → zstandard,lz4 → lz4)。在 lmcache 的 venv 中安装它,或回退到 LMCACHE_L2_SERDE=none(逐字节精确的原始模式,完全不 需要依赖)。检查在服务器启动前运行,绝不会要求未使用的编解码:none 模式 不需要任何压缩包。
  • LMCACHE_L2_SERDE=... is LOSSY and is not supported —— 预期行为:本项目仅 支持无损。请使用 none、zstd 或 lz4。
  • 切换编解码后缓存命中消失 —— 预期且安全:编解码属于缓存身份命名空间,旧块 变为缓存 miss。重新存储它们(或切回原编解码)—— 绝不会错误命中。
  • 压缩后磁盘未变小 —— 编解码只压缩真正可压缩的内容;不可压缩的块按原样存储 并填充到 4 KiB 页边界。在很小的块上,28 字节的头部可能占主导。

磁盘占用高于预期,但缓存文件无法解释

被强杀(SIGKILL、OOM、断电)后,适配器可能留下 <final>.bin.tmp.<uuid> —— 未能原子重命名的文件。上游仅在干净关闭时清扫它们。用 bash scripts/budget-report.sh status(字段 tmp_files / tmp_files_bytes) 检查,用 purge --tmp --yes(仅清残余)或 purge --all --yes 删除。 两条命令都用活跃写入注册表(kvpersist.tmp_guard)保护进行中的写入:每次写入 在创建 tmp 文件前登记标记、原子重命名后清除。存活判定在两种启动模式下都有效 (第 18 轮):

  • host 模式 —— 标记记录 (pid, 进程启动时间),只要该进程仍在即为存活 (/proc/<pid> + 启动时间防 PID 复用);
  • docker 模式(KVP_LAUNCH_MODE=docker,无 --pid=host)—— 标记记录写入进程的 PID 命名空间 id;当标记属于外来命名空间时,主机 CLI 无法检查其 PID,因此存活判定 回退到标记自身的 HEARTBEAT(写入期间每 30 秒刷新一次):2 分钟内被触碰过的标记 = 存活,更旧 = 崩溃残留。 若完全无法判定存活(无 /proc、标记不可读)则保留标记:宁可多留一个 tmp 文件,也不 删除活跃写入的文件。写入者确已退出的标记在一小时后清扫。第二重兜底适用于未使用 注册表的写入者(例如裸的 lmcache server):最近 15 分钟内修改过的 *.tmp.* 一律跳过 —— 该窗口是启发式,不是绝对锁。

Grafana 无数据

在缓存服务推送遥测之前该栈是被动的。用 USE_OBSERVABILITY=1(或 KVP_OTLP_ENDPOINT=http://localhost:4320)启动缓存并检查日志中的 [kvp] 横幅。Docker 模式下 start-cache.sh 会自动把 localhost 改写为 host.docker.internal。栈的所有端口仅绑定 127.0.0.1(回环契约)。

缓存未命中矩阵(为什么缓存"失效"了?)

改变任何身份字段都会更换命名空间:旧的缓存条目不会被删除,但无法再被寻址—— 这看起来像"缓存坏了",其实是隔离机制按设计工作。下表中每一行都会使本次部署 之前缓存的所有 KV 失效:

你改变了... 对命名空间的影响 可复用旧缓存?
模型权重(内容替换,即使文件名相同) shard 字节 SHA-256 改变 否
模型版本(HF SHA) 改变 否
分词器(tokenizer.json / tokenizer_config.json) 改变 否
chat_template / chat_template.jinja 内容 digest 改变 否
--kv-cache-dtype(如 bfloat16 -> float16) 改变 否
--max-model-len 改变 否
--tensor-parallel-size 改变 否
config.json 中 KV 几何配置 改变 否
vLLM 构建 / LMCache 连接器版本(KVP_CONNECTOR_VERSION) 改变 否
--enforce-eager / 其他改变 KV 计算顺序的引擎标志 可能改变块布局 → 改变 否
Docker 镜像摘要(不同 vLLM 构建) 改变 否

实践建议:用 setup-identity.sh 的输出固定 KVP_MODEL_REVISION,随每次部署保存 identity.env.local;只要改了引擎参数就预期命名空间改变——把"改完设置后缓存变冷" 当作正确预期行为来处理,而不是 bug。

Clone this wiki locally