跳到正文
SYSTEMS · CLUSTER SERVING

Serving 不是把请求塞进 GPU而是持续决定谁能进、去哪算状态归谁

单个引擎负责把一轮 Token 算出来;集群级 Serving 还要在流量突发、请求长度未知、KV 有位置、节点会失效的现实里,兑现租户、延迟与正确性合同。它更像机场塔台:准入、分流、局部排班、行李交接和停机疏散必须是一套系统。

多股蓝紫请求流进入透明控制塔,由路由结构分配到多个 GPU 副本;下方两组计算池通过高速链路共享模块化状态
总览:上半部是“谁能进、去哪算”的控制面,下半部是“Token 与 KV 怎样执行、传输”的数据面。图只表达直觉;后文 SVG 给出精确状态与失败边界。
01 · FREEZE THE SERVICE CONTRACT

先写“要兑现什么”,再问用几个副本、哪种调度器

同一个 checkpoint 可以服务短聊天、64K 文档问答、代码补全和离线摘要。它们的输入/输出联合分布、共享前缀、到达方式、取消概率和延迟目标不同;只给一个“平均 tokens/s”无法决定集群。服务合同至少冻结下面四张表。

SEMANTICS

生成语义

model revision、tokenizer、Chat Template、LoRA、采样、停止条件、结构化输出与最大上下文。缓存和迁移兼容性从这里开始。

TRAFFIC

流量分布

输入×输出联合分布、prefix 重复率、开环到达率、burst、并发上限、会话粘性、超时、取消与客户端重试。

TENANCY

租户合同

额度、优先级、最大排队、可借用空闲容量、缓存 trust group、数据地域与高峰时的拒绝 / 降级等级。

SLO & OUTCOME

体验与终态

P95/P99 TTFT、流式间隔、E2E、成功率、拒绝率、Goodput、完整 finish reason,以及部分输出后能否迁移或重试。

白话类比 · 酒店

房间数不是唯一容量,入住天数和行李也占资源

请求数像客人数,Prefill 像办理入住,Decode 像持续住宿,KV Cache 像每位客人的行李与房间状态。只限制“同时 100 位”会把 100 个一晚轻装客与 100 个长期大件行李客当成同一种负载。

FIRST-PASS CAPACITY LAB

把流量先换成两本 Token 需求账

这是用于发现数量级错误的静态预算,不是性能预测。真实部署还要用完整 trace、batch 行为、并行拓扑、KV 容量与尾延迟验证。

UNCACHED PREFILL DEMAND58,982token/s
DECODE DEMAND12,288output token/s
RAW TOKEN RATIO4.8×未缓存输入 / 输出 Token 数量比

uncached prefill demand = req/s × input tokens × (1 − cached-prefix fraction)
decode demand = req/s × output tokens。两项 token/s 的单位计算成本不同,原始比值不能判断阶段瓶颈;只有分别除以同配置实测的阶段 capacity 后才能比较压力。平均数还会掩盖长尾与相关性,最终容量必须用逐请求 trace 做 open-loop 压测。

02 · TWO SCHEDULERS, THREE LOOPS

全局路由选副本,局部调度按轮分 Token;不要把它们叫成一个 Scheduler

Orca 把调度粒度推进到模型 iteration:每轮结束的序列退出,新序列加入,再对可一起执行的操作做 selective batching。集群再多一层全局决策:哪个副本兼容、哪里有前缀、谁更空、网络路径是否合适。两层看到的状态与反应时间不同。S01

集群级 LLM Serving 两级调度图:入口合同经过准入控制进入全局控制面,由全局路由结合状态目录、规划器和发布控制器选择模型副本;每个副本的局部调度器按 iteration 组成 batch,GPU 执行并读写 KV blocks;KV、负载和延迟事件反馈到下一次路由与容量决策。
全局控制面回答“去哪个副本”;局部执行面回答“这一轮谁推进多少 Token”。状态事件、容量规划与故障恢复分别形成 routing、planning、resilience 三条闭环。 查看原图 ↗
SERVING LOOP · 毫秒到秒

接单、路由、逐轮执行

