架构核查 · 2026

推理为什么是
一个调度问题

2026 年 9 月的一篇报道里,AWS 前副总裁 Joe Magerramov 有一句被顺带引用的话。它听上去像个比喻,但它是一个可以核查的技术判断。

推理的本质,不太像一个网站服务,更像一个调度系统。 Joe Magerramov · AWS 前副总裁

如果这句话成立,意思是:过去二十年为网站打磨的那套架构,用在 AI 推理上是选错了抽象层。不是"性能没调好",是"这道题的类型判断错了"。

核查结论是它成立——而且比字面意思更具体:推理不只是"像"调度系统,它要解决的正是调度领域的四个经典问题,其中一个在网站架构里根本不存在。

它甚至已经被写进了主流大模型的价目表——见第 05 节。

一个请求在机器里的一生

吃算力 吃内存带宽
读题整段输入一次读进去 答题一次吐一个字,每次都要翻一遍笔记
笔记(KV cache)占用的显存 答得越长 → 占得越多 → 答完才能扔

同一个请求,前半段缺算力,后半段缺的是另一样东西。

01

先看一个 AI 请求在机器里经历了什么

这是后面所有论证的物理基础

你问模型一个问题,它的处理分两段。

阶段它在做什么主要瓶颈耗时取决于
读题
算力
把你输入的整段文字一次性读进去、理解一遍。像一口气读完一份长文件。 显卡算得快不快 你输入多长
答题
内存带宽
一个字一个字往外吐。每吐一个字,都要把前面记下的全部笔记翻一遍,才能决定下一个字是什么。 显存读得快不快 它要答多长
(事先不知道)
关键:同一个请求,前后两段吃的是完全不同的资源。而那份笔记会一直占着显存,答得越长占得越多,答完之前不能扔。

记住这三件事——前后吃的资源相反、笔记必须一直留着、耗时取决于答多长而这个事先不知道。后面每一条论证都从这里出发。

快餐店

网站服务

一波波整齐完成循环

每单几十秒,谁做都行,做完就走。所以叫号就完事了——"下一单给谁"这个决定不重要。

手术室

AI 推理

短的早做完在空等,长的还在跑循环

时长差两个数量级,中途要不同设备,有的必须为急诊让台。排手术不能靠轮流叫号。

02

网站那套架构,其实假设了三件事

不是谁的定义,是这套架构默认成立、而且在网站场景下确实成立的前提

前提一 · 每个请求都差不多,谁处理都一样

任何一台服务器都能处理任何一个请求,成本大致相同。这是"轮流分配"能工作的全部理由——轮流之所以有效,恰恰因为"下一个给谁"这个决定不重要。

前提二 · 请求之间互不相干,服务器不记事

处理完就忘,不为任何请求保留中间状态。这是"加机器就能扛更多流量"的全部理由——新机器不需要知道任何历史,插上电就能干活。

前提三 · 每个请求都很短,而且长短差不多

毫秒到秒级完成,时长集中。超时就算失败,失败就重试。这是超时重试、连接池、以及"要么立刻服务要么直接拒绝"这套约定的全部理由。

三条合起来,支撑了一件事:给每个客户设额度。因为请求又短又同质,"你每分钟最多发 N 个请求"才是一个有意义的资源上限——一分钟 100 个请求、每个 50 毫秒,这个额度能准确对应一份算力。

换句话说:额度制的地基,就是这三个假设。
03

三个假设,逐条失效

地基塌了,建在上面的治理方式也就悬空了

前提一失效:请求根本不同质

两个层面。请求之间不同质——"帮我改个错别字"和"写一份三千字方案"耗时差两个数量级,而且你事先不知道它要答多长,这不像文件下载,大小是已知的。

更麻烦的是请求内部也不同质:读题段吃算力,答题段吃内存带宽。

这一条比第一层更致命。它意味着"这个请求需要什么资源"这个问题,在请求的生命周期里答案是变的。你没法在派发的那一刻,就把它当成一个固定规格的工作包。

前提二失效:必须记事,而且记的东西很占地方

那份笔记必须从头留到尾,这带来三个连锁后果:

并发数由显存决定一台机器能同时处理多少请求,受限于显存装得下多少份笔记,不是受限于算力。
容量是浮动的请求答得越长,笔记越厚,能并发的请求数越少——同一台机器的容量在一天里是变的。
加机器不能立刻扛流量新机器上得先有那个模型。见第 04 节"放置"。

前提三失效:时长跨度大到没法用一个超时值覆盖

从几秒到几十分钟。你没法设一个超时值同时适用于"改错别字"和"写方案"。

