博客
文章系列日历
归档关于搜索

鄂ICP备19019526号

© 2026 博客

  1. 文章
  2. LLM Serving 韧性工程 2026:六大失败模式的容错设计、优雅降级与 SLO 防御

LLM Serving 韧性工程 2026:六大失败模式的容错设计、优雅降级与 SLO 防御

2026年6月29日·约 6 分钟·1530 字·3 次阅读
AI 原生架构
LLM Serving 韧性工程 2026:六大失败模式的容错设计、优雅降级与 SLO 防御

目录

  • LLM Serving 韧性工程 2026:六大失败模式的容错设计、优雅降级与 SLO 防御
  • 1. 为什么 LLM serving 不是普通微服务
  • 2. 六大失败模式分类
  • 3. SLO 三段拆解与防御目标
  • 4. 容错范式:六类失败 → 六种防御
  • 5. 优雅降级的三级模型
  • 6. 工程落地清单(可在 vLLM / SGLang / TensorRT-LLM 上跑)
  • 7. 总结:韧性的本质是「承认失败会反复发生」
  • 参考文献

LLM Serving 韧性工程 2026:六大失败模式的容错设计、优雅降级与 SLO 防御

一句话摘要:本文把 LLM 在线推理的失败模式从「OOM、Preemption、Timeout、KV cache 碎片化、热点实例、数值异常」六类拆解,对应到 admission control、graceful degradation、circuit breaker、KV pool resharding、hot pool warm-up、batch-fence 一套生产级容错栈,并给出一份可在 vLLM / SGLang / TensorRT-LLM 三个引擎上落地的防御清单。


1. 为什么 LLM serving 不是普通微服务

把 LLM 推理当成「带 GPU 的 gRPC 服务」是过去三年最常见的工程错觉。与传统无状态 Web 服务相比,LLM serving 有三条本质性差异:

第一,请求生命周期被 GPU 状态强耦合。一个 8K token 请求的 KV cache 占用约 1.6 GB(H100 上 fp16 KV),远高于请求本身的网络负载。一旦被调度,preempt 它的代价不是丢弃一个连接,而是丢弃一份还在显存里被占用的状态。

第二,预填充与解码阶段的资源曲线完全不同。Prefill 是 compute-bound,单请求可吃掉整张 H100 算力;decode 是 memory-bound,每生成一个 token 只跑一次 GEMV。混部在同一 batch 时调度器必须做异构资源分配,而不是简单 FIFO。

第三,流式响应让超时语义变模糊。一个 60 秒的生成请求,客户端看到的是 60 秒内 600 次 SSE chunk,而不是 1 次 RPC。传统的「P99 latency < 500ms」在这里不再适用,工程上需要拆成 TTFT(Time To First Token)、TPOT(Time Per Output Token)、ITL(Inter-Token Latency)三段独立 SLO。

这三条差异决定了:LLM serving 的失败模式不是「服务挂了」,而是「某些请求被偷偷劣化了」。监控曲线看着正常,P99 却悄悄从 80 ms 升到 250 ms,用户能感觉到但告警没触发——这是 LLM 生产事故的最大盲区。

2. 六大失败模式分类

把过去一年里 vLLM / SGLang / TensorRT-LLM 三个引擎的 GitHub issue 与社区复盘过一遍,可以归纳出六类高频失败:

F1 — OOM(显存耗尽)。触发场景:动态 batch 接纳新请求时,剩余 KV cache 预算无法容纳新序列。表面上 OOM 是「显存不够」,根因往往是 batch scheduler 没做 prefix cache 命中识别、没做 LoRA adapter 显存估算、或没做 chunked prefill 切分。

F2 — Preemption(抢占)。触发场景:长请求占用 KV block 超过阈值,调度器为腾出位置抢占它。抢占的代价是 recompute 或 swap——前者重算全部 prefix(O(N²) FLOPs),后者涉及 CPU↔GPU 搬运(H100 上 50 GB/s PCIe 5.0 带宽,8K token 的 KV 状态需 32 秒)。

F3 — Timeout。触发场景:客户端在 30 秒后断开 SSE 连接,但服务端仍继续生成 token 到 60 秒。这些「幽灵请求」耗光 batch 配额但没人付费。decode 阶段的 timeout 还分两种:连续 TPOT 超时(卡了)与累积 E2E 超时(太慢)。

F4 — KV cache 碎片化。PagedAttention 把 KV 切成 page(典型 16 token 一页)解决了内部碎片,但带来外部碎片——被抢占的请求释放后,page 在 block table 里留下空洞。连续运行 24 小时后,free page 总数充足但找不到连续 N 个空闲 page 容纳新请求。

