⚙️ vLLM 架构与压测方法
1. vLLM 核心机制
vLLM 是开源 LLM 推理引擎中采用最广的方案,两个核心机制直接决定压测行为:
1.1 PagedAttention(KV Cache 分页)
传统实现为每个请求预分配"最大上下文"的连续显存,实际平均只用 20-40%,碎片严重。PagedAttention 把 KV Cache 切成固定大小的 block(类比 OS 虚拟内存分页),按需分配:
- 显存利用率显著上升 → 同硬件可支撑更高并发(压测时"并发拐点"后移)
- 支持 Copy-on-Write → beam search / 多候选分支共享前缀
- 代价:间接寻址的访存开销(decode 阶段略增 TPOT,通常 <5%)
1.2 Continuous Batching(连续批处理)
请求级动态调度:batch 内某个请求生成完立即出列、等待队列里的请求立即补入,不用等整批完成。效果:
- 吞吐接近理论上限,GPU 空转时间最小化
- 压测含义:并发数超过
max-num-seqs后请求进等待队列,TTFT 开始跳升——这个拐点就是调度容量,必须测出来
1.3 其他关键特性(压测时逐一开关验证)
| 特性 | 作用 | 测试动作 |
|---|---|---|
| Prefix Caching | 相同前缀(如 system prompt)KV 复用,TTFT 大幅下降 | 同 prompt 批量请求 vs 随机 prompt,对比 TTFT 与命中率指标 |
| Tensor Parallelism | 模型切到多卡,每卡放 1/TP 权重 | TP=1/2/4 三档测吞吐与 TPOT,画通信开销曲线 |
| 投机解码(Speculative) | 小模型草稿+大模型校验,加速 decode | 同吞吐下 TPOT 降幅;注意接受率随领域变化,用业务语料测 |
| 量化加载(FP8/INT4) | 降低显存与访存压力 | 见 量化与精度 章 |
2. 压测关键参数
| 参数 | 作用 | 压测注意 |
|---|---|---|
max-model-len | 最大上下文(输入+输出) | 它决定每请求 KV 上限,设 176K 会显著压低最大并发——容量规划的第一变量,见容量规划 |
max-num-seqs | 调度器同时处理的最大序列数 | 压测拐点探测的核心变量 |
gpu-memory-utilization | 允许 vLLM 占用的显存比例 | 默认 0.9;与 co-located 服务共存时必须下调并留 headroom |
enable-prefix-caching | 前缀缓存开关 | 真实场景(固定 system prompt)应开启测试,报告命中率 |
enforce-eager | 关闭 CUDA Graph | 基线模式 vs 图模式各测一轮,记录 TPOT 差异 |
3. 压测方案模板
- 基线:并发=1,短上下文(1K 输入/500 输出),跑 50 次取 P50/P95——作为所有对比的锚点。
- 并发梯度:1 → 2 → 4 → 8 → 16 → 32 → 64,每档持续 ≥10 分钟或 ≥200 请求,记录 TTFT/TPOT/吞吐/错误率/显存。找两条曲线:TPOT 开始陡升的拐点(decode 饱和)与 TTFT 开始陡升的拐点(排队开始)。
- 混合负载:按真实流量配比(如 70% 短问答 + 20% 长输入 + 10% 长输出),固定 prompt 池与长度分布,防止分布漂移污染结果。
- 长上下文专项:单独测 32K / 128K / 176K 输入的 TTFT 曲线(近似线性验证),以及长上下文与短请求混跑时的相互挤占(短请求 TPOT 恶化多少)。
- 稳定性:在设计并发点的 80% 持续压 ≥30 分钟,观察显存单调增长(泄漏)、延迟漂移、OOM/5xx。
- 极限与恢复:压到 OOM 或错误率 >5%,撤载后验证服务自恢复时间(KV 释放、调度器复位)。
📌 结论写法:容量结论必须绑定五元组「模型+量化+引擎版本+max-model-len+硬件」,任一变化即基线失效、重测。例:"Qwen 27B-FP8 + vLLM x.x + max-model-len=153600 + 双卡 TP=2,SLO(TTFT P95<2s, TPOT P95<80ms) 下 Goodput ≈ N 并发 / M tokens/s"。