读取 hard eligibility、KV overlap、活跃负载与 deadline;局部调度每轮选择 Decode 与 Prefill chunk,并在取消时尽快停止分配。

PLANNING LOOP · 秒到分钟

扩缩副本与放置

从到达率、队列、KV 压力和阶段 SLO 推算目标副本;新副本需要加载权重、暖机和进入 ready,缩容则需要 drain。

RESILIENCE LOOP · 事件驱动

发现失效、隔离和恢复

把不健康副本先摘出发现,再决定在途请求失败、重算或迁移;过载保护要早于 OOM,而不是等 GPU 崩溃充当流控。

状态目录不是绝对真相

全局目录来自 worker health、KV allocate/free/evict 和负载事件,天然可能延迟或丢失。路由可以用它优化,但 KV ownership、引用计数和可执行性仍应由本地 worker 校验;事件面需要 epoch / version、重同步和保守 fallback。Dynamo 当前架构也把 KV 事件与负载信号作为路由输入,而非替代本地正确性。S13

03 · FAIRNESS, PREEMPTION & OVERLOAD

限流决定谁能入场,公平调度决定已接单资源怎么分,过载保护决定何时说“不”

LLM 作业的输出长度事前未知,且一个短请求与一个 64K 长请求的服务成本差异巨大。按请求数做轮询看似公平,却可能让少量长作业占满 KV;只让短请求优先,又会让长请求饥饿。公平、延迟和吞吐必须写成显式策略。

公平与过载决策图:三个不同负载租户先按额度、版本、Prefill tokens、KV blocks 和队列预算准入;已接单请求按输入输出 Token 服务量做 work-conserving fairness,再由局部 iteration policy 处理 Decode、Chunked Prefill、抢占、aging 与 deadline;最终同时观察 SLO、公平、余量和失败。
限流、准入、公平调度和 load shedding 是四个层次。吞吐上涨但 P99、租户服务差或拒绝分布失控,不是可用容量。 查看原图 ↗
ITERATION-LEVEL

每轮重组,而非一次排到底

完成序列释放 slot,新请求可加入;局部调度器分配的是本轮 token budget。它提高批利用率,但要求 block table、采样状态和取消都支持动态变化。S01

CHUNKED PREFILL

长输入切块,避免 Generation Stall

Sarathi-Serve 将长 Prefill 切块并与在途 Decode 交错;块大可能拉高流式停顿,块太小又增加调度与 kernel 开销。vLLM 当前 V1 在可用时默认启用,并优先安排 Decode,再用剩余预算处理 Prefill。S03S11

VTC · VIRTUAL TOKEN COUNTER

按服务量记账,不把每单当同重量

VTC 以输入与输出 Token 的成本函数累计客户端服务量;论文在 work-conserving 条件下证明两个持续有积压客户端间服务差的紧 2× 上界。它是公平定义与算法,不是所有产品优先级的唯一答案。S04

LOAD SHEDDING

在所有 worker 失去余量前拒绝

Dynamo 当前默认 admission control 为 none;显式启用 token-capacity 后,才会按活跃 Decode KV block 比例与 Prefill tokens 标记 busy,并在有注册实例但全部 busy 时返回 503。阈值只是实现示例,生产值要来自目标 trace 和回滚演练。S15

研究证据 · 绑定实验条件

Llumnix 在 16-GPU 集群的论文实验中,将 P99 首 Token 延迟最高改善 15×、P99 逐 Token 延迟最高改善 2×,并在相近尾延迟下节省 36% 成本

机制是跨实例动态迁移请求及其 GPU 内存状态,用于负载均衡、去碎片、优先级与缩容。这里的“最高”来自论文所选模型、trace、基线和集群,不是任意线上环境的保证;可迁移状态、带宽和部分输出协议必须先成立。S05

04 · KV IS DISTRIBUTED STATE

Prefix Cache 不只是显存优化:一旦有多个副本,它就改变路由、隔离和故障语义

PagedAttention 把逻辑 KV 切为 block,通过 block table 映射到非连续物理块,降低为最大长度预留连续显存造成的浪费。Prefix Cache 则让后来请求复用完全相同的已计算前缀 block;它省掉命中部分的 Prefill,不缓存最终答案,也不省 Decode。S02