而这条失效之后,反而打开了一扇网站架构里没有的门:既然任务够长,那"暂停它、让别的先跑、之后再接着跑"就变得划算了。

一个 50 毫秒的网站请求,你保存它的状态再恢复,开销比直接跑完还大——所以网站架构里没人做这件事。但一个跑了 20 分钟的任务,暂停它去让路,完全值得。这是理解下一节的钥匙。
三条一失效,额度制的地基就没了。请求不同质、长短不定,"每分钟 N 次"就不再对应一份确定的算力——同样是 100 次调用,可能占一台机器一分钟,也可能占十分钟。额度还在,但它不再是一个有意义的资源单位。
04

于是你要解决四个新问题

"调度系统"这四个字,具体是什么意思

调度这个领域有四个经典关切。推理系统四个全占,而且其中一个是网站架构里完全不存在的。

4.1 优先级:不只是"谁先排队",是"能不能打断正在做的"

网站架构里也有优先级——分流器可以设权重、可以有优先队列。但它们调整的都是"入队顺序":决定谁先被取出来处理。一旦开始处理,就一路跑到完。

推理系统里的优先级不一样。AWS 在发布会上描述过这样一个场景:

如果一波实时流量涌进来,正在跑的微调任务会暂停。等这波流量过去,它从刚才停下的地方接着跑。 AWS re:Invent 2025 主题演讲

抢占:已经在跑的工作被中途冻结、让路、再恢复

8 秒循环
微调任务
运行 · 可被打断
暂停 · 保留断点
实时流量
突发 · 优先服务
t = 0时间 →完成

微调任务独占算力,稳定推进。

网站架构里没有这个动作。你不会把一个正在执行的网页请求冻起来腾算力——因为一个 50 毫秒的请求,存取状态比直接跑完还贵。而一个跑了 20 分钟的任务,暂停它去让路完全值得。

用医院打比方:急诊来了,正在做的择期手术暂停让台。这在快餐店里不会发生——你不会把做了一半的汉堡放回去。

4.2 公平:真正的问题不是"公不公平",是"资源能不能流动"

这一条网站架构有对应物——就是额度制。而 AWS 的官方文档里,恰好把两种做法摆在一起对比了:

老入口:在许多传统的多客户共享服务中,架构是围绕给每个账号设额度来设计的,以此管理对共享资源的公平访问。老入口就是这么做的。

新入口:这个入口采用高级调度与排队机制……大多数情况下请求会被立即处理,某些情况下请求可能会短暂排队,直到手上的活干完、算力释放出来。 AWS 官方文档 · 已译为白话,"传统的"三个字是原文用词

额度制:你的天花板,也是别人的禁区

排队中
客户 A客户 B客户 C

A 用满了在排队,B 和 C 的算力空着——但 A 拿不到。想多用得走审批。

调度制:空闲可以被任何人消化

客户 A客户 B客户 C

公平由排队顺序保证,不靠静态额度。橙色是 A 溢出到空闲区的部分。

顺带解释一个现象:同一篇报道说客户申请扩容要等最长三周,而官方文档写的是额度固定、"你可以申请提高"。

在额度制下,"我需要更多算力"是一个行政申请,不是一个技术调度。三周不是系统慢,是审批链条长。官方文档描述机制、独立媒体报道症状,两边对上了。
还有一个容易被忽略的变化:承诺的性质变了。

网站的承诺是二选一:要么立刻服务,要么直接拒绝。你的程序按这个逻辑写重试。
调度系统的承诺是:你可能要等一会儿,但你会被服务。

这意味着调用方的重试逻辑、超时设置、容量规划全都要跟着改。

4.3 放置:这个请求该发到哪台机器

网站架构里这是"负载均衡"——轮流、或者谁手上活最少给谁。而且这个决定是无记忆的:每个请求独立决定去哪,因为前提一成立。推理场景下这个前提不成立,有两个原因。

原因一 · 模型在哪台机器上

模型的参数得先装进显卡的显存里才能用。一个大模型几十 GB,装一次要几十秒到几分钟。

所以"发给哪台机器"不再是均衡问题,而是"那台机器上有没有这个模型"的问题。放置决策的代价高度不对称:放对了几乎零成本,放错了要付一次模型装载。

诚实标注:这一条的机制是确定的(模型必须驻留显存、装载耗时以分钟计),但把它和报道里"没有充分利用已有芯片容量"这个症状连起来,是本研究的推断,没有公开证据直接支持。

原因二 · 笔记能不能复用 (有源码证据)

开源引擎 SGLang 的源码里,调度策略明确分成两类:CacheAwarePolicy(知道缓存状态的)和 CacheAgnosticPolicy(不知道的)。