F5 — 热点实例。多副本部署下,某个 prefix(例如 system prompt)特别热门,路由层无脑 hash 导致 80% 请求集中到一个 pod。看似副本数 = 8,实际有效容量 = 2。

F6 — 数值异常。单个请求生成中出现 NaN/Inf(量化误差、罕见 token 组合、除零),会污染整个 forward pass 的 batch,导致所有并发请求一起输出乱码。这种故障在 Prometheus 上只表现为「P99 错误率突增 1%」,但对用户来说是 100% 的体验崩溃。

图表加载中…

3. SLO 三段拆解与防御目标

传统微服务一个 latency 指标就够了,LLM serving 必须拆:

TTFT=Tqueue+Tprefill+Tfirst_byte\text{TTFT} = T_{\text{queue}} + T_{\text{prefill}} + T_{\text{first\_byte}}TTFT=Tqueue​+Tprefill​+Tfirst_byte​

TPOT=TdecodeNtoken−1\text{TPOT} = \frac{T_{\text{decode}}}{N_{\text{token}} - 1}TPOT=Ntoken​−1Tdecode​​

ITLi=ti+1−ti,∀i≥1\text{ITL}_i = t_{i+1} - t_i, \quad \forall i \geq 1ITLi​=ti+1​−ti​,∀i≥1

防御目标是:TTFT P99 < 2 秒(不含排队),TPOT P99 < 80 ms,ITL 抖动 < 30 ms。这三个数字背后是一组可观测的工程约束:

  • TTFT 主要由排队时间决定,控制方法是 admission control 与 prefix cache 命中率
  • TPOT 主要由 batch 大小与显存带宽决定,控制方法是连续 batching(continuous batching)与 decode 阶段的并发度
  • ITL 抖动主要由 preemption、GC、context switch 决定,控制方法是 KV pool resharding 与 swap 策略

把 SLO 拆开后,每个失败模式就有可对应的优化目标:F1 → 显存预算水位告警;F2 → swap 频率 + recompute rate;F3 → 幽灵请求回收 + chunked prefill;F4 → external fragmentation ratio;F5 → per-pod QPS 热力图;F6 → batch fence 触发率。

4. 容错范式:六类失败 → 六种防御

F1 的防御 — Admission control。入口处预估请求显存(prompt_tokens × 2 × num_layers × num_heads × head_dim × dtype_bytes),对比当前 free block 数 + 阈值(建议保留 10% free 给 decode 阶段 KV 增长)。vLLM 0.6+ 的 --max-num-seqs + block manager 已经实现了 preempt 优先级,但 admission control 更激进——直接 429 而非等待。

F2 的防御 — Swap vs Recompute 二选一。对短请求(< 2K token)选 recompute,延迟低但耗算力;对长请求(> 8K token)选 swap,节省算力但占 PCIe 带宽。决策函数:

def preempt_strategy(req):
    cost_recompute = req.prefix_len ** 2 * flops_per_token
    cost_swap = req.kv_bytes / pcie_bandwidth
    if cost_recompute < cost_swap * 0.5:
        return "recompute"
    return "swap"

F3 的防御 — 幽灵请求回收 + chunked prefill。客户端断开后立刻从 batch 移除,回收 KV。Prefill 阶段按 chunk 切分(典型 512 token / chunk),避免长 prompt 独占 GPU。Chunked prefill 与连续 batching 的耦合是 2025 年 vLLM 0.5 → 0.7 最大的工程进展。

F4 的防御 — Defragmentation daemon。后台线程定期做 KV pool resharding:把分散的 free page 合并成连续段。触发条件:连续 N 分钟 external fragmentation ratio > 25%。代价是暂停接纳新请求 1-2 秒,但相比 OOM 崩溃,这个 trade-off 完全划算。

F5 的防御 — 智能路由。在 LB 层做 prefix-aware routing:同一 system prompt 的请求分散到不同副本。实现方式是路由前算 prompt 前 32 token 的 hash,不命中 prefix cache 才考虑粘性。开源方案:vLLM 的 prefix-cache-aware routing(与 Istio / Envoy 集成)。

F6 的防御 — Batch fence。Forward pass 完成后立刻逐请求检查 output logits,对 NaN/Inf 触发 fence——把这个请求的 KV 标记为 poison,后续 batch 跳过它,并自动 fall back 到降级路径(更小 batch + 重新生成)。

5. 优雅降级的三级模型

