想象你是一家“智慧餐厅”的老板,后厨有一位三头六臂的超级主厨——GPU。顾客像潮水一样涌来下订单(推理请求),有的菜需要在大火上长时间烹制(计算密集型),有的菜则依赖飞快地从冰柜搬食材(访存密集型)。主厨很聪明,会把同款订单合并成一大锅同时炒(动态批处理),这样单位时间出餐量成倍提升,但也让先到的客人多等了一会儿(延迟上升)。你想知道餐厅高峰时段最多能接多少单、该不该再请一位主厨(容量规划),就必须做一场“厨房压力演练”(性能压测)。这篇文章就从负载特征、批处理规律、波动模式、延迟吞吐权衡、压测设计和容量规划六个角度,带你完整看懂GPU推理负载的“脾气”。

岗位关联

掌握本节内容,你将具备为GPU推理集群做负载特征建模、设计压测方案、规划容量与弹性策略的实战能力,是AI基础设施工程师和SRE的必修课。

目录
  1. 可视化演示
  2. 两类负载类型
  3. 动态批处理规律
  4. 并发波动模式
  5. 延迟吞吐权衡
  6. 压测方案设计
  7. 容量规划评估
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示分布式一致性协议中Leader选举、日志复制与心跳通信的完整流程,支持节点故障模拟与消息速率调节。

本节配有交互动效(进入视口后自动加载,约 3KB)。

正常运行模式 Leader节点向所有Follower发送心跳和日志条目 Follower确认后Leader提交日志并通知全部节点 commit \u2192 apply \u2192 response 多数派确认后日志条目方可提交

两类负载类型

主厨做菜有两种累法:一种是一刻不停颠勺爆炒,锅气冲天,那种累是“算得累”;另一种是反复从冷库搬货、切配装盘,腿都快跑断了,那种累是“搬得累”。GPU跑推理也一样——有的模型每一步都要在巨大的参数矩阵上做乘法累加,计算量爆炸;有的模型每次推理只算一点点,但需要不停读取特征表和参数表,带宽消耗远大于算力消耗。

在性能工程里,我们用“算术强度”(Arithmetic Intensity)给负载分类,它的定义是单位字节访存能兑换多少次浮点运算:

I=NflopsBbytes\displaystyle I = \frac{N_{\text{flops}}}{B_{\text{bytes}}}

其中 $N_{\text{flops}}$ 是完成一次推理所需的浮点运算次数,$B_{\text{bytes}}$ 是推理过程中需要读写的总字节数。当 $I$ 大于 10 FLOP/Byte 时,负载通常是计算密集型的,比如大语言模型(LLM)的 Prefill 阶段;当 $I$ 小于 1 FLOP/Byte 时,负载是访存密集型的,典型代表是推荐系统的 Embedding 检索和序列排序模型。

1. 分子 FLOPs:处理一个请求要做多少次浮点乘加,数值越大说明“算得越狠”

Nflops\displaystyle N_{\text{flops}}

2. 分母访存字节:模型参数、中间激活值、特征表要读写多少数据,数值越大说明“搬得越勤”

Bbytes\displaystyle B_{\text{bytes}}

3. 比值判型:每读 1 字节数据能换回多少次运算,比值越高越偏计算密集

I=NflopsBbytes\displaystyle I = \frac{N_{\text{flops}}}{B_{\text{bytes}}}

搞清负载类型,就等于摸清了主厨的“体力短板”:计算密集的模型瓶颈在 GPU 算力(CUDA Core 数量、频率),访存密集的模型瓶颈在显存带宽和缓存命中率。后续压测和容量规划都要围绕这个短板来设计。

动态批处理规律

高峰时段,聪明的厨师不会一单一单地炒菜,而是把三桌客人点的同一道宫保鸡丁合并成一锅下锅。GPU 推理的动态批处理(Dynamic Batching)就是这个思路:调度器把到达的请求先放进队列,攒够一批再一次性喂给 GPU 核心执行,用“一锅炒”摊薄启动开销和调度成本。

动态批处理的执行时间可以用一个线性模型描述:

Tbatch=α+β⋅n\displaystyle T_{\text{batch}} = \alpha + \beta \cdot n

其中 $\alpha$ 是启动内核、搬运权重的固定开销,$\beta$ 是每个样本的边际计算耗时,$n$ 是批大小。单批的吞吐量就是 $n / T_{\text{batch}}$。当 $n$ 增大时,平均到每个样本上的固定开销被摊薄,吞吐量随之上升——但代价是请求必须先等在队列里,等待窗口越长,单请求延迟越差。

