SGLang 性能调优指南
在大语言模型的离线批处理推理场景中,追求极限吞吐量(Throughput)的核心在于获得并维持巨大的有效批处理大小(Effective Batch Size)。SGLang 提供了丰富的参数配置,开发者可根据硬件与工作负载特性进行深度优化。
1. 关键性能指标监控
SGLang 高负载稳定运行时,日志中会输出类似以下内容:
Decode batch. #running-req: 233, #token: 370959, token usage: 0.82, cuda graph: True, gen throughput (token/s): 4594.01, #queue-req: 317其中两个关键指标:
#queue-req:调度队列中等待处理的请求数。token usage:KV Cache 内存利用率,取值范围 0.0–1.0,1.0 表示占满。
其他指标:
#running-req:正在执行的请求数。#token:当前 Batch 生成的总 Token 数。cuda graph:是否启用 CUDA Graph。gen throughput (token/s):平均每秒生成的 Token 数。
2. 队列管理(#queue-req)
#queue-req 反映客户端请求提交速度是否匹配服务器处理能力。
- 若频繁出现
#queue-req: 0,说明请求提交过慢,服务器处于饥饿状态,应适当增加请求数量。 - 理想范围:
。 - 避免过大:队列过长会显著增加调度开销。
3. KV Cache 利用率调优(token usage)
目标是 token usage > 0.9。
3.1 利用率过低
若 token usage < 0.9 且 #queue-req > 0,说明服务器接受新请求过于保守。常见原因是用户请求设置了很大的 max_new_tokens,但提前因 EOS 或停止字符串结束,导致预留 KV Cache 空间浪费。
调优方法:降低 --schedule-conservativeness,例如设置为 0.3。
3.2 利用率过高
若 token usage 极高且频繁出现:
KV cache pool is full. Retract requests. ...说明 KV Cache 池已满,服务器正在收回请求。
调优方法:提高 --schedule-conservativeness,例如设置为 1.3,以更保守地接受新请求。
偶尔出现该警告(如每分钟 1 次)属于正常现象。
4. 显存分配与 KV Cache 容量(--mem-fraction-static)
SGLang 的总显存使用大致分为:
--mem-fraction-static 决定前两项占 GPU 总显存的比例:
为了支持更高并发,应尽可能提高 --mem-fraction-static,同时为激活值与 CUDA Graph 缓冲区保留足够空间。
4.1 调优步骤
- 为激活值预留
GB 显存。 - 在启动日志中查找
available_gpu_mem:
[2025-08-11 17:17:03] ..., available_gpu_mem=13.50 GB- 调整策略:
available_gpu_mem很高(> 10 GB):KV Cache 池分配不足,应增加--mem-fraction-static。available_gpu_mem过低:应降低--mem-fraction-static,防止后续 OOM。
最直接的方法是每次以 --mem-fraction-static,直到工作负载开始出现 OOM。
5. OOM 的避免与解决
| OOM 发生阶段 | 调优参数 | 调整方向 | 影响 |
|---|---|---|---|
| Prefill | --chunked-prefill-size | 降低至 4096 或 2048 | 节省内存,但降低长 Prompt 的 Prefill 速度 |
| Decode | --max-running-requests | 降低 | 限制最大并发数 |
| 通用 OOM | --mem-fraction-static | 降低至 0.8 或 0.7 | 减少 KV Cache 池大小,限制峰值吞吐与并发 |
6. 高级加速与并行策略
6.1 CUDA Graph(--cuda-graph-max-bs)
CUDA Graph 默认仅对小 Batch(如 < 160 或 256)启用。对于某些模型与大规模张量并行,扩大其适用范围可带来性能提升。
- 尝试将
--cuda-graph-max-bs提高至 512 或 768。 - 注意:CUDA Graph 会占用额外显存,可能需要同时降低
--mem-fraction-static。
6.2 数据并行与张量并行(--dp-size、--tp-size)
在 GPU 内存充足的情况下,数据并行(DP)通常比张量并行(TP)带来更高吞吐量。
- 优先使用 DP 提升吞吐。
- 参考 SGLang Router 文档获取更优化的数据并行方案。
6.3 其他优化选项
--enable-torch-compile:对小模型与小 Batch 加速有效。- 量化:尝试
--quantization fp8等 FP8 量化。 - 调度策略:若工作负载存在大量共享前缀,可尝试
--schedule-policy lpm(最长前缀匹配),通过重排请求提高缓存命中率,但会引入额外调度开销。