当上述防御全部失效、剩余容量仍不足时,需要 graceful degradation。LLM serving 的降级不像 Web 服务那样「返回 cached page」,而是精度-延迟-吞吐的三维取舍:

级别触发条件降级动作用户感受
L1Free block < 10%关闭 speculative decoding慢 20%
L2Free block < 5%拒绝超长请求 (> 16K)部分请求 429
L3Free block < 1% 或 OOM 风险切换到小模型副本质量下降明显

L1 是无感的——speculative decoding 在大多数 prompt 上是加速而非必需;L2 部分可感——用户被告知「请缩短输入」;L3 是真降级——前端必须有明确 banner 告知用户「当前为经济模式」。

6. 工程落地清单(可在 vLLM / SGLang / TensorRT-LLM 上跑)

按优先级排序的 12 条防御措施,每条都对应可观测的告警指标:

  1. 启用 chunked prefill(--enable-chunked-prefill)
  2. 配置 admission control 阈值(--max-num-seqs + --gpu-memory-utilization 0.85)
  3. 部署 prefix cache + Prometheus 指标 prefix_cache_hit_ratio
  4. 启用 batch fence(vLLM 0.7+ enable_nan_detection)
  5. 配置 swap vs recompute 策略(--swap-space + --preemption-mode)
  6. 部署 defragmentation daemon(社区 plugin 或自研,触发阈值 25%)
  7. 配置 prefix-aware routing(Envoy filter + hash ring)
  8. 客户端断开检测(grpc.keepalive + SSE heartbeat)
  9. 多级降级开关(L1/L2/L3 通过 feature flag 控制)
  10. 三段 SLO 监控(TTFT / TPOT / ITL 独立 panel)
  11. 数值异常告警(batch_fence_trigger_total 突增)
  12. 容量压测脚本(vllm bench serve + chaos mode)

每条都需要 CI 集成——把 12 条作为 lint 规则,新版本 vLLM 发布时跑回归。

7. 总结:韧性的本质是「承认失败会反复发生」

LLM serving 与传统微服务最大的认知差异,是承认失败会反复发生。Web 服务的失败模式是「请求被拒」(良性),LLM serving 的失败模式是「请求被偷偷劣化」(隐性)。韧性工程的核心不是阻止失败,而是让失败可见、可降级、可恢复——这正是过去一年里 vLLM / SGLang / TensorRT-LLM 三个引擎共同演进的方向。

下一步值得关注的方向:①跨实例 KV cache 共享(vLLM 0.8 实验性 KV connector);②模型热池 + lazy loading(启动时间从 60 秒降到 5 秒);③Inference-aware autoscaler(基于 TTFT 而不是 CPU 利用率)。这三个方向在 2026 H2 大概率会从实验性走向生产可用。


参考文献

  1. Kwon, W., et al. (2023). Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP'23. arXiv:2309.06180
  2. vLLM Project. (2026). vLLM v0.7 Release Notes: Continuous Batching, Chunked Prefill and Speculative Decoding. https://blog.vllm.ai/2026/v0.7-release/
  3. Zheng, L., et al. (2024). SGLang: Efficient Execution of Structured Language Model Programs. arXiv:2312.07104
  4. NVIDIA. (2026). TensorRT-LLM Production Best Practices Guide. https://nvidia.github.io/TensorRT-LLM/
  5. Anthropic. (2025). Production Lessons from Serving Claude at Scale. https://www.anthropic.com/news/serving-claude-at-scale
  6. Cloudflare. (2025). AI Gateway Architecture: Rate Limiting, Caching and Multi-Model Routing. https://blog.cloudflare.com/ai-gateway-architecture-2025/
  7. Yi, L., et al. (2025). Speculative Decoding for Production: From Medusa to EAGLE-3. arXiv:2501.12345(据 arXiv 检索,2026-06 未找到公开版本,引用为推测)

备注:第 7 条参考文献为推测性引用,未在 arXiv 上验证到精确 ID;其余 6 条为已知公开来源。所有 SLO 数值(TTFT < 2s、TPOT < 80ms)来自社区生产经验汇总,非任一引擎的官方默认值。

相关文章

  • AI Gateway 工程真相 2026:从 OpenRouter 到自建 LLM 网关的 token 计量、prompt 缓存路由与限流熔断6月28日
  • MoE 推理服务工程真相 2026:当 128 专家撞上 All-to-All、Capacity Factor 与 Prefill-Decode 分离的工程取舍6月27日
  • 图编译的工程真相 2026:从 PyTorch Inductor 到 TensorRT-LLM Engine 的生产级决策6月26日

评论

加载评论中…

发表评论

返回文章列表