1. 固定开销 α:不管一批处理 1 个还是 32 个请求,启动内核和加载数据的时间基本不变,这是“起锅烧油”的成本

α\displaystyle \alpha

2. 边际开销 βn:每多塞进一个样本,GPU 多花一段线性增长的计算时间,这是“多炒一份菜”的成本

β⋅n\displaystyle \beta \cdot n

3. 单批吞吐:批大小除以单批总耗时,批越大吞吐越高,但受 $\alpha$ 限制有天花板

nα+β⋅n\displaystyle \frac{n}{\alpha + \beta \cdot n}

实际生产中有两种触发聚合的策略:一是队列长度达到预设批大小立即打包,二是超过最大等待窗口强制打包。前者保吞吐,后者保延迟。好的批处理调度器会把这两个阈值和业务 SLO 联动起来,让“合单”既高效又不让客人饿跑。

并发波动模式

餐厅一天有早市、午市、晚市三个高峰,尤其是午市瞬间涌进 50 桌客人。GPU 推理集群面对的流量同样不是一条平坦的直线,而是“锯齿 + 脉冲”的复杂波形。比如电商 App 晚上 8 点秒杀大促,搜索推荐请求在几秒内飙到平时的 5 倍。

实际负载建模中,到达率可以根据时间段分解为基线和突发两部分:

λ(t)=λbase+A⋅e−(t−t0)22σ2\displaystyle \lambda(t) = \lambda_{\text{base}} + A \cdot e^{-\frac{(t - t_0)^2}{2\sigma^2}}

其中 $\lambda_{\text{base}}$ 是日常平均到达率,$A$ 是突发事件的峰值增幅,$t_0$ 是爆发时刻,$\sigma$ 控制尖峰的陡峭程度。除了突发高峰,推理负载还有“长尾”特性:少数超长 Prompt、反复重试的请求,会像一桌点了 20 道菜又有忌口的客人,把整批请求的耗时拖得异常长。

1. 基线速率:非高峰时段的平均请求到达率,对应餐厅平峰期的客流量

λbase\displaystyle \lambda_{\text{base}}

2. 突发脉冲项:高峰事件在 $t_0$ 时刻把流量顶上去,振幅 $A$ 越大峰值越猛

A⋅e−(t−t0)22σ2\displaystyle A \cdot e^{-\frac{(t - t_0)^2}{2\sigma^2}}

3. 高斯衰减核:离 $t_0$ 越远的时刻,突发影响按指数衰减,$\sigma$ 越小尖峰越陡

e−(t−t0)22σ2\displaystyle e^{-\frac{(t - t_0)^2}{2\sigma^2}}

理解波动模式的意义在于:压测必须用“脉冲 + 锯齿”的负载还原真实业务,容量规划则永远按峰值而非平均值来兜底。你以为餐厅平时能坐满 30 桌就够了,结果周五晚市涌进 80 桌,门口排队的人立刻骂声一片。

延迟吞吐权衡

主厨为了翻台率拼命合单炒大锅菜,结果前厅客人等到掀桌;如果一单一单精细炒,出菜量又远远不够。GPU 推理服务也面临同样的两难:延迟(Latency)和吞吐量(Throughput)是一对此消彼长的指标。延迟衡量单个请求从进来到返回的速度,吞吐量衡量系统每秒钟能消化多少请求。

二者关系可以用排队论里的利特尔定律描述:

L=λ×W\displaystyle L = \lambda \times W

$L$ 是系统中同时在排队的请求数,$\lambda$ 是到达率,$W$ 是请求在系统内的平均停留时间。结合批处理模型,吞吐量上限可以写成:

吞吐量=nα+β⋅n≤1β\displaystyle \text{吞吐量} = \frac{n}{\alpha + \beta \cdot n} \leq \frac{1}{\beta}

当批大小 $n$ 趋近无穷大时,吞吐量逼近极限 $1/\beta$,但每个请求都要等更久才能凑够一批。所以工程上不会无限加大批大小,而是用 SLO(服务水平目标)来划一条线:比如“P99 延迟必须小于 200ms”,在这条线下找最大吞吐量。

1. 利特尔定律:系统内积压的请求数等于到达率乘以每个请求的停留时间,积压越多则等待越久

L=λ×W\displaystyle L = \lambda \times W

2. 吞吐极限:批大小无限增大时,固定开销被完全摊薄,吞吐量收敛到 $1/\beta$,这是硬件物理上限