分布式 KV 路由图:Cache Key 包含父 block hash、block token、模型和 tokenizer 版本、LoRA 或多模态 hash、租户 cache salt;全局 KV-aware router 先做模型、适配器、dtype、layout 和信任边界硬过滤,再联合前缀重叠、projected Prefill Decode 负载与本地队列评分,选择并预留副本,最后用 allocate free evict worker lost 事件对账。
缓存命中与负载均衡是一组联合决策:只追命中会制造热点,只追最空会重复 Prefill;不兼容版本与 trust group 必须在评分前硬过滤。 查看原图 ↗
IDENTITY

缓存身份不止 Token

vLLM 当前 hash 链包含父 block、block tokens 与附加键;LoRA ID、多模态输入 hash 和 cache salt 都可能进入身份。模型、Tokenizer、位置编码或 layout 不兼容时必须换 namespace。S10

ISOLATION

多租户命中可能泄露时序

非加密 hash 冲突可能产生错误共享;跨信任域的命中时延也可能成为侧信道。当前 vLLM 默认 SHA-256,并提供每请求 cache salt,把复用限定在可信共享组。S10

PLACEMENT

先 hard filter,再联合打分

兼容性、健康和容量是资格,不应与“命中收益”加权抵消。通用设计还会考虑队列与 KV headroom;Dynamo 当前基础 cost 明确组合 prefix overlap 和 projected Prefill/Decode load。P/D Decode handoff 的 topology-aware routing 需另行启用,拓扑作为 required / preferred constraint,不是基础 cost 的默认项。S13S23

EVICTION

命中率没有脱离 workload 的最优值

ATC 2025 的大提供商 trace 研究显示,单轮和多轮都可能复用,但复用概率与间隔随 workload 改变;淘汰策略必须用目标 trace 评估,不能从一组公开请求外推。S07

研究证据 · 复用与负载要共同优化

Preble 在 2~8 GPU、两种开源模型和论文所选真实 workload / 到达模式下,报告平均延迟改善 1.5×~14.5×、P99 改善 2×~10×

核心不是“永远送去命中最多的 GPU”,而是用全局共享前缀结构与局部队列联合调度,在复用计算和均衡负载之间做选择。倍率只属于其评测设置;生产目标应是目标 trace 下的尾延迟与 Goodput。S06

05 · PREFILL / DECODE DATA PLANE

P/D 分离把两类资源解耦,也把“本地指针”升级成跨池协议

Prefill 处理整段输入,往往有更高并行度;Decode 沿时间维逐步生成,反复读取权重与历史 KV。统一池简单,却可能让长 Prefill 干扰在途 Decode,并把两阶段资源配比绑死。分池后可以独立守 TTFT 与逐 Token SLO,但 KV 身份、布局、传输、背压和所有权必须显式化。

Prefill Decode 分离数据面:请求路由携带 TTFT 与前缀位置,handoff contract 定义请求和 block ID、模型、dtype、KV layout、目标地址与 deadline;Prefill 池构建 KV、注册源内存并异步传输,Decode 池预留兼容容量、接收校验后开始逐轮生成;取消、超时和背压同时作用于两阶段。
P/D 分离的关键不是画两个 GPU 池,而是定义谁预留目标空间、何时转移 ownership、怎样确认完整、超时后谁回收,以及已输出 Token 后怎样失败。 查看原图 ↗
LIKELY HELPS

阶段画像稳定分化

长输入、长生成或高并发使统一池干扰明显;两个池能保持有效 batch,且阶段独立扩缩和不同并行策略有价值。

NETWORK TAX

传输进入 TTFT 关键路径

KV 字节随层数、序列长度、KV heads 与 dtype 增长;还需传 block map、内存 handle、完成通知与失败状态。拓扑决定 RDMA/NVLink/TCP 的真实边界。

NO FREE LUNCH

短请求与低并发可能更差

小模型、短 prompt、低并发或慢 KV 传输下,分池会缩小两边 batch 并增加跳数。Dynamo 当前官方文档也明确 P/D 不自动更快。S14

DISTSERVE · OSDI 2024