其中一个策略叫最长前缀匹配——把开头部分相同的请求排在一起,那份笔记就可以复用,不用重算。

实际场景:一个客服机器人,每次调用都带同样一段很长的系统提示词。如果调度器把这些请求排在一起,那段提示词的笔记只需要算一次。

同样三个请求,排法不同,代价不同

循环
分散排队
前缀各算一次
相同的系统提示词问题 A
相同的系统提示词问题 B
相同的系统提示词问题 C
按前缀排一起
前缀只算一次
相同的系统提示词问题 A
复用上面的笔记问题 B
复用上面的笔记问题 C
分散:算 3 次前缀 → 排一起:算 1 次 同样的三个请求,调度顺序改变了总计算量。
所以"放到哪"这个问题在推理里有了网站架构没有的第二个维度:不只是"哪台机器闲",还有"哪台机器上有能复用的东西"。

这件事已经被主流厂商做成了价格,而且差价非常大——见第 05 节。

4.4 共置:这个请求和谁一起做

这是四个里最特别的一个。前三个在网站架构里至少有退化版本,这一个完全没有。

网站为什么没有:网站的并发靠多进程、多线程实现。两个请求同时在跑,各跑各的,除了抢 CPU 和内存之外互不影响。请求 A 存在与否,不改变请求 B 的执行方式。

推理为什么有:为了让显卡跑满,推理系统会把多个请求的字拼进同一次计算——它们在数学上被合并成一个矩阵运算,一起过一遍模型。

用拼车打比方:车越满,平摊成本越低、总运力越高;但每个人都得等最慢的那位下车。

所以"把谁和谁拼在一起"是一个直接改变每个人到达时间的决定。

这不是推演。vLLM 的官方文档把这个权衡量化到了具体参数上——把下面的滑块拖一拖:

共置权衡实验台

调节 vLLM 参数 max_num_batched_tokens
20484096819216384

首字响应速度 · TTFT

你按下回车,到看见第一个字

较快越长越好

吐字流畅度 · ITL

第一个字之后,后面的字吐得多稳

中等越长越好

这一批里拼了谁

4 个请求同批
每个请求都要等整批算完 → 等待窗口:中等

数据性质说明:vLLM 官方文档给出的是方向性关系("较小的值如 2048 有更好的 ITL,因为挤进来拖慢答题的读题任务更少";"较大的值有更好的 TTFT")与一条推荐阈值("为获得最佳吞吐,推荐设为大于 8192")。官方没有公布实测曲线,所以此处用相对指数而非具体毫秒数——不伪造精确值。

我特意去找了反例

既然说"网站架构完全没有",那就得去找找看是不是真的没有。我查了三个候选:

候选对应物是不是同一回事
HTTP/2 多路复用
多个请求共用一条连接
不是。共用的是传输通道,不改变各自的处理方式。
数据库连接池
多个请求共用连接
不是。共用连接,但请求是排队串行执行的,没有合并。
批量接口
一次提交一百条数据
不是。那是调用方主动打的包,不是调度器的决定。
三个都不等价。关键区别:网站架构里没有"调度器决定把哪些独立到达的请求合并成一次计算"这件事。
05

价目表上的证据:缓存命中为什么能便宜 5 到 50 倍

如果推理真是无状态的网站服务,价目表上根本不会有「缓存命中」这一列

翻开主流大模型的价目表,都能看到一个网站服务里从来没有的东西:同样是"输入",被拆成了两个价——缓存命中和缓存未命中。而且差得非常多。

厂商缓存命中价是未命中价的便宜来源
DeepSeek
deepseek-flash
0.02 元 / 百万 token
未命中 1 元
2%50 倍官方价格页
DeepSeek
deepseek-v4-pro
0.15 元 / 百万 token
未命中 4.5 元
约 3.3%30 倍官方价格页
Anthropic基础输入价的 0.1 倍10%10 倍官方缓存文档
OpenAI官方原话"最多便宜 90%"最低 10%最多 10 倍官方缓存指南
阿里云百炼
显式缓存
输入单价的 10%10%10 倍官方文档
阿里云百炼
隐式缓存
输入单价的 20%20%5 倍官方文档
DeepSeek 为空闲时段价格;高峰时段价格翻倍,比例不变。「便宜几倍」= 未命中价 ÷ 命中价。

从便宜 5 倍到便宜 50 倍。同样的字,价格为什么能差这么多?答案全在第 01 节讲过的那件事里——那份笔记。

一个比方,串起下面四条原理笔记摊在某一张桌子上。你得被安排坐到那张桌子前才用得上;让它一直摊着要占桌子,所以要收钱;桌子要腾给别人时,笔记就被收走;一群人同时进门时,第一份笔记还没写完,谁也借不到。

