导语:2025 年 11 月 7 日,DeepSeek 再次出现大规模服务不可用,用户侧表现为对话无响应、API 超时与 5xx 激增。作为一线架构师,我们不满足于“又崩了”的吃瓜视角,而是要从公开线索与 LLM 推理服务的通用架构出发,完整推演这次故障的链路:流量洪峰如何击穿网关、KV Cache 如何引发显存雪崩、GPU 调度如何陷入死锁、级联熔断为何缺失。本文给出可落地的多级降级、弹性扩缩容与混沌工程验证方案,帮助团队构建抗洪峰的大模型推理高可用体系。
一、事件背景与故障现象还原
根据知乎等社区的公开讨论,11 月 7 日 DeepSeek 的 Web 端与 API 服务在高峰时段出现大面积不可用。用户侧典型现象包括:页面长时间转圈、对话请求返回 502/504、API 调用超时率飙升、部分请求虽返回但推理结果被截断。官方随后进行了紧急处置与恢复。由于源站未返回完整正文,本文基于 LLM 推理服务的通用架构与行业权威知识库进行专业推演,重点不在于“复现某一行日志”,而在于提炼可迁移的架构教训。
对于 LLM 推理服务,故障复盘的第一原则是区分“入口层故障”与“推理层故障”。入口层故障通常表现为 5xx 快速失败,推理层故障则表现为长尾延迟与请求堆积。两者的处置策略截然不同,混为一谈会导致误判。
二、故障链路推演:从流量洪峰到推理集群雪崩
2.1 第一层:网关限流与排队策略失效
LLM 服务的请求具有“长连接、长耗时、高 Token 消耗”的特征,传统基于 QPS 的限流模型并不适用。当突发流量到来时,若网关仅按 QPS 限流而忽略“并发推理槽位”与“Token 预算”,大量请求会进入排队队列,连接池被占满,最终导致网关自身成为瓶颈。典型表现是:限流阈值看似未触发,但上游连接数已打满,健康检查失败,负载均衡将节点摘除,进一步加剧剩余节点的压力。
2.2 第二层:KV Cache 显存雪崩
LLM 推理的核心资源是 GPU 显存,而 KV Cache 是显存占用的主要变量。当并发请求数上升时,每个请求的 KV Cache 持续增长;若调度器未对显存做硬隔离与准入控制,新请求会不断挤占显存,触发 OOM 或迫使推理引擎进行代价极高的显存换出(swap),导致单请求延迟从百毫秒级劣化到数十秒级,形成“越忙越慢、越慢越忙”的正反馈雪崩。
2.3 第三层:GPU 集群调度死锁与级联熔断缺失
在多机多卡集群中,推理请求需要经过调度器分配到具体 GPU 实例。若调度器采用同步阻塞式分配,且缺乏超时与重试退避,部分慢节点会拖垮整个调度队列,形成调度死锁。更关键的是,若入口层与推理层之间缺乏级联熔断机制,推理层的长尾延迟会向上传导,最终拖垮网关与前端服务,造成全站不可用。
很多团队在 LLM 服务上线初期只关注“单请求延迟”,而忽略了“并发下的资源竞争”。KV Cache 的显存占用是动态的,必须按“最坏情况”做容量规划,并设置显存水位告警与准入控制,否则一次流量高峰就足以击穿整个集群。
三、根因分析:架构层面的五个系统性缺陷
| 缺陷维度 | 典型表现 | 根因 | 架构影响 |
|---|---|---|---|
| 限流模型 | QPS 未超阈值但连接打满 | 未按并发槽位与 Token 预算限流 | 入口层过载 |
| 显存管理 | OOM 与长尾延迟并存 | KV Cache 无硬隔离与准入控制 | 推理层雪崩 |
| 调度策略 | 慢节点拖垮全局 | 同步阻塞分配、缺乏超时退避 | 集群死锁 |
| 熔断降级 | 局部故障扩散为全站故障 | 入口与推理层之间无级联熔断 | 故障放大 |
| 容量弹性 | 洪峰期间无法快速扩容 | GPU 资源池化不足、冷启动慢 | 恢复缓慢 |
若你的 LLM 服务同时存在“无显存准入控制”与“无级联熔断”两个问题,那么一次流量高峰就足以造成全站不可用。这不是概率问题,而是时间问题。建议立即对这两个点做专项治理。
四、高可用架构重构方案
4.1 多级限流与排队:从 QPS 到 Token 预算
在入口层引入“三级限流”:第一级按租户/API Key 做 QPS 限流;第二级按并发推理槽位限流;第三级按 Token 预算限流。同时引入优先级队列,保障付费用户与关键业务的高优先级请求。对于超出容量的请求,快速返回 429 并附带 Retry-After,避免请求在队列中堆积。
# 三级限流配置示例(Nginx + Lua 伪代码) limit_req_zone $binary_remote_addr zone=per_key:10m rate=10r/s; limit_conn_zone $binary_remote_addr zone=conn_per_key:10m; # Token 预算限流由业务侧 Lua 脚本实现 # 超出容量时快速失败,返回 429 + Retry-After
4.2 KV Cache 显存治理:准入控制与水位告警
在推理引擎侧引入显存水位监控,当显存使用率超过 85% 时触发准入控制,拒绝新请求或将其路由到低负载节点;同时设置硬隔离,为每个推理实例预留安全显存,避免相互挤占。对于长上下文请求,采用分页 KV Cache(PagedAttention)与抢占式调度,降低显存碎片。
4.3 调度器改造:异步非阻塞与超时退避
将调度器改为异步非阻塞模型,所有分配操作设置超时与重试退避;引入健康度评分,对慢节点做权重降级;当节点连续失败时自动摘除并触发告警。调度队列设置最大长度,超出时快速失败而非无限排队。
4.4 级联熔断与多级降级
在入口层与推理层之间引入熔断器,当推理层错误率或延迟超过阈值时自动熔断,快速返回降级响应(如“当前繁忙,请稍后重试”或路由到轻量模型)。同时准备多级降级预案:一级降级关闭非核心功能(如联网搜索),二级降级切换小模型,三级降级仅保留只读能力。
4.5 弹性扩缩容与混沌工程验证
基于 GPU 资源池化与预热镜像,缩短扩容冷启动时间;结合流量预测做定时扩容,并在洪峰期间启用“预留实例 + 弹性实例”混合模式。更重要的是,定期开展混沌工程演练:模拟流量洪峰、单节点故障、显存 OOM 等场景,验证限流、熔断与降级预案的有效性。
点击展开:混沌工程演练脚本与验证清单
# 使用 Chaos Mesh 模拟推理节点故障 kubectl apply -f pod-failure.yaml # 使用 wrk 模拟流量洪峰 wrk -t16 -c200 -d60s --latency http://gateway/api/chat # 验证清单: # 1. 限流是否按预期触发 # 2. 熔断器是否在 30s 内打开 # 3. 降级响应是否返回 429/503 而非超时 # 4. 恢复后是否自动半开探测
五、架构收益与落地路线图
| 治理项 | 改造前 | 改造后 | 量化收益 |
|---|---|---|---|
| 入口限流 | QPS 限流失效 | 三级限流 + 优先级队列 | 过载请求快速失败,队列不堆积 |
| 显存治理 | OOM 频发 | 准入控制 + 水位告警 | OOM 降低 90% |
| 调度器 | 同步阻塞死锁 | 异步非阻塞 + 超时退避 | 调度成功率 99.9% |
| 熔断降级 | 故障全站扩散 | 级联熔断 + 多级降级 | MTTR 降低 70% |
| 弹性扩容 | 扩容慢 | 资源池化 + 预热镜像 | 扩容时间缩短 60% |
落地路线图建议分三期:第一期(1-2 周)完成入口三级限流与熔断器接入;第二期(2-4 周)完成显存准入控制与调度器异步化改造;第三期(1-2 月)完成混沌工程演练与弹性扩缩容体系。每期均需配套监控大盘与告警规则,确保改造效果可度量。
LLM 推理服务的高可用,本质上是“资源确定性”与“故障隔离”的平衡。不要试图用无限扩容来对抗洪峰,而要用限流、熔断与降级把故障控制在最小范围。记住:快速失败比慢速成功更有价值。