在论文所选模型、应用、SLO 和硬件上,最高服务 7.4× 请求,或在相同负载下收紧 12.6× SLO

论文口径要求超过 90% 请求同时满足 TTFT 与 TPOT;系统联合优化两个池的资源、并行与带宽感知放置。它证明“阶段解耦可能释放 Goodput”,不是所有部署的默认倍率。S09

MOONCAKE · FAST 2025

生产系统把 CPU DRAM、SSD 与 NIC 纳入分布式 KVCache 池

论文描述 Kimi 生产环境覆盖数千节点、每日处理超过 1000 亿 Token;容量与在线增益仍绑定其 trace、A800/H800 集群与实现。重要启发是:KV 已从 worker 私有缓存变成可调度的分布式存储对象。S08

上线前的兼容矩阵

至少冻结模型 revision、Tokenizer、dtype、KV block size / layout、并行切分、传输后端、源目的 GPU / NIC 拓扑、超时、取消、重试和回收协议。SGLang 当前 P/D 文档分别暴露 Bootstrap timeout 与 waiting timeout;文档明确把前者关联到失联 Decode 时 Prefill 侧受影响内存的延后清理,后者控制等待窗口,不能把两者合并成同一清理结论。S18

06 · FAILURE STATE & GRACEFUL DRAIN

“重试一下”不是恢复协议:先问已算到哪、Token 是否流出、状态归谁

排队中的请求可重排;Prefill 中断通常意味着重算;KV handoff 失败要协调两端回收;已经向客户端流出 Token 后,重新从头生成可能产生重复或不同续写。恢复动作必须绑定请求状态,不能只绑定 HTTP 状态码。

LLM Serving 故障和发布状态图:请求主路径依次经过 queued、prefill、streaming 和 done,只有 P/D 分离部署才进入可选 KV handoff 支路;每个状态分别连接对应取消与失败动作,滚动发布按 unready、停止准入、drain、清理、终止顺序执行。
正确的缩容顺序是先从发现和常规流量摘除,再停止新请求、等待或迁移在途工作、清理 KV 与引擎,最后终止。把进程直接杀掉只是在客户端制造随机截断。 查看原图 ↗
CLIENT CANCEL

取消必须贯穿子请求链

HTTP 断开只是入口事件;路由、Prefill、KV transfer 与 Decode 都要收到 stop,停止后续调度并释放本地/远端 reservation,否则“无效吞吐”会持续。

WORKER LOST

迁移需要可恢复状态

Llumnix 展示了请求与 GPU 内存状态 live migration 的系统路线。Dynamo 当前 migration_limit=0,即默认关闭;设为正数后可迁移部分输出,但 n>1 与 guided decoding 仍不支持,说明“有 Token”不等于“有全部执行状态”。S05S17

ROLLBACK

权重、Tokenizer、Adapter 与 KV namespace 一起切

旧版本会话要么保持粘性直至结束,要么用显式兼容迁移;绝不能只回滚权重却继续读取另一版本生成的 KV。

DRAIN

readiness 摘流量,liveness 不催命

Kubernetes 终止 endpoint 会标记 ready=false;应用仍需将 termination grace 与最长流式请求、迁移上限和清理时间对齐。错误的 liveness 在高负载时反复重启会放大级联故障。S21S22

当前实现实例,不是通用默认

Dynamo 当前 graceful shutdown 先从 discovery 注销 endpoint,再等待 grace、停止接新请求并按配置等待在途工作;Kubernetes 超过 terminationGracePeriodSeconds 后仍会 SIGKILL。生产配置要从最长允许请求与明确迁移/失败语义反推,不能照抄文档示例秒数。S16

07 · OBSERVABILITY, BENCHMARK & RELEASE GATE

均值吞吐只是一条信号;可发布证据必须能解释每一次等待、路由、失败与回滚

Serving 是分布式状态机,监控也要从客户端时钟一路追到队列、引擎、KV 事件、跨池传输和最终 finish reason。只看 GPU 利用率,无法区分是有效生成、重复 Prefill、已取消请求,还是网络等待。