原理一:命中省掉的,正是最贵的那一段

回想第 01 节:读题阶段要把整段输入读一遍、生成那份笔记,这一段吃算力。如果两次请求的开头一模一样——同一段系统提示词、同一份长文档、同一组示例——那段开头的笔记第一次就已经算好了,第二次拿来接着用就行。

vLLM 的设计文档把做法讲得很清楚:把笔记切成一块一块,每一块用"这块里的字 + 它前面所有的字"算一个指纹(哈希);新请求来了,从头逐块比对指纹,对得上的块直接复用。

核心想法很简单——我们把已处理请求的笔记块缓存下来,当新请求带着与之前请求相同的前缀到来时,复用这些块。vLLM 官方文档 · 已译为白话

缓存只认前缀

上一个请求笔记已算好
系统提示词工具定义长文档问题 A
这一个请求
系统提示词工具定义长文档问题 B
命中 · 复用笔记未命中 · 从头读改了一个字

前三块的指纹和上一个请求完全一致 → 命中 3 块,直接复用笔记;只有最后的问题不同,这 1 块才需要从头读。

注意"它前面所有的字"。这就是为什么缓存只认前缀:后一块的指纹里包含了前面所有块,开头改一个字,后面全部作废——哪怕一字未改。所以命中省掉的,正是读题阶段对那段开头的计算,恰好是最吃算力的那部分。OpenAI 官方把收益列成三条:少算、便宜、首字更快。

原理二:命中不是自动的——要被"调度"到对的机器上

笔记存在哪?OpenAI 的官方文档写得很直白:

缓存状态存在单台机器上……只有当请求到达一台持有匹配且未过期条目的机器时,才能复用缓存前缀。因此,把请求路由到正确的机器,对缓存复用至关重要。OpenAI 官方缓存指南 · 已译为白话

它的路由依据也写明了三条:当前机器的负载和可用容量、请求开头若干 token 的哈希,以及一个可选的缓存键。

命中要靠调度:请求得被派到有笔记的那台机器

循环
新请求
开头相同
调度器
机器 A没有这份笔记—
机器 B有你的笔记
—
机器 C没有这份笔记—
命中 —未命中 —派到 B溢出到 A / C

流量平稳时,调度器按开头的指纹把请求都派给有笔记的机器 B —— 全部命中;流量涌上来时,B 忙不过来,溢出的请求被分到 A、C —— 那里没有这份笔记,全部未命中。

这就是第 4.3 节"放置"的第二个维度,被官方写进了文档。而两个目标会打架:有你笔记的那台机器,可能正忙。OpenAI 文档写道,流量超过每分钟 15 次请求时,就可能发生溢出路由——请求被分到别的机器上,也就可能找不到这份笔记。

缓存命中率,本质上是调度器在"哪台机器闲"和"笔记在哪台机器上"之间取舍的结果。

原理三:让笔记一直摊着要占显存——所以要收写入费,还会过期

第 03 节说过,笔记必须留在显存里,而显存是整台机器最稀缺的资源。缓存,就是有意让笔记在请求结束之后继续占着显存,等下一个人来用。这件事有成本,价目表上看得见:

写入要加价Anthropic 写入缓存按基础输入价的 1.25 倍收(保留 5 分钟),保留 1 小时则是 2 倍;阿里云百炼显式缓存,创建时按输入单价的 125% 收。
占用时长明码标价Google 对显式上下文缓存单列一项存储费:每百万 token 每小时 0.5 美元(官方标注为 2026 年底前的价格)。
会过期Anthropic 默认 5 分钟,每次命中重新计时;OpenAI 默认约 5 到 10 分钟无人使用后失效,最长 1 小时;阿里云百炼显式缓存 5 分钟,命中后重置。

以 5 分钟有效期为例:每次命中重新计时,过期就被腾掉

演示中 1 秒 = 1 分钟
缓存条目 · 开头那段笔记
有效期 5:00
第 0 分钟 · 未命中 · 写入 1.25 第 2 分钟 · 命中 0.1 第 4 分钟 · 命中 0.1 第 9 分钟 · 5 分钟无人使用 · 已腾掉 第 11 分钟 · 未命中 · 重新写入 1.25

四次请求,开头那段累计 2.70 份 (不用缓存是 4 份;按 Anthropic 官方倍率自算)

收写入费、按小时收存储费、到时间就清掉——说的是同一句话:笔记占着的是稀缺资源,占得越久越贵。网站服务不存在这个问题,因为它处理完就忘。