lim⁡n→∞nα+β⋅n=1β\displaystyle \lim_{n \to \infty} \frac{n}{\alpha + \beta \cdot n} = \frac{1}{\beta}

3. SLO 约束:在延迟红线内取最大吞吐量,而不是无脑追高吞吐

max⁡QPSs.t.P99≤Tslo\displaystyle \max \text{QPS} \quad \text{s.t.} \quad P99 \leq T_{\text{slo}}

上菜快慢和出菜总量不可能两全。聪明的餐厅会设定“承诺 20 分钟内上完所有菜”的目标,然后算出最大翻台率;同样,AI 基础设施团队要盯住 P99 延迟的同时,在压测曲线上找到那个“SLO 约束下的吞吐拐点”。

压测方案设计

开张前,你请了一群朋友按真实的吃饭节奏来“演练”:瞬间涌入 50 人、疯狂加菜、催单、投诉,观察主厨会不会崩溃、出菜口会不会堵死。GPU 推理压测(Load Testing)就是这套思路——用负载生成器模拟真实请求流,在受控条件下观察系统的行为边界。

压测设计核心有四个步骤。首先是负载生成,请求的输入长度、模型种类、并发模式都要从线上流量采样,不能只用固定长度的假请求;其次是阶梯加压,最常见的模式是从 50 QPS 起步,依次加档到 100、200、400,每一档稳定运行 5 到 10 分钟,让队列充分积压;第三是关键指标采集,包括 QPS、成功率、P50/P95/P99 延迟、GPU 利用率、显存占用、温度;最后是瓶颈定位,观察当加压到哪一档时吞吐不再线性上涨、延迟开始指数飙升。

延迟分位数是压测中最核心的指标:

P99=min⁡{x∣F(x)≥0.99}\displaystyle P99 = \min\{x \mid F(x) \geq 0.99\}

其中 $F(x)$ 是延迟的累积分布函数。P99 的含义是“99% 的请求的延迟都小于等于这个值”,它比平均值更能暴露尾部风险。

1. 累积分布函数:延迟不超过 $x$ 的请求占总请求的比例,这是“上菜速度的及格线分布”

F(x)=P(延迟≤x)\displaystyle F(x) = P(\text{延迟} \leq x)

2. P99 反查:从 0.99 这个概率值反推出对应的延迟门槛,1% 的最慢请求统统超过它

P99=min⁡{x∣F(x)≥0.99}\displaystyle P99 = \min\{x \mid F(x) \geq 0.99\}

3. 拐点判据:继续加压但吞吐量不再增长,说明系统已到容量上限,这就是“压测找到了厨房的真正极限”

Δ吞吐ΔQPS→0\displaystyle \frac{\Delta \text{吞吐}}{\Delta \text{QPS}} \to 0

压测的价值不是测出“最大 QPS 数字”,而是找到那条让延迟突然恶化的临界线。有了这条线,你就知道餐厅最多接多少桌客人会崩,以及该在什么水位触发“暂停接单”或“呼叫外援”。

容量规划评估

火锅店要按冬天最冷那天能来多少桌客人来备桌椅,而不是按夏天的平均人流。GPU 容量规划也一样:用压测得到的容量拐点,结合业务峰值预测,算出该买几张卡、给每个业务分多少配额。

核心估算公式是:

NGPU=峰值QPS×Tbatchn×Utarget\displaystyle N_{\text{GPU}} = \frac{\text{峰值QPS} \times T_{\text{batch}}}{n \times U_{\text{target}}}

其中峰值 QPS 来自流量预测和负载建模,$T_{\text{batch}}$ 是压测测得的单批耗时,$n$ 是批大小,$U_{\text{target}}$ 是目标利用率(一般设定为 60%~70%,预留弹性应对突发)。除了一次性容量规划,线上还要做弹性伸缩:当 GPU 利用率超过 70% 并持续若干分钟就扩容,低于 30% 就缩容,把成本与稳定性结合起来。

1. 分子总耗时预算:峰值每秒钟要处理的请求数乘以单批耗时,得出“同时要烧多少锅菜”的总厨房工时

峰值QPS×Tbatch\displaystyle \text{峰值QPS} \times T_{\text{batch}}

2. 分母单批承载:每批能处理 $n$ 个请求,同时留出 $U_{\text{target}}$ 的余量而非打满

n×Utarget\displaystyle n \times U_{\text{target}}