LLM Serving 发布证据图:客户端、队列、引擎、分布式层和结果层指标进入可复现实验包;实验包包含 workload manifest、system manifest、逐请求原始证据和压力故障矩阵;最后依次经过语义、SLO、公平风险与恢复门,决定 hold 或 canary。
每个指标都要对应动作:队列和 KV 触发准入或扩缩,传输失败触发清理或回退,租户切片触发公平策略,恢复演练决定能否进入 Canary。 查看原图 ↗
CLIENT CLOCK

用户实际看到什么

TTFT、相邻 response/chunk 间隔、E2E、成功/取消/截断;统一记录 P50/P95/P99,并按输入×输出、租户与场景分桶。

QUEUE & ADMISSION

等待为何发生

请求数之外记录 waiting tokens、queue age、deadline、reject reason 与 class。vLLM 当前还把 waiting reason 区分为 capacity 与 deferred。S12

KV & ENGINE

容量怎样变化

running/waiting、KV usage、prefix queries/cached tokens、block lifetime / eviction、每轮 tokens;避免“命中率高”掩盖单副本热点。

TRANSFER & RECOVERY

分布式边界是否可靠

route target、KV bytes / duration / failure / expiry、migration、cancel propagation、drain duration 和 orphan cleanup。vLLM 当前暴露 NIXL 失败、字节与传输时长指标。S12

01 · REPLAY SHAPE

先复现流量,不只复现 Prompt

保留输入/输出联合分布、共享前缀树、到达时间、burst、最大并发、取消与重试。SGLang bench 当前非无限 request-rate 使用 Poisson 到达,并可单独限制 max concurrency。S20

02 · COLD / WARM

分别测权重、Prefix 与扩容冷启动

冷缓存和暖缓存分开报告;不要在不同方案间一边保留前缀、一边 flush。扩容还要记录 image、权重加载、warmup 到 ready 的完整时间。

03 · FAULT MATRIX

主动杀 worker、卡传输、断客户端

验证停止接单、在途终态、KV 回收、重试上限、版本隔离和 drain。SGLang 当前支持请求 dump/replay 与 crash dump/replay,可保存服务参数和在途请求用于诊断。S19

04 · SHIP GATE

语义、SLO、公平与恢复四门同时过

Candidate 必须使用相同生成合同;Goodput 分母含错误与拒绝;关键租户不退化;回滚与缩容演练通过。否则 Hold,而不是用平均吞吐抵消。

上线前 10 问
  1. 模型、Tokenizer、Adapter、Template 和缓存 namespace 是否同版本?
  2. Open-loop 到达、burst、输入×输出联合分布与 prefix skew 是否来自目标 trace?
  3. Admission 是否按 Token、KV、queue age 和租户,而不只按并发数?
  4. 基础 KV 路由是否先 hard filter,再联合 overlap 与 projected P/D load;P/D handoff 是否按需另行启用 topology required / preferred constraint?
  5. 局部调度是否明确 Decode / Chunked Prefill、抢占、aging 与公平口径?
  6. P/D handoff 是否定义 ID、layout、ownership、背压、超时、取消和回收?
  7. 客户端断开是否能停止所有子请求并释放远端 KV?
  8. 缩容是否先 unready、停准入、drain,再清理和终止?
  9. 逐请求日志能否还原 route、cache hit、排队、传输、时钟和 finish reason?
  10. Cold/Warm、过载、worker kill、网络 stall、回滚与 Canary 是否都有门槛和 Owner?
RESEARCH LEDGER

一手来源与证据边界

优先使用论文、官方文档、官方模型卡和代码仓库。页面中的数字只代表来源所述设置,不自动外推到其他模型与数据。

S01
Orca: A Distributed Serving System for Transformer-Based Generative ModelsYu et al. · OSDI 2022

Iteration-level Scheduling(迭代级调度)和 selective batching 的原始系统设计。

S02
Efficient Memory Management for Large Language Model Serving with PagedAttentionKwon et al. · SOSP 2023

逻辑 KV block 到物理 block 的分页映射、按需分配、共享和碎片边界。

S03
Taming Throughput-Latency Tradeoff in LLM Inference with Sarathi-ServeAgrawal et al. · OSDI 2024