有一家的做法值得一提:DeepSeek 把笔记存到了硬盘上,官方叫"上下文硬盘缓存",默认开启、无需改代码,"缓存不再使用后会自动被清空,时间一般为几个小时到几天",同时明说这是"尽力而为,不保证 100% 缓存命中"。它的命中价也是表里最低的——只有未命中的 2%。

诚实标注:硬盘比显存便宜得多、容量大得多,这很可能是它的缓存能活几小时到几天、命中价能压到 2% 的原因——但这是本研究的推断,DeepSeek 官方页面并没有这样说。

原理四:同时来的请求,谁也吃不到缓存

Anthropic 官方文档里有一句很容易被忽略的话:

对于并发请求,缓存条目只有在第一个响应开始之后才可用。如果希望并行请求也能命中缓存,请等第一个响应开始后再发送后续请求。Anthropic 官方缓存文档 · 已译为白话

DeepSeek 的文档说的是同一件事:"缓存命中的前提是相应前缀已被'落盘'。"十个开头相同的请求同时发出去,十个全按未命中计价——第一份笔记还没写完,别人借不到。自己切换一下看看:

同样十个请求,换个发送顺序

#1
#2
#3
#4
#5
#6
#7
#8
#9
#10
第一个响应开始
t = 0每条是一个请求开头那段的处理 · 时间 →(示意,非实测)
未命中 · 全价 1写入缓存 · 1.25命中 · 0.1
开头那段一共付了10.00份
02.1510

十个请求同时出发:第一份笔记还没写完,别人借不到——十个全按未命中计价。

费用按 Anthropic 官方倍率自算,只算开头那段、不算输出:同时发至少 10 份全价;先发一个、等它开始返回再发其余九个 = 1.25 + 9 × 0.1 = 2.15 份。
同样的十个请求,只是换了发送顺序,开头那段的费用差了 4.6 倍以上。命中与否,取决于请求在时间上怎么排——这是最纯粹的调度问题。

显式与隐式:确定性是有价格的

阿里云百炼显式缓存隐式缓存
怎么开启你主动为指定内容创建缓存系统自动识别公共前缀,无法关闭
能否确定命中有效期内确定命中不保证
命中价输入单价的 10%输入单价的 20%
有效期5 分钟,命中后重置不确定,系统定期清理

两种模式把"确定性"和"省事"做成了两个价:显式要你先付一笔创建费(125%),换来确定命中和更低的命中价;隐式免配置,但命中不保证、命中价高一倍。你告诉调度器的越确定,它越能替你省。

如果推理真是无状态的网站服务,价目表上根本不会有"缓存命中"这一列。网站服务器处理完就忘,没有东西可以被"命中"。

这一列的存在本身,就是第 03 节"前提二失效"的商业证据——推理必须记事;而它的价格高低,又取决于第 04 节的放置(笔记在哪台机器上)和请求的先后顺序(谁先写、谁后读)。

缓存价格,就是调度质量被翻译成了钱。

对使用方的四条实际建议

  1. 固定的放前面,变动的放后面。系统提示词、工具定义、长文档放开头;时间戳、用户问题、每次不同的内容放最后。开头改一个字,后面全部未命中。开头还要够长——OpenAI 要求至少 1,024 个 token(GPT-5.6 及以后),阿里云百炼也是 1,024,Google Gemini 3 系列是 4,096,太短的开头根本不进缓存。
  2. 开头相同的一批请求,别同时发。先发一个,等它开始返回,再发其余的。
  3. 请求间隔别超过有效期。5 分钟没人用,笔记就被腾掉了。
  4. 看返回结果里的命中数字,别凭感觉。Anthropic 的 cache_read_input_tokens、OpenAI 的 cached_tokens、DeepSeek 的 prompt_cache_hit_tokens——如果它一直是零,说明你以为固定的开头,其实每次都在变。
06

最硬的证据:两套词汇表

厂商讲自己的架构,既是当事人又是解说员——所以去读开源代码

到这里为止的论证,主要材料来自 AWS。所以我去看了开源社区的代码:目前最主流的两个开源推理引擎 vLLM 和 SGLang,它们的调度策略是公开的、可以逐行读的。

把它们实现的策略名字,和传统网站分流器的策略名字并排放——

推理引擎实际实现的

出自操作系统教科书

  • 先来先服务FCFS
  • 最高响应比优先HRRN · 等得越久越往前挪
  • 最长输出优先LOF
  • 最长前缀匹配LPM · 能复用笔记的排一起

传统网站分流器的

出自网络设备手册

  • 轮流分配round-robin
  • 谁手上活最少给谁least-connections
  • 按内容哈希固定分配consistent-hash
  • 按权重分配weighted