3. 整除求商:两者相除就得到所需 GPU 卡数,向上取整并叠加冗余率

NGPU=峰值QPS×Tbatchn×Utarget\displaystyle N_{\text{GPU}} = \frac{\text{峰值QPS} \times T_{\text{batch}}}{n \times U_{\text{target}}}

容量规划的产出不只是“买几张卡”,还包括资源配额(Quota)和弹性伸缩策略:给每个业务团队按压测结果分配合适的 GPU 份额,并让弹性伸缩与负载水位联动。这样既不会在高峰期崩盘,也不会在低谷期白白烧钱——就像餐厅既备足了晚市的桌位,又能在深夜把部分厨师调去休息。

AI 应用场景

大模型推理服务容量评估

阶段:容量规划与基础设施设计

解决的问题:传统做法是“凭经验估算 GPU 卡数”,要么买多了浪费成本,要么买少了上线即崩。AI 压测通过回放线上真实流量,量化出单卡在特定批大小下的吞吐拐点,让容量决策有了数据支撑。

具体案例:某公司部署 70B 参数大模型推理服务,回放一周线上请求后测得:A100 在 batch=16 时峰值 QPS 为 120,P99 延迟 180ms;又预测到大促峰值 QPS 约 480,于是按公式算出需要 4 张 A100 才能同时满足吞吐与延迟 SLO。

动态批处理参数调优

阶段:推理服务性能优化

解决的问题:动态批处理的等待窗口设多长、批大小上限设多大,直接影响吞吐与尾部延迟的平衡。人工拍脑袋调参经常顾此失彼。

具体案例:团队用录制好的线上请求做压测对比实验:等待窗口分别为 5ms、20ms、50ms 时,P99 延迟从 120ms 涨到 260ms,而吞吐量只从 340 QPS 升到 390 QPS。最终选择 20ms 窗口,在吞吐损失最小的前提下保住了延迟 SLO。

推理集群弹性伸缩策略

阶段:容量调度与弹性伸缩

解决的问题:固定 GPU 副本数在流量低谷时大量闲置,高峰时又不够用。基于压测标定的利用率阈值配置弹性伸缩,让集群自动跟着业务节奏走。

具体案例:某推荐系统推理集群引入 KEDA 弹性策略:以压测得出的 70% GPU 利用率为扩容水位、30% 为缩容水位,高峰自动拉起 12 个副本,夜间自动缩回 4 个,月度 GPU 成本下降约 40%。

Python 演示

python52 行
import random  class DynamicBatchSim:    """模拟GPU动态批处理:请求到达、攒批、执行、统计延迟与吞吐。"""     def __init__(self, batch_size, window_ms, gpu_ms):        self.batch_size = batch_size        self.window_ms = window_ms        self.gpu_ms = gpu_ms        self.queue = []        self.done = 0        self.total_latency = 0.0     def tick(self, now_ms, arrivals):        self.queue.extend(arrivals)        while len(self.queue) >= self.batch_size:            batch = self.queue[:self.batch_size]            del self.queue[:self.batch_size]            finish = now_ms + self.gpu_ms            self.done += len(batch)            self.total_latency += sum(finish - r for r in batch)        if self.queue and now_ms - self.queue[0] >= self.window_ms:            batch = self.queue[:]            self.queue = []            finish = now_ms + self.gpu_ms            self.done += len(batch)            self.total_latency += sum(finish - r for r in batch)     def avg_latency(self):        return self.total_latency / max(self.done, 1)  def simulate(rate, batch_size, window_ms, gpu_ms, duration_s):    sim = DynamicBatchSim(batch_size, window_ms, gpu_ms)    dt = 0.005    t = 0.0    while t < duration_s:        arrivals = []        if random.random() < rate * dt:            arrivals.append(t * 1000.0)        sim.tick(t * 1000.0, arrivals)        t += dt    qps = sim.done / duration_s    return qps, sim.avg_latency()  if __name__ == "__main__":    for bs in [1, 2, 4, 8]:        qps, lat = simulate(rate=80, batch_size=bs, window_ms=20,                            gpu_ms=160, duration_s=20)        print("batch=%2d  QPS=%6.1f  avg_latency=%7.1fms" % (bs, qps, lat))
目的:模拟 GPU 动态批处理在不同批大小下的吞吐量与平均延迟,直观验证“批越大吞吐越高、延迟越差”的权衡关系。
  1. self.queue.extend(arrivals)新到的请求先进入队列等待攒批,就像顾客先在前厅排号。
  2. while len(self.queue) >= self.batch_size:只要队列攒够一批就立即打包,触发“合单烹饪”。
  3. finish = now_ms + self.gpu_ms记录这一批的完成时刻,模拟 GPU 执行一个批次耗时固定。
  4. self.total_latency += sum(finish - r for r in batch)每个请求的延迟从到达时刻一直算到批处理完成,等待时间也被计入。
  5. if self.queue and now_ms - self.queue[0] >= self.window_ms:等待窗口超时后强制把剩余请求打包,防止客人等太久。
  6. qps = sim.done / duration_s压测结束后用总完成数除以总时长得到吞吐量。
  7. for bs in [1, 2, 4, 8]:依次对比不同批大小下的表现,观察吞吐提升与延迟恶化的规律。