Chunked Prefill 与 stall-free batching 如何减少长 Prefill 对在途 Decode 的干扰。

S04
Fairness in Serving Large Language ModelsSheng et al. · OSDI 2024

Virtual Token Counter(虚拟 Token 计数器)以输入/输出 Token 成本定义 work-conserving fairness。

S05
Llumnix: Dynamic Scheduling for Large Language Model ServingSun et al. · OSDI 2024

跨模型实例迁移请求及其内存状态,用于负载均衡、隔离、优先级和缩容 drain。

S06
Preble: Efficient Distributed Prompt Scheduling for LLM ServingSrivatsa et al. · ICLR 2025

分布式前缀共享场景中,联合优化 KV 复用与副本负载,而非只追缓存命中。

S07
KVCache Cache in the Wild: Characterizing and Optimizing KVCache Cache at a Large Cloud ProviderWang et al. · USENIX ATC 2025

真实云提供商 trace 中前缀复用、复用间隔和淘汰收益随 workload 变化的实证边界。

S08
Mooncake: Trading More Storage for Less Computation — A KVCache-centric Architecture for Serving LLM ChatbotQin et al. · FAST 2025

以分布式 KVCache 池为中心的 P/D 分离、调度与生产规模证据。

S09
DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model ServingZhong et al. · OSDI 2024

分阶段 TTFT/TPOT SLO、P/D 资源分配、并行策略与带宽感知放置。

S10
Automatic Prefix CachingvLLM · 核查于 2026-07-17

当前完整 block hash、父 block、LoRA/多模态附加键、LRU、SHA-256 与 cache salt 隔离。

S11
Optimization and TuningvLLM · 核查于 2026-07-17

当前 V1 Chunked Prefill 默认调度、Decode 优先与 max_num_batched_tokens 的 TTFT/ITL 取舍。

S12
Production MetricsvLLM · 核查于 2026-07-17

队列、Prefill、TTFT、ITL、KV 使用、等待原因与 NIXL KV 传输失败等当前指标。

S13
Routing ConceptsNVIDIA Dynamo · 核查于 2026-07-17

当前基础路由 cost 如何组合 KV overlap 与 projected Prefill/Decode load。

S14
Disaggregated ServingNVIDIA Dynamo · 核查于 2026-07-17

当前 P/D 分离工作流、KV transfer 关键路径、适用负载与“不自动更快”的官方说明。

S15
Request RejectionNVIDIA Dynamo · 核查于 2026-07-17

显式启用 token-capacity admission control 后,按活跃 Decode KV blocks 与 Prefill tokens 判 busy、全忙时返回 503。

S16
Graceful ShutdownNVIDIA Dynamo · 核查于 2026-07-17

先注销发现、停止新流量、等待在途请求、清理资源与 Kubernetes grace 的当前生命周期。

S17
Request MigrationNVIDIA Dynamo · 核查于 2026-07-17

当前迁移默认关闭;启用后的部分输出恢复,以及 n>1 与 guided decoding 暂不支持等限制。

S18
PD DisaggregationSGLang · 核查于 2026-07-17

当前 Mooncake/NIXL 传输后端、Bootstrap timeout 的失联清理边界与独立的 waiting timeout 配置。

S19
ObservabilitySGLang · 核查于 2026-07-17

Prometheus、请求 dump/replay 与 crash dump/replay 的当前诊断入口。

S20
Bench Serving GuideSGLang · 核查于 2026-07-17

Poisson 到达率、最大并发、流式指标、逐请求明细与 JSONL 实验记录。

S21
Pod LifecycleKubernetes · 核查于 2026-07-17

Pod 终止时 EndpointSlice ready/serving/terminating、SIGTERM、grace period 与 SIGKILL 的边界。

S22
Liveness, Readiness, and Startup ProbesKubernetes · 核查于 2026-07-17

readiness 与 liveness 的不同职责,以及错误 liveness 在高负载下触发级联故障的风险。

S23
Topology-Aware KV TransferNVIDIA Dynamo · 核查于 2026-07-17

P/D Decode handoff 场景另行启用的 required / preferred worker 拓扑约束及其 fallback 语义。