左边那个"最高响应比优先",是 1970 年代提出的算法,专门解决一个老问题:如果总让"活最短的先做",大活会永远排不上队、被活活饿死。配套机制叫老化——排队越久自动加分,慢慢往前挪。

两个独立的开源团队,没有商量过,各自把操作系统的调度算法搬进了推理引擎。

这比任何厂商白皮书都有说服力——当互不相干的实现者收敛到同一套抽象,说明约束来自问题本身,而不是某家公司的偏好。

而 vLLM 官方文档解释这么做的理由时,说的正是第 01 节那件事:

把大的读题任务切成小块,和答题任务混在一起批处理,可以更好地平衡吃算力的和吃内存带宽的两类操作。 vLLM 官方文档 · 已译为白话

同一个物理事实,一边是厂商在发布会上讲,一边是开源代码在实现。两边对上了。

07

这个判断的边界在哪

一个判断如果在任何情况下都成立,通常说明它不够具体

所以我专门去找了反例:有没有哪种情况下,推理请求确实可以被当成一批一模一样的活来处理?

找到了。

静态批处理并不总是错的。当负载可预测、延迟不关键时它就够用。更具体地说,如果请求预先就都在手上、且长度相对均匀,静态批处理简单有效,不需要任何动态调度。 推理系统技术文档 ·「静态批处理」= 凑够一批一起发、等全批做完

翻译一下:如果你是把一万条数据一次性丢过去、不着急要结果,那笨办法就够用了。前面说的资源差异依然存在,但它们不再影响你该怎么排班。

网约车

需要实时调度

乘客零散到达、去向不同。什么时候叫车、去哪、堵不堵,全都不确定——必须随到随调。

旅游团

不需要调度

人齐了、路线定了、几点出发定了,一起走。照计划走就行——这就是静态批处理。

所以这句论断的准确版本是:

推理请求的资源需求确实是异质的,这是物理事实,无条件成立;但它是否构成一个调度问题,取决于负载的形态。
负载形态要不要调度
长短不一 + 随时到达 + 要求快必须调度
长度均匀 + 预先都在手上 + 不急笨办法就够
并发很低 / 输入很短调度的开销比收益还大
这个边界有现实印证:所有主流推理平台都单独设了一个「离线批量」档位,而且普遍打五折。而离线批量正好就是"笨办法够用"的那个场景——那一档便宜,不只是因为你愿意等,也因为那个场景下排班本身就更简单。

顺带纠正一个想当然

我原本以为,把"读题"和"答题"拆到不同机器上跑是为了提高效率。vLLM 官方文档明确写着:

注意:拆分读题和答题并不提高吞吐量。 vLLM 官方文档 · 原文为 "Disaggregated prefill DOES NOT improve throughput."

它存在的理由是让"首字响应速度"和"后续吐字速度"可以分别调整,以及控制最坏情况下的延迟。换来的是延迟可控,不是效率。

08

既然是调度系统,就会得调度系统的病

判断一个系统是什么类型,看它出什么故障,比看它有什么功能更可靠

去读 vLLM 和 SGLang 的源码注释,会看到这类词。

病症一 · 队头堵塞(源码注释里叫「活锁」)

循环
显存
空闲 18%
请求 #1需要 31%
放不下
#2需要 6%
#3需要 4%
#4需要 9%
…… 后面全堵着

排头那个请求要的显存怎么都凑不出来,而它不让位——后面明明放得下的全过不去。系统在忙,但没有进展。

病症二 · 撤回重算风暴

循环

系统在高压下把正在跑的请求撤下来腾地方,撤下来的又要重算,重算又占资源,于是撤得更多——越忙越撤,越撤越忙。

请求 #1
请求 #2
请求 #3

跑到一半 → 变红即被撤回 → 从头重算 → 又被撤回。进度条反复清零,算力都花在重复劳动上。

SGLang 的源码注释里明确记着,这在某些模型上高并发时会发生。

这两个都是操作系统调度的经典病症,不是网站架构的病症。

网站架构的典型故障是「超时」和「拒绝服务」,不是「活锁」和「撤回风暴」。一个系统会得什么病,比它有什么功能更能说明它是什么类型的系统。

顺带一个观察

AWS 讲抢占时只讲好处——微调任务给实时流量让路、之后从断点接着跑。从不讲代价。

而 vLLM 的官方文档直接写着:抢占和重算会损害端到端延迟。

想了解一个调度系统真实的脆弱点,读开源社区的源码注释,比读厂商的发布材料有效得多——开源要公开处理故障,所以留下了失败的记录;厂商的发布材料不会有。
09

这句话到底意味着什么

核查结论