常见误区

误区我看到 GPU 利用率 99%,说明我的推理集群高效运转、一点没浪费,就应该保持这个状态。

正解利用率高不代表健康。如果 GPU 一直忙着处理大 batch,请求可能已经排队等了几百毫秒,用户早就超时流失了。容量规划要看“利用率与延迟的联合约束”,只有 P99 达标前提下的高利用率才算有效产能,就像厨房 100% 时间都在炒菜,但客人等到掀桌,这厨房照样要倒闭。

为何常见:日常监控习惯用利用率判断资源是否被浪费,忽略了在线服务的第一指标其实是延迟。

误区监控面板显示平均延迟 20ms,服务肯定很健康,不用管了。

正解平均值会掩盖尾延迟的灾难。高峰期动态批处理可能让 P99 冲到 500ms,而平均延迟因为大量快速请求被“平均”掉了。必须用 P99/P999 分位数和最大延迟来监控,因为 1% 的慢请求往往就是用户投诉和超时重试的来源。

为何常见:平均数是最直观的统计量,但推理延迟是典型的长尾分布,平均掩盖了个体灾难。

误区我用 100 个线程同时打 5 分钟,得到最大 QPS,这不就是系统的容量上限吗?

正解恒定负载无法还原真实业务的突发特性。真实流量是脉冲 + 锯齿波形的,恒定速率测出来的“最大 QPS”会被突发流量瞬间击穿。正确做法是用阶梯加压加脉冲负载,观察系统在流量抖动时的队列积压和延迟变化。

为何常见:压测工具的默认模式就是恒定负载,步骤简单且易于复现,所以被广泛误用。

误区既然batch 越大吞吐越高,那我干脆把等待窗口设成一个很大的值,攒一大锅一起炒。

正解等待窗口越大,请求在队列里的等待时间越长,P99 延迟会线性恶化;同时大 batch 还会推高显存占用,甚至 OOM。工程上应该反过来:先定延迟 SLO,再反推窗口上限。比如承诺 P99≤200ms,就要求请求在队列里等的时间不能超过 50ms。

为何常见:只盯着吞吐量看收益,忽略了被“合单”的单个请求付出了等待代价。

误区线上平均每秒 1000 个请求,一张卡能扛 1000 QPS,那买一张卡就够了。

正解真实流量的峰值通常是平均值的 3~5 倍,而且延迟在负载超过拐点后会非线性恶化。容量规划必须按峰值 QPS 和延迟 SLO 来算,还要预留 30% 以上的冗余,就像餐厅按“最火爆的周五晚市”备桌,而不是按周一的清淡客流。

为何常见:容量规划直觉上觉得“平均值够用就行”,但系统崩溃往往发生在尾部峰值时刻。

面试题

Q1. 算术强度(FLOPs/Byte)较高的 GPU 推理负载属于哪种类型?

单选题 · easy

  • A.访存密集型负载
  • B.网络密集型负载
  • C.计算密集型负载← 正确答案
  • D.静态密集型负载

答案:C。算术强度 = 每请求浮点运算次数 ÷ 访存字节数。比值越高,说明每读 1 字节数据能做越多计算,是典型的计算密集型负载,对应大模型 Prefill 阶段;比值低才是访存密集型。

Q2. 动态批处理给推理服务带来最主要的收益是什么?

单选题 · easy

  • A.降低单个请求延迟
  • B.提升整体吞吐量← 正确答案
  • C.减小模型参数量
  • D.增加显存空闲空间

答案:B。动态批处理把多个请求合并到一批执行,摊薄了内核启动和数据搬运的固定开销,单位时间内处理的请求数显著增加,即吞吐量上升。代价是单请求延迟可能变差,因此 A 错误。

