批处理与延迟的权衡是LLM服务调优的核心难题,更大的批处理提升吞吐但增加单请求延迟。文章建立批处理大小与延迟的数学关系模型、P99延迟约束下的最优批处理策略以及动态批处理调参实践及监控指标与告警配置方案。文章同时讨论了方案在不同云厂商环境中的兼容性差异及迁移注意事项,降低了多云部署的技术风险。

学习提示

需要学习批处理与延迟权衡,批处理与延迟的权衡是LLM服务调优的核心难题,更大的批处理提升吞吐但增加单请求延迟。在AI负载测试与容量规划 > LLM服务容量规划的学习路径中,批处理与延迟权衡直接影响对深层原理的理解。

目录
  1. 可视化演示
  2. AI 应用场景
  3. Python 演示
  4. 常见误区
  5. 面试题

可视化演示

状态—

批处理与延迟的权衡是LLM服务调优的核心难题,更大的批处理提升吞吐但增加单请求延迟。文章建立批处理大小与延迟的数学关系模型、P99延迟约束下的最优批处理策略以及动态批处理调参实践及监控指标与告警配置方案。文章同时讨论了方...

核心矛盾:吞吐与延迟的拉锯

深夜食堂的店长发现,一锅只炒一份菜虽然快,但燃气大半时间空烧。他尝试把四份订单一起下锅,灶台利用率高了不少,可第一份菜要在锅边等另外三份凑齐。批处理越大,"每锅产出"越高,"第一口菜的等待"也越长。LLM 服务就是这个后厨:每来一个用户请求,就像一张订单,而 batch size 就是这口锅的容量。

把"一锅出多少份菜"翻译成系统指标:吞吐量是每秒完成多少个请求,延迟是一个请求从进入队列到返回结果的时间。两者不是独立的:batch size 变大时,单次推理同时照顾更多请求,但每一轮计算都要照顾到最慢的那份菜,所以平均延迟和尾延迟都会变长。这就是权衡的本质:你想让锅更满,就要接受更长的排队和更长的一轮。

在容量模型里,可以把一次批处理的时间拆成两部分:固定开销 \( t_{\mathrm{fixed}} \) 和随请求数增长的开销 \( r\cdot B \)。于是单个实例的吞吐量就是每锅菜数除以每锅总时间:

通俗说明:每多一锅的固定开销被摊薄,但每多一份请求也会增加总时间,所以吞吐不是无限增长。

Q(B)=Btfixed+r⋅B\displaystyle Q(B)=\frac{B}{t_{\mathrm{fixed}}+r\cdot B}
  1. 分子 B这一批同时服务的请求数,相当于一锅炒的菜份数。
    B\displaystyle B
  2. 固定开销启动一次推理的准备工作,与批大小无关。
    tfixed\displaystyle t_{\mathrm{fixed}}
  3. 边际开销每多一个请求给这一轮计算增加的耗时。
    r⋅B\displaystyle r\cdot B
  4. 整体含义批越大分母增长越慢,吞吐逼近上限 \( 1/r \)。 后厨不会无限加大锅的容量,因为锅太大,火候难控,第一份菜出锅时已经凉了。对应到 LLM 服务,"凉了"就是 P99 延迟超过产品承诺。因此,批处理不是越大越好,而是要在吞吐和延迟之间找到那个"客人能接受的最满的锅"。
    Q(B)→1r\displaystyle Q(B)\to \frac{1}{r}

批处理机制:从等满锅到流水线

旧后厨的习惯是等灶台上的锅位全部坐满才开火,这叫静态批处理。客流稀的时候,第一张订单要干等到天黑。后来改成"到点就开炒":设一个最长等待窗口,窗口一到,哪怕只有两份菜也先下锅。再后来升级成流水线厨房:一份菜出锅后,空出的锅位立刻补进新订单,不用等整锅一起收工。

对应到 LLM 推理引擎,动态批处理就是"到点就开炒",连续批处理相当于"出锅即补位"。动态批处理需要两个参数:目标批大小 \( B \) 和最大等待窗口 \( W \);连续批处理则让 decode 阶段中已完成序列的槽位即时释放,新请求可以直接加入下一轮迭代。两者都能缓解静态批处理在流量波动时的空等与饥饿。

用排队模型看,一个请求在批处理开始前的等待时间,取决于还要凑多少个请求,以及请求到达速率 \( \lambda \)。如果窗口上限是 \( W_{\max} \),那么实际等待时间可以写成:

通俗说明:这一批开始前要让客人等多久,取决于"最多等多久"和"客人来得快不快"两者取小。

Wbatch=min⁡(Wmax⁡,B−1λ)\displaystyle W_{\mathrm{batch}}=\min\left(W_{\max},\frac{B-1}{\lambda}\right)
  1. 凑单数量除了第一个请求外,还需要再凑 \( B-1 \) 个请求。
    B−1\displaystyle B-1
  2. 到达速率\( \lambda \) 是单位时间到达的请求数,来得越快,凑得越快。
    B−1λ\displaystyle \frac{B-1}{\lambda}
  3. 等待上限\( W_{\max} \) 是服务端设置的最大等待窗口,防止低峰期请求无限等待。
    Wmax⁡\displaystyle W_{\max}
  4. 取小值窗口一到就开火,无论凑没凑满。 动态窗口像给厨房装了一个定时器:既不会为了让锅满而让客人无限等,也不会为了赶时间而让火候白白浪费。连续批处理则像是让厨师在炒菜间隙不断补充新食材,整个厨房永远处于"有活干"的状态。
    min⁡(Wmax⁡,B−1λ)\displaystyle \min\left(W_{\max},\frac{B-1}{\lambda}\right)

数学建模:P99约束下的最优批大小

现在后厨立了规矩:99% 的订单必须在 20 分钟内出餐,否则平台要赔钱。店长要反推:锅最多能多大?这不再是感觉问题,而是一个可以写进容量规划书的数学题。

LLM 服务的 P99 延迟可以近似看成两段:排队等待批处理开始的时间(受窗口 \( W \) 限制)和批处理执行时间(固定开销加边际开销)。SLO(服务等级目标)就是产品承诺的 P99 时间上限,比如 \( L_{\mathrm{SLO}}=2.0 \) 秒。一旦有了这个关系式,就能在给定 SLO 的前提下解出最优批大小。

通俗说明:在满足"99% 请求延迟不超时"的前提下,挑最大的批大小,让吞吐尽量高。

B∗=max⁡{B  |  W+tfixed+r⋅B≤LSLO}\displaystyle B^{*}=\max\left\{B \;\middle|\; W + t_{\mathrm{fixed}} + r\cdot B \le L_{\mathrm{SLO}}\right\}
  1. 等待窗口\( W \) 是请求在队列里等待批处理开始的时间上限。
    W\displaystyle W
  2. 执行耗时\( t_{\mathrm{fixed}}+rB \) 是这一批请求真正计算的时间。
    tfixed+r⋅B\displaystyle t_{\mathrm{fixed}}+r\cdot B
  3. SLO 目标\( L_{\mathrm{SLO}} \) 是产品承诺的 P99 延迟上限。
    LSLO\displaystyle L_{\mathrm{SLO}}
  4. 求最大值在约束范围内选最大的 \( B \),即"保延迟、争吞吐"。 这就像店长用公式算出"最多一锅炒 15 份",超过 15 份,第一份菜就会超出 20 分钟承诺。实际工程中,\( t_{\mathrm{fixed}} \) 和 \( r \) 不是纸上的常数,而是通过压测测量出来的;\( B^{*} \) 就是容量规划的锚点。
    max⁡{B}\displaystyle \max\{B\}

动态调参:给厨房装调节阀

顾客流量会波动,店长不能把锅的大小焊死。他给厨房加了一个调节阀:如果出餐时间余量很充足,就试着把锅加大一档;如果快要超时,就立刻减小锅位。这个调节动作不是乱来的,而是根据当前 P99 与 SLO 的差距决定。

生产环境里的动态调参,通常控制三类旋钮:最大批大小 \( B \)、等待窗口 \( W \)、并发上限和限流阈值。它们互相牵制:窗口越长,凑到的批越大,但延迟预算被吃掉;并发越高,GPU 越忙,但排队越严重。因此调参要小步快跑,单次只动一个变量,观察 P99 和吞吐曲线。

一个简单的反馈式调参规则可以写成:

通俗说明:延迟余量充足就加码,贴着目标就稳住,超了就果断减锅。