回到开头那句:推理不太像网站服务,更像调度系统。核查下来它成立,而且比字面意思更具体:

  1. 物理层面:一个请求前后两段吃的资源相反,笔记必须全程占着显存,耗时事先不知道。
  2. 假设层面:网站架构的三个前提——同质、无状态、时长短——逐条失效。
  3. 问题层面:你要解决调度的四个经典问题,其中"和谁一起做"是网站架构里根本不存在的。
  4. 实现层面:两个独立的开源团队,各自把操作系统的调度算法搬了进来。
  5. 价格层面:主流价目表都给「缓存命中」单独定价,便宜 5 到 50 倍——而命中与否,取决于请求被派到哪台机器、以什么顺序到达。
  6. 故障层面:它得的是队头堵塞、撤回风暴这类调度系统的病。
  7. 边界层面:这一切只在"长短不一 + 随时到达 + 要求快"时成立;离线批量场景下,笨办法就够。

对使用方而言,最实际的一条

网站服务给你的承诺是二选一:立刻服务,或者直接拒绝。
调度系统给你的承诺是:你可能要等,但你会被服务。

这一句话的变化,意味着重试逻辑、超时设置、容量规划全都要重写。如果你的系统还按"要么成功要么失败"的假设写调用代码,那它在调度制下的表现会很奇怪——不是报错,是莫名其妙地变慢。而"变慢"比"报错"难排查得多。

› 全部引用与查证来源 25 条 · 点击展开

下列是本文每一条事实、引文与数据的来源。标注「一手」的是厂商官方文档、价格页或开源源码;标注「二手」的是媒体报道或第三方转录,本文在正文中已就其性质作了说明。每条都注明了它具体支撑文章的哪一部分。

核心论断的出处文章开篇那句判断的来源

01

The Information《How Six AWS Engineers Rebuilt Bedrock to Challenge Microsoft》

https://www.theinformation.com/articles/six-aws-engineers-rebuilt-bedrock-challenge-microsoft

二手类型:付费媒体报道(需订阅)用于:开篇 Magerramov 引语;4.2 节「三周扩容等待」

AWS 官方材料厂商侧的一手文档

02

AWS 官方文档 · Amazon Bedrock 端点对比

https://docs.aws.amazon.com/bedrock/latest/userguide/endpoints.html

一手类型:官方产品文档用于:4.2 节「传统额度制 vs 调度排队」并置引文、「可能短暂排队」的契约变化

03

AWS re:Invent 2025 主题演讲记录(DeSantis & Brown)

https://www.ernestchiang.com/en/posts/2025/aws-reinvent-2025-keynote-with-peter-desantis-and-dave-brown/

二手类型:第三方转录(含语音转文字痕迹)用于:4.1 节抢占场景「微调任务暂停让路、从断点恢复」

04

AWS 官方文档 · Bedrock 服务档位

https://docs.aws.amazon.com/bedrock/latest/userguide/service-tiers-inference.html

一手类型:官方产品文档用于:第 7 节「所有主流平台都设了离线批量档」

开源推理引擎(含源码级证据)本文最硬的一组证据 —— 不依赖任何厂商叙事

05

vLLM 官方文档 · 优化与调优

https://docs.vllm.ai/en/stable/configuration/optimization/

一手类型:官方技术文档用于:第 1 节读题/答题的资源差异;4.4 节 ITL 与 TTFT 的此消彼长;第 8 节「抢占与重算会损害端到端延迟」

06

vLLM 源码 · SchedulerConfig

https://github.com/vllm-project/vllm/blob/main/vllm/config/scheduler.py

一手类型:开源源码(最高一手级别)用于:第 6 节词汇表:调度策略默认 fcfs、可选 priority

07

vLLM 源码 · V1 Scheduler

https://github.com/vllm-project/vllm/blob/main/vllm/v1/core/sched/scheduler.py

一手类型:开源源码用于:4.1 节抢占的实际实现;第 8 节队头堵塞

08

vLLM 官方文档 · 分离式 Prefill

https://docs.vllm.ai/en/latest/features/disagg_prefill/

一手类型:官方技术文档用于:第 7 节「拆分读题和答题并不提高吞吐量」

09

SGLang 源码 · schedule_policy.py

https://github.com/sgl-project/sglang/blob/main/python/sglang/srt/managers/schedule_policy.py

一手类型:开源源码(最高一手级别)用于:第 6 节两套词汇表(FCFS / HRRN / LOF / LPM);4.3 节前缀复用;第 8 节撤回重算风暴的源码注释

缓存定价与机制第 5 节「价目表上的证据」的全部来源

10

vLLM 官方文档 · 自动前缀缓存设计

https://docs.vllm.ai/en/latest/design/prefix_caching.html

一手类型:开源项目官方设计文档用于:第 5 节原理一:笔记分块、每块指纹包含前面所有的字;最近最少使用淘汰