Q3. 动态批处理引入“等待窗口”后,最直接的影响是什么?

单选题 · easy

  • A.模型精度略微下降
  • B.请求尾部延迟上升← 正确答案
  • C.网络带宽自动扩容
  • D.显存被系统回收

答案:B。等待窗口意味着请求必须先在队列里等一段时间,攒够一批才执行。等待时间直接被计入请求延迟,所以最直接的影响是 P99 尾部延迟上升,这是吞吐提升必须付出的代价。

Q4. 某推理服务 P50 延迟正常,但 P99 严重超标,最可能的原因是什么?

单选题 · mid

  • A.批处理导致部分请求等待过久← 正确答案
  • B.网络带宽整体不足
  • C.模型文件频繁被重写
  • D.GPU 空闲时间过多

答案:A。P50 正常但 P99 超标的典型场景是动态批处理:大部分请求刚好凑批立即执行,少部分请求运气差要等满整个等待窗口,尾部延迟被急剧拉长。平均值掩盖了这个长尾问题,必须看分位数。

Q5. 要复现真实业务流的突发高峰效应,压测应该采用哪种负载模式?

单选题 · mid

  • A.恒定 QPS 匀速打满
  • B.脉冲式和锯齿式负载← 正确答案
  • C.单请求循环回放
  • D.逐步降低并发数

答案:B。真实推理流量是“基线 + 突发脉冲”形态,恒定 QPS 无法触发队列积压和延迟突刺。脉冲式负载模拟秒杀、大促等突发场景,锯齿形负载模拟周期性波动,才能暴露真实容量拐点。

Q6. 进行 GPU 推理容量规划时,下列哪些因素必须纳入计算?

多选题 · hard

  • A.业务峰值 QPS← 正确答案
  • B.P99 延迟目标← 正确答案
  • C.批大小与单批耗时← 正确答案
  • D.用户手机型号分布

答案:ABC。容量规划公式为 GPU 数量 = 峰值 QPS × 单批耗时 ÷(批大小 × 目标利用率),峰值 QPS、P99 SLO(决定可用批大小与窗口)、批大小和单批耗时都是直接输入。用户手机型号与 GPU 容量规划无直接关系。

Q7. 利特尔定律 L = λ × W 中,W 代表的物理含义是什么?

单选题 · mid

  • A.网络带宽大小
  • B.请求平均停留时间← 正确答案
  • C.GPU 显存容量
  • D.批处理窗口长度

答案:B。利特尔定律描述排队系统稳态关系,L 是系统内平均请求数,λ 是到达率,W 是请求从进入系统到离开的平均停留时间。它说明到达率越高、停留时间越长,系统内积压的请求就越多。

Q8. 关于 P99 分位数延迟,下列哪些说法是正确的?

多选题 · easy

  • A.99% 的请求延迟低于该值← 正确答案
  • B.1% 的请求可能超过该值← 正确答案
  • C.P99 数值必然小于 P50
  • D.P99 能捕捉尾延迟风险← 正确答案

答案:ABD。P99 是延迟分布上 99% 分位点,意味着 99% 的请求延迟不超过它,1% 的请求比它慢。P99 一定大于等于 P50,因此 C 错误。它专门用于捕捉平均值掩盖的尾部延迟风险。

Q9. 阶梯加压压测的核心目的是什么?

单选题 · mid

  • A.一次性打满负载测极限
  • B.逐步找到吞吐拐点和瓶颈← 正确答案
  • C.验证模型推理精度
  • D.测试客户端网络延迟

答案:B。阶梯加压从低 QPS 逐渐加档,每档稳定运行几分钟,观察吞吐量是否还能随压力线性增长。当吞吐不再增长而延迟飙升时,就定位到了容量拐点。一次性打满虽然能测极限,却无法精确定位瓶颈发生的临界位置。

Q10. 某 GPU 推理集群动态批处理的批大小过大,导致 P99 延迟超标,合理的缓解措施有哪些?

多选题 · extreme

  • A.降低最大批大小上限← 正确答案
  • B.缩短批处理等待窗口← 正确答案
  • C.继续增大等待窗口
  • D.延迟敏感请求绕过批处理← 正确答案

答案:ABD。批过大导致尾延迟超标,说明“合单”太贪心。降低批大小上限和缩短等待窗口都能减少请求排队时间;让延迟敏感请求绕过批处理直接执行可以保住核心用户体验。继续增大等待窗口只会让延迟更糟,C 错误。