Bt+1={Bt+1,Lcur<0.8LSLOBt,0.8LSLO≤Lcur≤LSLOmax⁡(Bt−2,  1),Lcur>LSLO\displaystyle B_{t+1}= \begin{cases} B_t+1, & L_{\mathrm{cur}}<0.8L_{\mathrm{SLO}}\\ B_t, & 0.8L_{\mathrm{SLO}}\le L_{\mathrm{cur}}\le L_{\mathrm{SLO}}\\ \max(B_t-2,\;1), & L_{\mathrm{cur}}>L_{\mathrm{SLO}} \end{cases}
  1. 余量充足当 P99 低于目标的 8 折,可以调大 \( B \) 提升吞吐。
    Lcur<0.8LSLO\displaystyle L_{\mathrm{cur}}<0.8L_{\mathrm{SLO}}
  2. 安全区间在目标附近保持当前批大小,避免参数抖动。
    0.8LSLO≤Lcur≤LSLO\displaystyle 0.8L_{\mathrm{SLO}}\le L_{\mathrm{cur}}\le L_{\mathrm{SLO}}
  3. 超时惩罚超过目标就快速减小批大小,用 \( \max(\cdot,1) \) 保证 \( B \) 不为 0。
    max⁡(Bt−2,  1)\displaystyle \max(B_t-2,\;1)
  4. 迭代更新下一轮参数来自上一轮参数和当前延迟反馈。 这个规则类似厨房里的"看温度调火":有余量就加码,贴线就稳住,超时立刻收手。上线前还要做实验调参,把新参数先放在小流量上观察,确认 P99 没有恶化和吞吐确实提升,再逐步扩大到全量。
    Bt+1\displaystyle B_{t+1}

监控告警:厨房仪表盘

后厨的控制室墙上有一块仪表盘:当前排队单数、灶台饱和度、最近 5 分钟出餐时间分布,以及红色闪烁的 P99 超时告警灯。没有这块表,店长根本不知道什么时候该调锅。

LLM 服务监控的核心指标有:吞吐量(req/s)、P99 延迟、排队请求数、批处理平均饱和度(实际批大小/最大批大小,反映批处理有没有被用满),以及请求成功率。告警规则通常针对 P99 连续 N 个窗口超过阈值,而不是看某个瞬时尖刺。

要理解 P99,不能只看平均延迟,而要看延迟的累积分布函数。P99 的定义是:

通俗说明:把所有请求延迟从小到大排,第 99 百分位那个值就是 P99;它不是平均延迟的 99%。

P99=inf⁡{x:F(x)≥0.99}\displaystyle P99=\inf\{x:F(x)\ge 0.99\}
  1. 累积分布\( F(x) \) 表示延迟小于等于 \( x \) 的请求占比。
    F(x)=P(latency≤x)\displaystyle F(x)=P(\text{latency}\le x)
  2. 分位点0.99 表示我们关心 99% 的请求都没超过的延迟阈值。
    0.99\displaystyle 0.99
  3. 下确界\( \inf \) 取最小的满足条件的 \( x \),即恰好 99% 请求都不超过。
    inf⁡{x}\displaystyle \inf\{x\}
  4. 告警条件当实时 P99 连续多个窗口超过 SLO,就触发告警。 仪表盘的意义在于把"厨房是否还能扛住"变成数字。当 P99 接近告警线,说明锅位已经逼近上限;当批处理饱和度长期偏低,说明锅太大或窗口太短,资源在空烧。容量水位就是在这两者之间寻找平衡。
    P99>LSLO\displaystyle \mathrm{P99}>L_{\mathrm{SLO}}

兼容迁移:换锅不换谱

后厨要开分店,老板发现分店的灶台是另一个品牌:同样一锅能放多少份菜、火力和受热均匀度都不一样。原来在总店的菜谱不能照搬,必须先在分店试菜。

云厂商迁移也一样。即使模型权重相同,不同厂商的推理引擎对最大批大小、动态/连续批处理支持程度、kernel 对 batch 形状的限制、GPU 显存大小都可能不同。直接把原环境的 batch_size 和等待窗口拷过去,轻则性能下降,重则 OOM 或启动失败。

迁移后的实际吞吐可以建模为:有效批大小是新引擎上限与配置的较小值,固定开销和边际开销要重新压测得到:

通俗说明:新锅的锅位上限和每份菜的耗时都要重新测量,迁移后必须重新标定。

Qnew=min⁡(Bconfig,  Bmax⁡engine)tfixednew+rnew⋅min⁡(Bconfig,  Bmax⁡engine)\displaystyle Q_{\mathrm{new}}=\frac{\min(B_{\mathrm{config}},\;B_{\max}^{\mathrm{engine}})} {t_{\mathrm{fixed}}^{\mathrm{new}}+r^{\mathrm{new}}\cdot \min(B_{\mathrm{config}},\;B_{\max}^{\mathrm{engine}})}
  1. 原配置\( B_{\mathrm{config}} \) 是在原环境调好的批大小。
    Bconfig\displaystyle B_{\mathrm{config}}
  2. 引擎上限\( B_{\max}^{\mathrm{engine}} \) 是新环境引擎支持的最大批大小。
    Bmax⁡engine\displaystyle B_{\max}^{\mathrm{engine}}
  3. 取较小值防止超过显存或触发不支持的 kernel。
    min⁡(Bconfig,Bmax⁡engine)\displaystyle \min(B_{\mathrm{config}},B_{\max}^{\mathrm{engine}})
  4. 重新标定\( t_{\mathrm{fixed}}^{\mathrm{new}} \) 和 \( r^{\mathrm{new}} \) 必须在新环境压测得到。 迁移前要做评估清单:最大批大小上限、是否支持连续批处理、显存余量、kernel 兼容性。同时准备降级方案——如果新引擎不支持某些特性,就退回更保守的批大小或关闭连续批处理,确保 P99 不破线。
    tfixednew,  rnew\displaystyle t_{\mathrm{fixed}}^{\mathrm{new}},\;r^{\mathrm{new}}

工程落地:从压测到成本优化

最后是正式开业前的试菜和算账。店长要预估未来一小时来多少客人,单口锅一小时最多出多少份菜,从而决定开几个灶台、备多少料,以及每份菜的成本。

工程上这叫容量测试和压测:用预估值 \( \lambda \) 作为到达率压测,测出单实例在最优批大小下的吞吐 \( Q(B) \),再算出需要多少实例。成本上,不能只看 GPU 单价,而要按"每个成功请求的成本"来比较不同批大小配置。

通俗说明:算出要开几个"灶台",再算每个请求分摊的灶台租金。

Ninst=⌈λQ(B)⌉,Cper=Ninst⋅Cinst3600 λ\displaystyle N_{\mathrm{inst}}=\left\lceil\frac{\lambda}{Q(B)}\right\rceil,\qquad C_{\mathrm{per}}=\frac{N_{\mathrm{inst}}\cdot C_{\mathrm{inst}}}{3600\,\lambda}
  1. 到达率\( \lambda \) 是预期每秒请求到达率,来自业务预测。
    λ\displaystyle \lambda
  2. 单实例吞吐\( Q(B) \) 是批大小为 \( B \) 时单个实例的吞吐。
    Q(B)\displaystyle Q(B)
  3. 向上取整实例数必须是整数,不够就补一台。
    ⌈λQ(B)⌉\displaystyle \left\lceil\frac{\lambda}{Q(B)}\right\rceil
  4. 单请求成本每小时总成本除以每小时总请求数。 算完这笔账,批处理与延迟的权衡才真正落地:一面是 P99 承诺,一面是每张请求的账单。上线后还要定期回归验收——重跑压测,确认新版本、新流量、新硬件没有悄悄改变 \( t_{\mathrm{fixed}} \) 和 \( r \),让这张容量规划书保持可信。
    Ninst⋅Cinst3600 λ\displaystyle \frac{N_{\mathrm{inst}}\cdot C_{\mathrm{inst}}}{3600\,\lambda}

AI 应用场景

企业客服机器人上线容量评估

阶段:容量规划与 SLO 设计

解决的问题:传统方式靠经验随便设 batch size,要么吞吐差造成 GPU 浪费,要么 P99 超时导致客服体验崩。回到后厨场景,就是"不知道一锅到底能炒几份菜"。利用 P99 约束模型,先压测标定固定开销和边际耗时,再算出最优批大小和实例数。

具体案例:某银行 RAG 客服机器人,答案生成 SLO 为 P99 < 3 秒。压测显示等待窗口 0.4s、固定开销 0.5s、边际耗时 0.12s/请求,算出最大 batch 约为 17;用 4 台 A10 实例支撑 200 QPS,P99 稳定在 2.8s,季度成本比原先降低三成。

相关角色:ML Infra Engineer / 容量规划工程师

大促流量突增下的动态调参

阶段:在线调优与限流

解决的问题:流量忽高忽低,固定 batch size 高峰期超时、低峰期浪费。这就像后厨在饭点时忙不过来、闲时空烧火。用动态批处理窗口加 P99 反馈的自动调参,让系统在 SLO 内尽量保持高吞吐。

具体案例:电商大促期间,搜索摘要服务 QPS 从 800 冲到 3000。监控发现 P99 突破 1.5s,自动把批大小从 32 降到 24、窗口从 0.3s 缩到 0.2s,并触发限流队列,P99 回到 1.2s,成功保住大促体验。

相关角色:SRE / AI 平台工程师

多云迁移的容量重评估

阶段:迁移评估与降级验证

解决的问题:不同云厂商最大批大小和 kernel 优化不同,原配置照搬会导致 OOM 或 P99 恶化。这就像换了一口不同品牌的新锅,必须重新试菜。

具体案例:某团队从 AWS Inferentia 迁到阿里云 GPU,原 batch=48 在目标引擎最大只支持 32。团队先用有效批大小公式估算,再压测得到新的边际耗时,最终将 batch 定为 28,增加一个实例,P99 从迁移前的 1.9s 降到 1.5s,预算增加 15% 但避免了超时赔付。

相关角色:云架构师 / 平台工程师

Python 演示

python59 行
import random SLO_P99 = 1.8N_REQ = 1000ARRIVE_INTERVAL = 0.05PROCESS_FIXED = 0.4PER_REQ_TIME = 0.02  def simulate(batch_size, seed=42):    random.seed(seed)    arrivals = []    t = 0.0    for _ in range(N_REQ):        t += random.expovariate(1.0 / ARRIVE_INTERVAL)        arrivals.append(t)     process_time = PROCESS_FIXED + batch_size * PER_REQ_TIME    latencies = []    last_finish = 0.0    for start in range(0, N_REQ, batch_size):        stop = min(start + batch_size, N_REQ)        batch_start = arrivals[stop - 1]        finish = batch_start + process_time        last_finish = finish        for i in range(start, stop):            latencies.append(finish - arrivals[i])     latencies.sort()    p99 = latencies[int(len(latencies) * 0.99) - 1]    throughput = N_REQ / last_finish    return throughput, p99  def find_optimal_batch_size():    best = 1    for b in range(1, 33):        throughput, p99 = simulate(b)        if p99 <= SLO_P99:            best = b        else:            break    return best  def main():    print("batch_size throughput p99")    for b in range(1, 13):        t, p = simulate(b)        print("%d %.2f %.3f" % (b, t, p))    opt = find_optimal_batch_size()    print("optimal batch size:", opt)    t, p = simulate(opt)    print("optimal throughput: %.2f req/s" % t)    print("optimal p99: %.3f s" % p)  if name == "main":    main()

常见误区

误区批处理越大,GPU 越省,吞吐一定会一直涨,所以直接把 batch size 拉到显存上限。

正解批大小增大时吞吐先升后趋于饱和,延迟却近似线性上升。一旦 P99 超过 SLO,超时请求会拖垮体验,实际成功吞吐反而下降。就像锅无限大,菜全部糊在锅里,出餐率反而低。正确做法是在 P99 约束下选最大批大小,而不是选最大锅。

为何常见:看 benchmark 时通常只盯着平均吞吐,忽略了尾延迟和排队等待窗口。

误区平均延迟 1 秒,说明系统很健康,P99 只是统计人员用来吓人的。

正解LLM 服务和外卖一样,用户感受到的是最差体验。平均延迟达标但 P99 超时,意味着有 1% 的请求会长时间卡住甚至超时,引发重试和流量放大。P99 度量的是"99% 的请求都没超过这个值",容量规划必须按它来。

为何常见:平均延迟好算又直观,分位数需要采集大量样本,很多人图省事。

误区动态批处理会自动凑批和等待,所以 batch size 和窗口随便设,系统会自己找到最优。

正解动态批处理只是把"必须等满 B 个"变成"窗口和 B 两个约束谁先到谁生效"。窗口太长会抬高延迟,太短会降低批吞吐;仍有 P99 超时或吞吐浪费风险。它是一根调节阀,不是自动厨师。

为何常见:"动态"和"自动"字眼容易让人以为无需人工调参。

误区P99 大约等于平均延迟的 1.5 倍,不用单独统计分位数。

正解延迟分布可能严重右偏,平均值的固定倍数不等于 P99。正确做法是记录每次请求延迟,构建累积分布函数,再用分位数定义计算。不同负载下分布形状会变,经验系数并不可靠。

为何常见:想省事用一个经验系数,但流量、batch、排队都会改变延迟分布的形状。

误区模型权重一样,推理结果一样,batch size 和窗口配置也可以原样拷过去。

正解不同 GPU 型号和推理引擎对最大批大小、连续批处理支持、kernel 性能差异很大。必须在新环境重新压测标定固定开销和边际耗时,并准备降级方案。锅换了,菜谱就要重新试火。

为何常见:只看到模型权重相同,忽略了底层硬件和 runtime 的巨大差异。

面试题

Q1. 批处理大小增大时,LLM 服务最典型的直接影响是?

单选题 · easy

  • A.吞吐上升,延迟上升← 正确答案
  • B.吞吐上升,延迟下降
  • C.吞吐下降,延迟下降
  • D.吞吐不变,延迟上升

答案:A。批处理越大,单轮同时服务更多请求,吞吐上升;但凑批和单轮计算时间变长,延迟也上升。就像锅越大产出越多,但第一份菜等得越久。

Q2. P99 延迟等于 1.8 秒,含义是?

单选题 · easy

  • A.99% 请求延迟不超过 1.8 秒← 正确答案
  • B.平均延迟为 1.8 秒
  • C.99% 请求延迟超过 1.8 秒
  • D.1% 请求延迟刚好是 1.8 秒

答案:A。P99 是第 99 百分位,表示 99% 的请求延迟小于等于该值。它是尾延迟指标,不是平均延迟,也不是 1% 的固定值。

Q3. 动态批处理设置最大等待窗口的主要意义是?

单选题 · easy

  • A.防止低峰期请求无限等待← 正确答案
  • B.让吞吐永远达到最大
  • C.消除所有排队延迟
  • D.替代 P99 延迟监控

答案:A。最大等待窗口相当于"到点就开炒",能避免请求因凑不满批而饿死。它不会消除排队,也不会自动让吞吐最大,更不能替代监控。

Q4. 容量规划时,下列哪些指标应纳入监控告警?

多选题 · mid

  • A.P99 延迟分位数← 正确答案
  • B.每秒请求吞吐量← 正确答案
  • C.批处理平均饱和度← 正确答案
  • D.模型参数量大小

答案:ABC。监控要覆盖延迟、吞吐和资源使用效率。模型参数量是静态属性,不反映运行时容量水位,不需要进入在线监控告警。

Q5. P99 延迟超时,优先应?

单选题 · mid

  • A.缩短等待窗口或减小批大小← 正确答案
  • B.增大批大小并延长等待窗口
  • C.关闭监控以降低开销
  • D.只增加显存不管延迟

答案:A。P99 延迟由等待窗口和执行时间组成,缩短窗口或减小批大小都能减少请求等待和单轮耗时。加大批处理和延长窗口只会让延迟更高。

Q6. 连续批处理与静态批处理的最大区别是?

单选题 · mid

  • A.请求完成一个就补一个新请求← 正确答案
  • B.必须等整批完成后才开新批
  • C.不等待请求直接处理空批
  • D.只在低峰期启用批处理

答案:A。连续批处理在序列完成时立刻释放槽位并补入新请求,不让 GPU 空等整个批结束。静态批处理则必须等整批全部完成才能开始下一批。

Q7. 当 P99 低于 SLO 的 80% 时,自动调参策略通常会?

单选题 · mid

  • A.适当增大批大小提升吞吐
  • B.立刻将批大小减半← 正确答案
  • C.停止接受新请求
  • D.关闭动态批处理
  • E.保持完全不变
  • F.迅速上升
  • G.缓慢下降
  • H.只受批大小影响

答案:B。排队论中,利用率接近 1 时队列长度会急剧增长,尾延迟迅速恶化。这就像后厨满负荷运转时,新订单等待时间会突然暴涨,而不是平稳变化。

Q8. 定位 P99 延迟突增,应优先检查哪些环节?

多选题 · mid

  • A.动态批处理等待窗口← 正确答案
  • B.当前批大小配置← 正确答案
  • C.排队请求数量← 正确答案
  • D.训练数据清洗方式

答案:ABC。等待窗口、批大小和排队长度都会直接影响在线延迟。训练数据清洗影响的是模型质量,不会让已上线服务的 P99 突然突增。

Q9. 将服务从云厂商 A 迁移到云厂商 B,以下哪些做法正确?

多选题 · hard

  • A.在新环境重新压测标定参数← 正确答案
  • B.保留原批大小配置直接上线
  • C.比较两边的最大批大小上限← 正确答案
  • D.保留一套降级批处理方案← 正确答案

答案:ACD。迁移后硬件和引擎都可能不同,必须重新压测并比较引擎限制,同时准备降级方案。直接保留原配置最危险,可能 OOM 或 P99 恶化。