11

OpenAI 官方指南 · Prompt caching

https://developers.openai.com/api/docs/guides/prompt-caching

一手类型:官方产品文档用于:第 5 节价格表「最多便宜 90%」;原理二的路由依据、「缓存存在单台机器上」与溢出路由;最小 1,024 token;有效期

12

Anthropic 官方文档 · Prompt caching

https://platform.claude.com/docs/en/build-with-claude/prompt-caching

一手类型:官方产品文档用于:第 5 节价格表 0.1 倍;原理三写入 1.25 倍 / 2 倍与 5 分钟有效期;原理四「并发请求须等第一个响应开始」

13

DeepSeek 官方文档 · 上下文硬盘缓存

https://api-docs.deepseek.com/zh-cn/guides/kv_cache

一手类型:官方产品文档用于:第 5 节原理三「硬盘缓存、几个小时到几天清空、尽力而为」;原理四「前缀须已落盘」

14

DeepSeek 官方文档 · 模型与价格

https://api-docs.deepseek.com/zh-cn/quick_start/pricing

一手类型:官方价格页用于:第 5 节价格表:命中 0.02 / 0.15 元,未命中 1 / 4.5 元(每百万 token)

15

阿里云百炼官方文档 · 上下文缓存

https://help.aliyun.com/zh/model-studio/context-cache

一手类型:官方产品文档用于:第 5 节价格表显式 10% / 隐式 20%;创建 125%;显式与隐式对比

16

Google 官方文档 · Gemini 上下文缓存

https://ai.google.dev/gemini-api/docs/caching

一手类型:官方产品文档用于:第 5 节:隐式缓存默认开启;Gemini 3 系列最小 4,096 token

17

Google 官方文档 · Gemini API 定价

https://ai.google.dev/gemini-api/docs/pricing

一手类型:官方价格页用于:第 5 节原理三:显式缓存存储费「每百万 token 每小时 0.5 美元」

边界与反例用来划定这个判断在什么条件下不成立

18

BentoML · 静态、动态与连续批处理

https://bentoml.com/llm/inference-optimization/static-dynamic-continuous-batching

二手类型:技术文档用于:第 7 节「静态批处理并不总是错的」——本文的反例检索结果

档位与定价(横向查证)只支撑第 7 节末尾一句话,但为完整性列出

19

Azure 官方文档 · 优先级处理

https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/priority-processing

一手类型:官方产品文档用于:档位结构横向比对

20

Azure 官方文档 · 预配吞吐量 PTU

https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/provisioned-throughput

一手类型:官方产品文档用于:买断容量与溢出兜底机制

21

Azure 官方文档 · 溢出流量管理

https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/spillover-traffic-management

一手类型:官方产品文档用于:溢出机制

22

Google Cloud 官方文档 · 吞吐量配额

https://docs.cloud.google.com/vertex-ai/generative-ai/docs/resources/throughput-quota

一手类型:官方产品文档用于:档位结构横向比对

23

阿里云百炼官方文档 · 动态限流

https://help.aliyun.com/zh/model-studio/quota-management

一手类型:官方产品文档用于:额度语义的横向比对

24

火山方舟官方文档 · 在线推理(TPM 保障包)

https://www.volcengine.com/docs/82379/1510762

一手类型:官方产品文档用于:买断容量与降级计费

25

百度千帆官方文档 · 自定义接入点

https://cloud.baidu.com/doc/qianfan/s/2mk4z2xpj

一手类型:官方产品文档用于:客户内部的资源切分

取材方式与三条自我约束

  • 直接抓取原文,不用搜索摘要。核查过程中曾三次发现搜索结果的摘要会在改写中悄悄改变技术含义——例如同一句引文的关键词在两次检索中分别呈现为「多个请求」与「多个资源」,而这两者在调度语境下含义完全不同。第 5 节 OpenAI 的折扣与最小长度曾先见于搜索摘要,已回官方原文逐条核实。
  • 不伪造精确数字。第 4.4 节的共置实验台使用相对指数而非具体毫秒数,因为官方只公布了方向性关系与一条推荐阈值,没有公布实测曲线。宁可给定性标签,也不编造看起来专业的数值;第 5 节并发动画的泳道长度同样只是示意。
  • 推断与事实分开标注。第 4.3 节「模型权重位置导致容量利用率低」、第 5 节「DeepSeek 硬盘缓存使命中更便宜」这两处因果连接是本研究的推断,没有公开证据直接支持,已在正文中用虚线框标明;第 5 节的两处费用(2.15 份、2.70 份)是按 Anthropic 官方倍率自算,只计开头那段。